Skip to content

Commit 9ccc712

Browse files
committed
feat: enforce call order
1 parent 3a1f348 commit 9ccc712

File tree

2 files changed

+14
-28
lines changed

2 files changed

+14
-28
lines changed

decode.go

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ func (d *Decoder) DecodeHeader() (*EBML, error) {
7676
d.r.MaxIDLength = DefaultMaxIDLength
7777
d.r.MaxSizeLength = DefaultMaxSizeLength
7878
var h EBML
79-
err := d.Decode(&h)
79+
err := d.Decode(el, &h)
8080
if err != nil {
8181
return nil, err
8282
}
@@ -109,41 +109,29 @@ func (d *Decoder) DecodeBody(v interface{}) error {
109109
}
110110
continue
111111
case d.def.Root.ID:
112-
return d.Decode(v)
112+
return d.Decode(el, v)
113113
}
114114
}
115115
}
116116

117117
func (d *Decoder) SkipByte() error {
118118
_, err := io.CopyN(io.Discard, d.r, 1)
119-
d.delay = false
120119
d.el = nil
121120
return err
122121
}
123122

124-
func (d *Decoder) Skip() error {
125-
if d.el == nil {
126-
return fmt.Errorf("ebml: missing decoded element (forgotten call Next?)")
127-
}
128-
_, err := io.CopyN(io.Discard, d.r, d.el.DataSize)
129-
d.delay = false
130-
d.el = nil
123+
func (d *Decoder) Skip(el Element) error {
124+
_, err := io.CopyN(io.Discard, d.r, el.DataSize)
131125
return err
132126
}
133127

134-
func (d *Decoder) Decode(v interface{}) error {
128+
func (d *Decoder) Decode(el Element, v interface{}) error {
135129
val := reflect.ValueOf(v)
136130
if val.Kind() != reflect.Ptr || val.IsNil() {
137131
return &InvalidDecodeError{reflect.TypeOf(v)}
138132
}
139-
if d.el == nil {
140-
return fmt.Errorf("ebml: missing decoded element (forgotten call Next?)")
141-
}
142133
d.skippedErrs = nil
143-
err := d.decodeSingle(*d.el, val.Elem())
144-
if !d.delay {
145-
d.el = nil
146-
}
134+
err := d.decodeSingle(el, val.Elem())
147135
if d.skippedErrs != nil {
148136
err = errors.Join(err, d.skippedErrs)
149137
}

ebml.go

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -167,9 +167,8 @@ type Decoder struct {
167167
r *ebmltext.Decoder
168168
def *Def
169169

170-
el *Element
171-
delay bool
172-
n int
170+
el *Element
171+
n int
173172
// skippedErrs signals to return errors at the end of Decode.
174173
skippedErrs error
175174

@@ -211,7 +210,6 @@ func (d *Decoder) Next() (el Element, n int, err error) {
211210
return Element{}, n, err
212211
}
213212
n += d.r.Release()
214-
d.el = &el
215213
d.n = n
216214
sch, ok := d.def.Get(el.ID)
217215
if !ok {
@@ -239,20 +237,21 @@ func (d *Decoder) NextOf(parent Element, offset int64) (el Element, n int, err e
239237
if end := d.EndOfKnownDataSize(parent, offset); end {
240238
return Element{}, 0, io.EOF
241239
}
242-
if !d.delay {
240+
if d.el != nil {
241+
el = *d.el
242+
d.el = nil
243+
} else {
243244
el, n, err = d.Next()
244245
if err != nil {
245246
return Element{}, n, err
246247
}
247-
} else {
248-
d.delay = false
249248
}
250-
el = *d.el
251249
if parent.DataSize != -1 && offset+el.DataSize > parent.DataSize {
252250
err = ErrElementOverflow
253251
}
254252
if end := d.EndOfUnknownDataSize(parent, el); end {
255-
d.delay = true
253+
tmp := el // This is unexpected. I cannot use the pointer to the return parameter variable.
254+
d.el = &tmp
256255
return Element{}, 0, io.EOF
257256
}
258257
return el, n, err
@@ -274,7 +273,6 @@ type DecodeSeeker struct {
274273
func (s DecodeSeeker) Seek(offset int64, whence int) (ret int64, err error) {
275274
d, ss := s.d, s.ss
276275
if offset != 0 && whence != io.SeekCurrent {
277-
d.delay = false
278276
d.el = nil
279277
}
280278
return ss.Seek(offset, whence)

0 commit comments

Comments
 (0)