diff --git a/generate/generate.go b/generate/generate.go index 2125ed5..ae66258 100644 --- a/generate/generate.go +++ b/generate/generate.go @@ -428,80 +428,72 @@ func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource stri case TypeString, TypeBuffer: // SBA: * // LBA: * - nn, err := this.iprintf("{\n") - this.push() + lengthVar := this.newTemporaryVar("length") + nn, err := this.iprintf("var %s uint64\n", lengthVar) n += nn; if err != nil { return n, err } - nn, err = this.iprintf("var length uint64\n") - n += nn; if err != nil { return n, err } - nn, err = this.iprintf("if %s.Is(tape.LBA) {\n", tagSource) - n += nn; if err != nil { return n, err } - this.push() - nn, err = this.iprintf( - "length, nn, err = decoder.ReadUintN(int(%s.CN()))\n", - tagSource) - n += nn; if err != nil { return n, err } - nn, err = this.generateErrorCheck() - n += nn; if err != nil { return n, err } - this.pop() - nn, err = this.iprintf("} else {\n") - n += nn; if err != nil { return n, err } - this.push() - nn, err = this.iprintf("length = uint64(%s.CN())\n", tagSource) - n += nn; if err != nil { return n, err } - this.pop() - nn, err = this.iprintf("}\n") - n += nn; if err != nil { return n, err } - nn, err = this.iprintf("buffer := make([]byte, int(length))\n") - n += nn; if err != nil { return n, err } - nn, err = this.iprintf("nn, err = decoder.Read(buffer)\n") + nn, err = this.iprintf("if %s.Is(tape.LBA) {\n", tagSource) + n += nn; if err != nil { return n, err } + this.push() + nn, err = this.iprintf( + "%s, nn, err = decoder.ReadUintN(int(%s.CN()))\n", + lengthVar, tagSource) 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 } - } else { - nn, err = this.iprintf("*%s = buffer\n", valueSource) - n += nn; if err != nil { return n, err } - } + this.pop() + nn, err = this.iprintf("} else {\n") + n += nn; if err != nil { return n, err } + this.push() + nn, err = this.iprintf( + "%s = uint64(%s.CN())\n", + lengthVar, tagSource) + n += nn; if err != nil { return n, err } this.pop() nn, err = this.iprintf("}\n") n += nn; if err != nil { return n, err } + nn, err = this.iprintf("buffer := make([]byte, int(%s))\n", lengthVar) + n += nn; if err != nil { return n, err } + nn, err = this.iprintf("nn, err = decoder.Read(buffer)\n") + 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 } + } else { + nn, err = this.iprintf("*%s = buffer\n", valueSource) + n += nn; if err != nil { return n, err } + } case TypeArray: // OTA: * - nn, err := this.iprintf("{\n") - this.push() + lengthVar := this.newTemporaryVar("length") + nn, err := this.iprintf("var %s uint64\n", lengthVar) n += nn; if err != nil { return n, err } - nn, err = this.iprintf("var length uint64\n") - n += nn; if err != nil { return n, err } - nn, err = this.iprintf( - "length, nn, err = decoder.ReadUintN(int(%s.CN()))\n", - tagSource) - n += nn; if err != nil { return n, err } - nn, err = this.generateErrorCheck() - n += nn; if err != nil { return n, err } - nn, err = this.iprintf("*%s = make(", valueSource) - n += nn; if err != nil { return n, err } - nn, err = this.generateType(typ) - n += nn; if err != nil { return n, err } - nn, err = this.printf(", int(length))\n") - n += nn; if err != nil { return n, err } - nn, err = this.iprintf("var itemTag tape.Tag\n") - n += nn; if err != nil { return n, err } - nn, err = this.iprintf("itemTag, nn, err = decoder.ReadTag()\n") - n += nn; if err != nil { return n, err } - nn, err = this.generateErrorCheck() - n += nn; if err != nil { return n, err } - nn, err = this.iprintf("for index := range length {\n") - n += nn; if err != nil { return n, err } - this.push() - nn, err = this.generateDecodeValue( - typ.Element, - fmt.Sprintf("(&(*%s)[index])", valueSource), - "itemTag") - n += nn; if err != nil { return n, err } - this.pop() - nn, err = this.iprintf("}\n") + nn, err = this.iprintf( + "%s, nn, err = decoder.ReadUintN(int(%s.CN()))\n", + lengthVar, tagSource) + n += nn; if err != nil { return n, err } + nn, err = this.generateErrorCheck() + n += nn; if err != nil { return n, err } + nn, err = this.iprintf("*%s = make(", valueSource) + n += nn; if err != nil { return n, err } + nn, err = this.generateType(typ) + n += nn; if err != nil { return n, err } + nn, err = this.printf(", int(%s))\n", lengthVar) + n += nn; if err != nil { return n, err } + nn, err = this.iprintf("var itemTag tape.Tag\n") + n += nn; if err != nil { return n, err } + nn, err = this.iprintf("itemTag, nn, err = decoder.ReadTag()\n") + n += nn; if err != nil { return n, err } + nn, err = this.generateErrorCheck() + n += nn; if err != nil { return n, err } + nn, err = this.iprintf("for index := range %s {\n", lengthVar) + n += nn; if err != nil { return n, err } + this.push() + nn, err = this.generateDecodeValue( + typ.Element, + fmt.Sprintf("(&(*%s)[index])", valueSource), + "itemTag") n += nn; if err != nil { return n, err } this.pop() nn, err = this.iprintf("}\n")