Skip to content

Commit f3a707d

Browse files
committed
Do no decode ctrl byte unnecessarily in deserializer path
1 parent 55ce382 commit f3a707d

File tree

2 files changed

+14
-11
lines changed

2 files changed

+14
-11
lines changed

decoder.go

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -56,22 +56,25 @@ func (d *decoder) decode(offset uint, result reflect.Value, depth int) (uint, er
5656
return d.decodeFromType(typeNum, size, newOffset, result, depth+1)
5757
}
5858

59-
func (d *decoder) decodeToDeserializer(offset uint, dser deserializer, depth int) (uint, error) {
59+
func (d *decoder) decodeToDeserializer(offset uint, dser deserializer, depth int, getNext bool) (uint, error) {
6060
if depth > maximumDataStructureDepth {
6161
return 0, newInvalidDatabaseError("exceeded maximum data structure depth; database is likely corrupt")
6262
}
63-
typeNum, size, newOffset, err := d.decodeCtrlData(offset)
63+
skip, err := dser.ShouldSkip(uintptr(offset))
6464
if err != nil {
6565
return 0, err
6666
}
67+
if skip {
68+
if getNext {
69+
return d.nextValueOffset(offset, 1)
70+
}
71+
return 0, nil
72+
}
6773

68-
skip, err := dser.ShouldSkip(uintptr(offset))
74+
typeNum, size, newOffset, err := d.decodeCtrlData(offset)
6975
if err != nil {
7076
return 0, err
7177
}
72-
if skip {
73-
return d.nextValueOffset(offset, 1)
74-
}
7578

7679
return d.decodeFromTypeToDeserializer(typeNum, size, newOffset, dser, depth+1)
7780
}
@@ -196,7 +199,7 @@ func (d *decoder) decodeFromTypeToDeserializer(
196199
if err != nil {
197200
return 0, err
198201
}
199-
_, err = d.decodeToDeserializer(pointer, dser, depth)
202+
_, err = d.decodeToDeserializer(pointer, dser, depth, false)
200203
return newOffset, err
201204
case _Slice:
202205
return d.decodeSliceToDeserializer(size, offset, dser, depth)
@@ -581,12 +584,12 @@ func (d *decoder) decodeMapToDeserializer(
581584
}
582585
for i := uint(0); i < size; i++ {
583586
// TODO - implement key/value skipping?
584-
offset, err = d.decodeToDeserializer(offset, dser, depth)
587+
offset, err = d.decodeToDeserializer(offset, dser, depth, true)
585588
if err != nil {
586589
return 0, err
587590
}
588591

589-
offset, err = d.decodeToDeserializer(offset, dser, depth)
592+
offset, err = d.decodeToDeserializer(offset, dser, depth, true)
590593
if err != nil {
591594
return 0, err
592595
}
@@ -661,7 +664,7 @@ func (d *decoder) decodeSliceToDeserializer(
661664
return 0, err
662665
}
663666
for i := uint(0); i < size; i++ {
664-
offset, err = d.decodeToDeserializer(offset, dser, depth)
667+
offset, err = d.decodeToDeserializer(offset, dser, depth, true)
665668
if err != nil {
666669
return 0, err
667670
}

reader.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ func (r *Reader) decode(offset uintptr, result interface{}) error {
228228
}
229229

230230
if dser, ok := result.(deserializer); ok {
231-
_, err := r.decoder.decodeToDeserializer(uint(offset), dser, 0)
231+
_, err := r.decoder.decodeToDeserializer(uint(offset), dser, 0, false)
232232
return err
233233
}
234234

0 commit comments

Comments
 (0)