|
|
|
@ -485,50 +485,7 @@ func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource, abo
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case TypeArray:
|
|
|
|
case TypeArray:
|
|
|
|
// OTA: <length: UN> <elementTag: tape.Tag> <values>*
|
|
|
|
// OTA: <length: UN> <elementTag: tape.Tag> <values>*
|
|
|
|
lengthVar := this.newTemporaryVar("length")
|
|
|
|
// TODO: branch
|
|
|
|
nn, err := this.iprintf("var %s uint64\n", lengthVar)
|
|
|
|
|
|
|
|
n += nn; if err != nil { return n, err }
|
|
|
|
|
|
|
|
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("if !itemTag.Is(")
|
|
|
|
|
|
|
|
n += nn; if err != nil { return n, err }
|
|
|
|
|
|
|
|
nn, err = this.generateTN(typ.Element)
|
|
|
|
|
|
|
|
n += nn; if err != nil { return n, err }
|
|
|
|
|
|
|
|
nn, err = this.iprintf(") {\n")
|
|
|
|
|
|
|
|
n += nn; if err != nil { return n, err }
|
|
|
|
|
|
|
|
this.push()
|
|
|
|
|
|
|
|
nn, err = this.iprintf("%s\n", abort)
|
|
|
|
|
|
|
|
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("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", abort)
|
|
|
|
|
|
|
|
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(
|
|
|