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,17 +428,15 @@ func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource stri
case TypeString, TypeBuffer: case TypeString, TypeBuffer:
// SBA: <data: U8>* // SBA: <data: U8>*
// LBA: <length: UN> <data: U8>* // LBA: <length: UN> <data: U8>*
nn, err := this.iprintf("{\n") lengthVar := this.newTemporaryVar("length")
this.push() 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 } n += nn; if err != nil { return n, err }
nn, err = this.iprintf("if %s.Is(tape.LBA) {\n", tagSource) nn, err = this.iprintf("if %s.Is(tape.LBA) {\n", tagSource)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
this.push() this.push()
nn, err = this.iprintf( nn, err = this.iprintf(
"length, nn, err = decoder.ReadUintN(int(%s.CN()))\n", "%s, nn, err = decoder.ReadUintN(int(%s.CN()))\n",
tagSource) lengthVar, tagSource)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
nn, err = this.generateErrorCheck() nn, err = this.generateErrorCheck()
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
@ -446,12 +444,14 @@ func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource stri
nn, err = this.iprintf("} else {\n") nn, err = this.iprintf("} else {\n")
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
this.push() this.push()
nn, err = this.iprintf("length = uint64(%s.CN())\n", tagSource) nn, err = this.iprintf(
"%s = uint64(%s.CN())\n",
lengthVar, tagSource)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
this.pop() this.pop()
nn, err = this.iprintf("}\n") nn, err = this.iprintf("}\n")
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
nn, err = this.iprintf("buffer := make([]byte, int(length))\n") nn, err = this.iprintf("buffer := make([]byte, int(%s))\n", lengthVar)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
nn, err = this.iprintf("nn, err = decoder.Read(buffer)\n") nn, err = this.iprintf("nn, err = decoder.Read(buffer)\n")
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
@ -464,19 +464,14 @@ func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource stri
nn, err = this.iprintf("*%s = buffer\n", valueSource) nn, err = this.iprintf("*%s = buffer\n", valueSource)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
} }
this.pop()
nn, err = this.iprintf("}\n")
n += nn; if err != nil { return n, err }
case TypeArray: case TypeArray:
// OTA: <length: UN> <elementTag: tape.Tag> <values>* // OTA: <length: UN> <elementTag: tape.Tag> <values>*
nn, err := this.iprintf("{\n") lengthVar := this.newTemporaryVar("length")
this.push() 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 } n += nn; if err != nil { return n, err }
nn, err = this.iprintf( nn, err = this.iprintf(
"length, nn, err = decoder.ReadUintN(int(%s.CN()))\n", "%s, nn, err = decoder.ReadUintN(int(%s.CN()))\n",
tagSource) lengthVar, tagSource)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
nn, err = this.generateErrorCheck() nn, err = this.generateErrorCheck()
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
@ -484,7 +479,7 @@ func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource stri
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
nn, err = this.generateType(typ) nn, err = this.generateType(typ)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
nn, err = this.printf(", int(length))\n") nn, err = this.printf(", int(%s))\n", lengthVar)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
nn, err = this.iprintf("var itemTag tape.Tag\n") nn, err = this.iprintf("var itemTag tape.Tag\n")
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
@ -492,7 +487,7 @@ func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource stri
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
nn, err = this.generateErrorCheck() nn, err = this.generateErrorCheck()
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
nn, err = this.iprintf("for index := range length {\n") nn, err = this.iprintf("for index := range %s {\n", lengthVar)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
this.push() this.push()
nn, err = this.generateDecodeValue( nn, err = this.generateDecodeValue(
@ -503,9 +498,6 @@ func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource stri
this.pop() this.pop()
nn, err = this.iprintf("}\n") nn, err = this.iprintf("}\n")
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
this.pop()
nn, err = this.iprintf("}\n")
n += nn; if err != nil { return n, err }
case TypeTable: case TypeTable:
// KTV: <length: UN> (<key: U16> <tag: Tag> <value>)* // KTV: <length: UN> (<key: U16> <tag: Tag> <value>)*
nn, err := this.iprintf( nn, err := this.iprintf(