message-size-increase #3

Open
sashakoshka wants to merge 209 commits from message-size-increase into main
Showing only changes of commit f222fb02b7 - Show all commits

View File

@ -146,7 +146,7 @@ func (this *Generator) generateTypedef(name string, typ Type) (n int, err error)
this.push() this.push()
nn, err = this.iprintf("var nn int\n") nn, err = this.iprintf("var nn int\n")
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
nn, err = this.generateDecodeValue(typ, "this", "tag") nn, err = this.generateDecodeValue(typ, "this", "tag", "return n, nil")
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
nn, err = this.iprintf("return n, nil\n") nn, err = this.iprintf("return n, nil\n")
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
@ -217,7 +217,20 @@ func (this *Generator) generateMessage(method uint16, message Message) (n int, e
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.generateDecodeValue(message.Type, "this", "tag") abort := "return n, nil"
nn, err = this.iprintf("if !tag.Is(")
n += nn; if err != nil { return n, err }
nn, err = this.generateTN(message.Type)
n += nn; if err != nil { return n, err }
nn, err = this.printf(") {\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.generateDecodeValue(message.Type, "this", "tag", abort)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
nn, err = this.iprintf("return n, nil\n") nn, err = this.iprintf("return n, nil\n")
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
@ -406,7 +419,7 @@ func (this *Generator) generateEncodeValue(typ Type, valueSource, tagSource stri
// - n int // - n int
// - err error // - err error
// - nn int // - nn int
func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource string) (n int, err error) { func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource, abort string) (n int, err error) {
switch typ := typ.(type) { switch typ := typ.(type) {
case TypeInt: case TypeInt:
// SI: (none) // SI: (none)
@ -493,13 +506,25 @@ 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("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) 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(
typ.Element, typ.Element,
fmt.Sprintf("(&(*%s)[index])", valueSource), fmt.Sprintf("(&(*%s)[index])", valueSource),
"itemTag") "itemTag", abort)
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")
@ -546,11 +571,33 @@ func (this *Generator) generateDecodeValue(typ Type, valueSource, tagSource stri
field := typ.Fields[key] field := typ.Fields[key]
nn, err = this.iprintf("case 0x%04X:\n", key) nn, err = this.iprintf("case 0x%04X:\n", key)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
this.push()
labelVar := this.newTemporaryVar("label")
fieldAbort := fmt.Sprintf("goto %s", labelVar)
nn, err = this.iprintf("if !itemTag.Is(")
n += nn; if err != nil { return n, err }
nn, err = this.generateTN(field.Type)
n += nn; if err != nil { return n, err }
nn, err = this.printf(") {\n")
n += nn; if err != nil { return n, err }
this.push()
nn, err = this.iprintf("%s\n", fieldAbort)
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("{\n")
n += nn; if err != nil { return n, err }
this.push() this.push()
nn, err = this.generateDecodeValue( nn, err = this.generateDecodeValue(
field.Type, field.Type,
fmt.Sprintf("(&%s.%s)", valueSource, field.Name), fmt.Sprintf("(&%s.%s)", valueSource, field.Name),
"itemTag") "itemTag", fieldAbort)
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("%s:;\n", labelVar)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
this.pop() this.pop()
} }