diff --git a/t/neo/marshal.go b/t/neo/marshal.go index 61ff89ae5b5af8cceb368ff2874cdaa10c981242..6441c0998d16de1f820c6a91db263903bbe12698 100644 --- a/t/neo/marshal.go +++ b/t/neo/marshal.go @@ -400,6 +400,7 @@ overflow: // 9. AcceptIdentification func (p *AcceptIdentification) NEOEncodedLen() int { + var size int size += 30 for i := 0; i < len(p.KnownMasterList); i++ { a := &p.KnownMasterList[i] @@ -721,6 +722,7 @@ overflow: // 19. AnswerPartitionTable func (p *AnswerPartitionTable) NEOEncodedLen() int { + var size int size += 12 for i := 0; i < len(p.RowList); i++ { a := &p.RowList[i] @@ -810,6 +812,7 @@ overflow: // 20. NotifyPartitionTable func (p *NotifyPartitionTable) NEOEncodedLen() int { + var size int size += 12 for i := 0; i < len(p.RowList); i++ { a := &p.RowList[i] @@ -1092,8 +1095,7 @@ overflow: // 27. AnswerLockedTransactions func (p *AnswerLockedTransactions) NEOEncodedLen() int { - size += 4 + len(p.TidDict)*16 - return 0 + return 4 + len(p.TidDict)*16 } func (p *AnswerLockedTransactions) NEOEncode(data []byte) { @@ -2594,6 +2596,7 @@ overflow: // 58. AnswerPartitionList func (p *AnswerPartitionList) NEOEncodedLen() int { + var size int size += 12 for i := 0; i < len(p.RowList); i++ { a := &p.RowList[i] @@ -2706,6 +2709,7 @@ overflow: // 60. AnswerNodeList func (p *AnswerNodeList) NEOEncodedLen() int { + var size int size += 4 for i := 0; i < len(p.NodeList); i++ { a := &p.NodeList[i] @@ -2917,6 +2921,7 @@ overflow: // 64. NotifyNodeInformation func (p *NotifyNodeInformation) NEOEncodedLen() int { + var size int size += 4 for i := 0; i < len(p.NodeList); i++ { a := &p.NodeList[i] @@ -3156,8 +3161,7 @@ overflow: // 70. AnswerObjectUndoSerial func (p *AnswerObjectUndoSerial) NEOEncodedLen() int { - size += 4 + len(p.ObjectTIDDict)*25 - return 0 + return 4 + len(p.ObjectTIDDict)*25 } func (p *AnswerObjectUndoSerial) NEOEncode(data []byte) { @@ -3400,8 +3404,7 @@ overflow: // 77. CheckReplicas func (p *CheckReplicas) NEOEncodedLen() int { - size += 4 + len(p.PartitionDict)*8 - return 16 + return 20 + len(p.PartitionDict)*8 } func (p *CheckReplicas) NEOEncode(data []byte) { diff --git a/t/neo/protogen.go b/t/neo/protogen.go index 199c7e446403f0e0865e00cef889a89a86a95a08..1c6e64b8c86467ef43bb7b40fb7522c541b16e4d 100644 --- a/t/neo/protogen.go +++ b/t/neo/protogen.go @@ -232,6 +232,9 @@ type sizer struct { n int symLenv []string // symbolic lengths to add to size varSizeUsed bool // whether var size was used + + recvName string // receiver/type for top-level func + typeName string // or empty } type encoder struct { @@ -249,7 +252,26 @@ var _ CodecCodeGen = (*encoder)(nil) var _ CodecCodeGen = (*decoder)(nil) func (s *sizer) generatedCode() string { - return s.String() // XXX -> d.buf.String() ? + prologue := Buffer{} + if s.recvName != "" { + prologue.emit("func (%s *%s) NEOEncodedLen() int {", s.recvName, s.typeName) + } + if s.varSizeUsed { + prologue.emit("var size int") + } + + epilogue := Buffer{} + size := fmt.Sprintf("%v", s.n) + if len(s.symLenv) > 0 { + size += " + " + strings.Join(s.symLenv, " + ") + } + if s.varSizeUsed { + size += " + size" + } + epilogue.emit("return %v", size) + epilogue.emit("}\n") + + return prologue.String() + s.String() + epilogue.String() // XXX -> d.buf.String() ? } func (e *encoder) generatedCode() string { @@ -261,10 +283,9 @@ func (d *decoder) generatedCode() string { } func (s *sizer) genPrologue(recvName, typeName string) { - s.emit("func (%s *%s) NEOEncodedLen() int {", recvName, typeName) - if s.varSizeUsed { - s.emit("var size int") - } + s.recvName = recvName + s.typeName = typeName + //s.emit("func (%s *%s) NEOEncodedLen() int {", recvName, typeName) } func (e *encoder) genPrologue(recvName, typeName string) { @@ -277,6 +298,7 @@ func (d *decoder) genPrologue(recvName, typeName string) { } func (s *sizer) genEpilogue() { +/* size := fmt.Sprintf("%v", s.n) if len(s.symLenv) > 0 { size += " + " + strings.Join(s.symLenv, " + ") @@ -286,6 +308,7 @@ func (s *sizer) genEpilogue() { } s.emit("return %v", size) s.emit("}\n") +*/ } func (e *encoder) genEpilogue() { @@ -442,10 +465,12 @@ func (s *sizer) genMap(path string, typ *types.Map, obj types.Object) { elemSize, elemFixed := typeSizeFixed(typ.Elem()) if keyFixed && elemFixed { - s.emit("size += 4 + len(%v) * %v", path, keySize + elemSize) + s.n += 4 + s.symLenv = append(s.symLenv, fmt.Sprintf("len(%v) * %v", path, keySize + elemSize)) return } + s.varSizeUsed = true s.emit("size += %v + 4", s.n) s.n = 0 s.emit("for key := range %s {", path)