tape: Fix size decoding math

This commit is contained in:
Sasha Koshka 2025-06-27 17:04:20 -04:00
parent aa718cfe9f
commit 2a4e88d949

View File

@ -68,9 +68,11 @@ func DecodeAny(decoder *Decoder, destination any, tag Tag) (n int, err error) {
func decodeAny(decoder *Decoder, destination reflect.Value, tag Tag) (n int, err error) {
errWrongDestinationType := func(expected string) error {
// panic(fmt.Errorf(
return fmt.Errorf(
"expected &%s destination, not %v",
"expected %s destination, not %v",
expected, destination)
//)
}
if destination.Kind() != reflect.Pointer {
@ -84,11 +86,11 @@ func decodeAny(decoder *Decoder, destination reflect.Value, tag Tag) (n int, err
if err != nil { return n, err }
case LI:
// LI: <value: IntN>
nn, err := decodeAndSetIntPtr(decoder, destination, tag.CN() - 1)
nn, err := decodeAndSetIntPtr(decoder, destination, tag.CN() + 1)
n += nn; if err != nil { return n, err }
case FP:
// FP: <value: FloatN>
nn, err := decodeAndSetFloatPtr(decoder, destination, tag.CN() - 1)
nn, err := decodeAndSetFloatPtr(decoder, destination, tag.CN() + 1)
n += nn; if err != nil { return n, err }
case SBA:
// SBA: <data: U8>*
@ -102,7 +104,7 @@ func decodeAny(decoder *Decoder, destination reflect.Value, tag Tag) (n int, err
// LBA: <length: UN> <data: U8>*
destination, err := asByteArrayPtr(destination)
if err != nil { return n, err }
length, nn, err := decoder.ReadUintN(tag.CN() - 1)
length, nn, err := decoder.ReadUintN(tag.CN() + 1)
n += nn; if err != nil { return n, err }
buffer := make([]byte, length)
nn, err = decoder.Read(buffer)
@ -110,7 +112,7 @@ func decodeAny(decoder *Decoder, destination reflect.Value, tag Tag) (n int, err
*destination = buffer
case OTA:
// OTA: <length: UN> <elementTag: tape.Tag> <values>*
length, nn, err := decoder.ReadUintN(tag.CN() - 1)
length, nn, err := decoder.ReadUintN(tag.CN() + 1)
n += nn; if err != nil { return n, err }
oneTag, nn, err := decoder.ReadTag()
n += nn; if err != nil { return n, err }
@ -142,7 +144,7 @@ func decodeAny(decoder *Decoder, destination reflect.Value, tag Tag) (n int, err
if table.Type() != reflect.TypeOf(dummyMap) {
return n, errWrongDestinationType("map[uint16] any")
}
length, nn, err := decoder.ReadUintN(tag.CN() - 1)
length, nn, err := decoder.ReadUintN(tag.CN() + 1)
n += nn; if err != nil { return n, err }
table.Clear()
for _ = range length {
@ -152,7 +154,7 @@ func decodeAny(decoder *Decoder, destination reflect.Value, tag Tag) (n int, err
n += nn; if err != nil { return n, err }
value, err := skeletonValue(itemTag)
if err != nil { return n, err }
nn, err = decodeAny(decoder, value.Elem(), itemTag)
nn, err = decodeAny(decoder, value, itemTag)
n += nn; if err != nil { return n, err }
table.SetMapIndex(reflect.ValueOf(key), value)
}