From 77bfc45fea61e36c90699257fc8e6fdf48f26add Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Wed, 27 Aug 2025 14:55:10 -0400 Subject: [PATCH] generate: Cast strings and buffers when decoding --- generate/generate.go | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/generate/generate.go b/generate/generate.go index b3c36d7..a57bad1 100644 --- a/generate/generate.go +++ b/generate/generate.go @@ -513,6 +513,8 @@ func (this *Generator) generateDecodeValue(typ Type, typeName, valueSource, tagS n += nn; if err != nil { return n, err } nn, err = this.iprintf("%s, nn, err = decoder.%s%d()\n", destinationVar, prefix, typ.Bits) n += nn; if err != nil { return n, err } + nn, err = this.generateErrorCheck() + n += nn; if err != nil { return n, err } if typeName == "" { nn, err := this.iprintf("*%s = %s\n", valueSource, destinationVar) n += nn; if err != nil { return n, err } @@ -520,14 +522,22 @@ func (this *Generator) generateDecodeValue(typ Type, typeName, valueSource, tagS nn, err := this.iprintf("*%s = %s(%s)\n", valueSource, typeName, destinationVar) n += nn; if err != nil { return n, err } } - nn, err = this.generateErrorCheck() - n += nn; if err != nil { return n, err } case TypeFloat: // FP: - nn, err := this.iprintf("*%s, nn, err = decoder.ReadFloat%d()\n", valueSource, typ.Bits) + destinationVar := this.newTemporaryVar("destination") + nn, err := this.iprintf("var %s ", destinationVar) + n += nn; if err != nil { return n, err } + nn, err = this.iprintf("%s, nn, err = decoder.ReadFloat%d()\n", destinationVar, typ.Bits) n += nn; if err != nil { return n, err } nn, err = this.generateErrorCheck() n += nn; if err != nil { return n, err } + if typeName == "" { + nn, err := this.iprintf("*%s = %s\n", valueSource, destinationVar) + n += nn; if err != nil { return n, err } + } else { + nn, err := this.iprintf("*%s = %s(%s)\n", valueSource, typeName, destinationVar) + n += nn; if err != nil { return n, err } + } case TypeString, TypeBuffer: // SBA: * // LBA: * @@ -560,11 +570,16 @@ func (this *Generator) generateDecodeValue(typ Type, typeName, valueSource, tagS n += nn; if err != nil { return n, err } nn, err = this.generateErrorCheck() n += nn; if err != nil { return n, err } - if _, ok := typ.(TypeString); ok { - nn, err = this.iprintf("*%s = string(buffer)\n", valueSource) - n += nn; if err != nil { return n, err } + if typeName == "" { + if _, ok := typ.(TypeString); ok { + nn, err = this.iprintf("*%s = string(buffer)\n", valueSource) + n += nn; if err != nil { return n, err } + } else { + nn, err = this.iprintf("*%s = buffer\n", valueSource) + n += nn; if err != nil { return n, err } + } } else { - nn, err = this.iprintf("*%s = buffer\n", valueSource) + nn, err = this.iprintf("*%s = %s(buffer)\n", valueSource, typeName) n += nn; if err != nil { return n, err } } case TypeArray: @@ -876,10 +891,10 @@ func (this *Generator) generateTag(typ Type, source string) (n int, err error) { nn, err := this.printf("tape.FP.WithCN(%d)", bitsToCN(typ.Bits)) n += nn; if err != nil { return n, err } case TypeString: - nn, err := this.printf("tape.StringTag(%s)", source) + nn, err := this.printf("tape.StringTag(string(%s))", source) n += nn; if err != nil { return n, err } case TypeBuffer: - nn, err := this.printf("tape.BufferTag(%s)", source) + nn, err := this.printf("tape.BufferTag([]byte(%s))", source) n += nn; if err != nil { return n, err } case TypeArray: nn, err := this.printf("tape.OTA.WithCN(tape.IntBytes(uint64(len(%s))))", source)