generate: Use newTemporarVar in more places

This commit is contained in:
Sasha Koshka 2025-07-17 11:28:53 -04:00
parent b50a199842
commit f646207ab1

View File

@ -428,80 +428,72 @@ func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource stri
case TypeString, TypeBuffer:
// SBA: <data: U8>*
// LBA: <length: UN> <data: U8>*
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: <length: UN> <elementTag: tape.Tag> <values>*
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")