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