diff --git a/cmd/bencgen/codegens/golang-gen.go b/cmd/bencgen/codegens/golang-gen.go index bd2e8a3..7088701 100644 --- a/cmd/bencgen/codegens/golang-gen.go +++ b/cmd/bencgen/codegens/golang-gen.go @@ -385,6 +385,13 @@ func (g *GoGen) getSizeFunc() string { } } +func makeExternalStructureUpperOrNot(externalStructure string) string { + if strings.Contains(externalStructure, ".") { + return externalStructure + } + return utils.ToUpper(externalStructure) +} + func (g *GoGen) getElemSizeFunc(t *parser.Type) string { switch { case t.IsArray: @@ -399,7 +406,7 @@ func (g *GoGen) getElemSizeFunc(t *parser.Type) string { } return fmt.Sprintf("func (s %s) int { return s.SizePlain() }", - utils.ToUpper(t.ExternalStructure)) + makeExternalStructureUpperOrNot(t.ExternalStructure)) default: return "bstd.Size" + t.TokenType.String() } @@ -497,7 +504,7 @@ func (g *GoGen) getElemMarshalFunc(t *parser.Type) string { } return fmt.Sprintf("func (n int, b []byte, s %s) int { return s.MarshalPlain(n, b) }", - utils.ToUpper(t.ExternalStructure)) + makeExternalStructureUpperOrNot(t.ExternalStructure)) default: return "bstd.Marshal" + t.AppendUnsafeIfPresent() + t.TokenType.String() } @@ -601,7 +608,7 @@ func (g *GoGen) getElemUnmarshalFunc(t *parser.Type) string { return "bgenimpl.UnmarshalEnum" } return fmt.Sprintf("func (n int, b []byte, s *%s) (int, error) { return s.UnmarshalPlain(n, b) }", - utils.ToUpper(t.ExternalStructure)) + makeExternalStructureUpperOrNot(t.ExternalStructure)) default: return "bstd.Unmarshal" + t.AppendUnsafeIfPresent() + t.TokenType.String() } diff --git a/go.mod b/go.mod index 5e911f9..703bbf5 100644 --- a/go.mod +++ b/go.mod @@ -2,6 +2,7 @@ retract ( v1.1.0 // Undefined behavior vulnerability v1.1.1 // Broken varint skip v1.1.2 // Undefined Uint methods after code generation + v1.1.5 // Broken code generation with slices and maps using imported benc schemas ) module github.com/deneonet/benc diff --git a/testing/others/others.go b/testing/others/others.go index 23c1f6f..ecbb0b0 100644 --- a/testing/others/others.go +++ b/testing/others/others.go @@ -37,7 +37,7 @@ type OthersTest struct { ExampleEnum ExampleEnum ExampleEnum2 ExampleEnum2 Person person.Person - Person2 person.Person2 + Person2 [][][]person.Person2 } // Reserved Ids - OthersTest @@ -59,7 +59,7 @@ func (othersTest *OthersTest) NestedSize(id uint16) (s int) { s += bgenimpl.SizeEnum(othersTest.ExampleEnum) + 2 s += bgenimpl.SizeEnum(othersTest.ExampleEnum2) + 2 s += othersTest.Person.NestedSize(9) - s += othersTest.Person2.NestedSize(10) + s += bstd.SizeSlice(othersTest.Person2, func (s [][]person.Person2) int { return bstd.SizeSlice(s, func (s []person.Person2) int { return bstd.SizeSlice(s, func (s person.Person2) int { return s.SizePlain() }) }) }) + 2 if id > 255 { s += 5 @@ -80,7 +80,7 @@ func (othersTest *OthersTest) SizePlain() (s int) { s += bgenimpl.SizeEnum(othersTest.ExampleEnum) s += bgenimpl.SizeEnum(othersTest.ExampleEnum2) s += othersTest.Person.SizePlain() - s += othersTest.Person2.SizePlain() + s += bstd.SizeSlice(othersTest.Person2, func (s [][]person.Person2) int { return bstd.SizeSlice(s, func (s []person.Person2) int { return bstd.SizeSlice(s, func (s person.Person2) int { return s.SizePlain() }) }) }) return } @@ -109,7 +109,8 @@ func (othersTest *OthersTest) NestedMarshal(tn int, b []byte, id uint16) (n int) n = bgenimpl.MarshalTag(n, b, bgenimpl.ArrayMap, 8) n = bgenimpl.MarshalEnum(n, b, othersTest.ExampleEnum2) n = othersTest.Person.NestedMarshal(n, b, 9) - n = othersTest.Person2.NestedMarshal(n, b, 10) + n = bgenimpl.MarshalTag(n, b, bgenimpl.ArrayMap, 10) + n = bstd.MarshalSlice(n, b, othersTest.Person2, func (n int, b []byte, s [][]person.Person2) int { return bstd.MarshalSlice(n, b, s, func (n int, b []byte, s []person.Person2) int { return bstd.MarshalSlice(n, b, s, func (n int, b []byte, s person.Person2) int { return s.MarshalPlain(n, b) }) }) }) n += 2 b[n-2] = 1 @@ -129,7 +130,7 @@ func (othersTest *OthersTest) MarshalPlain(tn int, b []byte) (n int) { n = bgenimpl.MarshalEnum(n, b, othersTest.ExampleEnum) n = bgenimpl.MarshalEnum(n, b, othersTest.ExampleEnum2) n = othersTest.Person.MarshalPlain(n, b) - n = othersTest.Person2.MarshalPlain(n, b) + n = bstd.MarshalSlice(n, b, othersTest.Person2, func (n int, b []byte, s [][]person.Person2) int { return bstd.MarshalSlice(n, b, s, func (n int, b []byte, s []person.Person2) int { return bstd.MarshalSlice(n, b, s, func (n int, b []byte, s person.Person2) int { return s.MarshalPlain(n, b) }) }) }) return n } @@ -239,9 +240,17 @@ func (othersTest *OthersTest) NestedUnmarshal(tn int, b []byte, r []uint16, id u if n, err = othersTest.Person.NestedUnmarshal(n, b, othersTestRIds, 9); err != nil { return } - if n, err = othersTest.Person2.NestedUnmarshal(n, b, othersTestRIds, 10); err != nil { + if n, ok, err = bgenimpl.HandleCompatibility(n, b, othersTestRIds, 10); err != nil { + if err == bgenimpl.ErrEof { + return n, nil + } return } + if ok { + if n, othersTest.Person2, err = bstd.UnmarshalSlice[[][]person.Person2](n, b, func (n int, b []byte) (int, [][]person.Person2, error) { return bstd.UnmarshalSlice[[]person.Person2](n, b, func (n int, b []byte) (int, []person.Person2, error) { return bstd.UnmarshalSlice[person.Person2](n, b, func (n int, b []byte, s *person.Person2) (int, error) { return s.UnmarshalPlain(n, b) }) }) }); err != nil { + return + } + } n += 2 return } @@ -276,7 +285,7 @@ func (othersTest *OthersTest) UnmarshalPlain(tn int, b []byte) (n int, err error if n, err = othersTest.Person.UnmarshalPlain(n, b); err != nil { return } - if n, err = othersTest.Person2.UnmarshalPlain(n, b); err != nil { + if n, othersTest.Person2, err = bstd.UnmarshalSlice[[][]person.Person2](n, b, func (n int, b []byte) (int, [][]person.Person2, error) { return bstd.UnmarshalSlice[[]person.Person2](n, b, func (n int, b []byte) (int, []person.Person2, error) { return bstd.UnmarshalSlice[person.Person2](n, b, func (n int, b []byte, s *person.Person2) (int, error) { return s.UnmarshalPlain(n, b) }) }) }); err != nil { return } return diff --git a/testing/schemas/others.benc b/testing/schemas/others.benc index 2a6c1d1..af59500 100644 --- a/testing/schemas/others.benc +++ b/testing/schemas/others.benc @@ -31,8 +31,8 @@ ctr OthersTest { ExampleEnum2 exampleEnum2 = 8; person.Person person = 9; - person.2.test.defines.Person2 person2 = 10; + [][][]person.2.test.defines.Person2 person2 = 10; } # DO NOT EDIT. -# [meta_s] eyJtc2dzIjp7Ik90aGVyc1Rlc3QiOnsicklkcyI6bnVsbCwiZmllbGRzIjp7IjEiOnsiaWQiOjEsIk5hbWUiOiJ1aSIsIlR5cGUiOnsiVG9rZW5UeXBlIjoxOCwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoiIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiSXNNYXAiOmZhbHNlfX0sIjEwIjp7ImlkIjoxMCwiTmFtZSI6InBlcnNvbjIiLCJUeXBlIjp7IlRva2VuVHlwZSI6MCwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoicGVyc29uLlBlcnNvbjIiLCJJc1Vuc2FmZSI6ZmFsc2UsIklzQXJyYXkiOmZhbHNlLCJJc01hcCI6ZmFsc2V9fSwiMiI6eyJpZCI6MiwiTmFtZSI6InVpNjQiLCJUeXBlIjp7IlRva2VuVHlwZSI6MTUsIk1hcEtleVR5cGUiOm51bGwsIkNoaWxkVHlwZSI6bnVsbCwiY3RyTmFtZSI6IiIsIklzVW5zYWZlIjpmYWxzZSwiSXNBcnJheSI6ZmFsc2UsIklzTWFwIjpmYWxzZX19LCIzIjp7ImlkIjozLCJOYW1lIjoidWk2NEFyciIsIlR5cGUiOnsiVG9rZW5UeXBlIjowLCJNYXBLZXlUeXBlIjpudWxsLCJDaGlsZFR5cGUiOnsiVG9rZW5UeXBlIjoxNSwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoiIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiSXNNYXAiOmZhbHNlfSwiY3RyTmFtZSI6IiIsIklzVW5zYWZlIjpmYWxzZSwiSXNBcnJheSI6dHJ1ZSwiSXNNYXAiOmZhbHNlfX0sIjQiOnsiaWQiOjQsIk5hbWUiOiJ1aTY0TWFwIiwiVHlwZSI6eyJUb2tlblR5cGUiOjAsIk1hcEtleVR5cGUiOnsiVG9rZW5UeXBlIjoxNSwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoiIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiSXNNYXAiOmZhbHNlfSwiQ2hpbGRUeXBlIjp7IlRva2VuVHlwZSI6MTYsIk1hcEtleVR5cGUiOm51bGwsIkNoaWxkVHlwZSI6bnVsbCwiY3RyTmFtZSI6IiIsIklzVW5zYWZlIjpmYWxzZSwiSXNBcnJheSI6ZmFsc2UsIklzTWFwIjpmYWxzZX0sImN0ck5hbWUiOiIiLCJJc1Vuc2FmZSI6ZmFsc2UsIklzQXJyYXkiOmZhbHNlLCJJc01hcCI6dHJ1ZX19LCI1Ijp7ImlkIjo1LCJOYW1lIjoidWkzMiIsIlR5cGUiOnsiVG9rZW5UeXBlIjoxNiwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoiIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiSXNNYXAiOmZhbHNlfX0sIjYiOnsiaWQiOjYsIk5hbWUiOiJ1aTE2IiwiVHlwZSI6eyJUb2tlblR5cGUiOjE3LCJNYXBLZXlUeXBlIjpudWxsLCJDaGlsZFR5cGUiOm51bGwsImN0ck5hbWUiOiIiLCJJc1Vuc2FmZSI6ZmFsc2UsIklzQXJyYXkiOmZhbHNlLCJJc01hcCI6ZmFsc2V9fSwiNyI6eyJpZCI6NywiTmFtZSI6ImV4YW1wbGVFbnVtIiwiVHlwZSI6eyJUb2tlblR5cGUiOjAsIk1hcEtleVR5cGUiOm51bGwsIkNoaWxkVHlwZSI6bnVsbCwiY3RyTmFtZSI6IkV4YW1wbGVFbnVtIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiSXNNYXAiOmZhbHNlfX0sIjgiOnsiaWQiOjgsIk5hbWUiOiJleGFtcGxlRW51bTIiLCJUeXBlIjp7IlRva2VuVHlwZSI6MCwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoiRXhhbXBsZUVudW0yIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiSXNNYXAiOmZhbHNlfX0sIjkiOnsiaWQiOjksIk5hbWUiOiJwZXJzb24iLCJUeXBlIjp7IlRva2VuVHlwZSI6MCwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoicGVyc29uLlBlcnNvbiIsIklzVW5zYWZlIjpmYWxzZSwiSXNBcnJheSI6ZmFsc2UsIklzTWFwIjpmYWxzZX19fX19fQ== [meta_e] \ No newline at end of file +# [meta_s] eyJtc2dzIjp7Ik90aGVyc1Rlc3QiOnsicklkcyI6bnVsbCwiZmllbGRzIjp7IjEiOnsiaWQiOjEsIk5hbWUiOiJ1aSIsIlR5cGUiOnsiVG9rZW5UeXBlIjoxOCwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoiIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiSXNNYXAiOmZhbHNlfX0sIjEwIjp7ImlkIjoxMCwiTmFtZSI6InBlcnNvbjIiLCJUeXBlIjp7IlRva2VuVHlwZSI6MCwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjp7IlRva2VuVHlwZSI6MCwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjp7IlRva2VuVHlwZSI6MCwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjp7IlRva2VuVHlwZSI6MCwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoicGVyc29uLlBlcnNvbjIiLCJJc1Vuc2FmZSI6ZmFsc2UsIklzQXJyYXkiOmZhbHNlLCJJc01hcCI6ZmFsc2V9LCJjdHJOYW1lIjoiIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5Ijp0cnVlLCJJc01hcCI6ZmFsc2V9LCJjdHJOYW1lIjoiIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5Ijp0cnVlLCJJc01hcCI6ZmFsc2V9LCJjdHJOYW1lIjoiIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5Ijp0cnVlLCJJc01hcCI6ZmFsc2V9fSwiMiI6eyJpZCI6MiwiTmFtZSI6InVpNjQiLCJUeXBlIjp7IlRva2VuVHlwZSI6MTUsIk1hcEtleVR5cGUiOm51bGwsIkNoaWxkVHlwZSI6bnVsbCwiY3RyTmFtZSI6IiIsIklzVW5zYWZlIjpmYWxzZSwiSXNBcnJheSI6ZmFsc2UsIklzTWFwIjpmYWxzZX19LCIzIjp7ImlkIjozLCJOYW1lIjoidWk2NEFyciIsIlR5cGUiOnsiVG9rZW5UeXBlIjowLCJNYXBLZXlUeXBlIjpudWxsLCJDaGlsZFR5cGUiOnsiVG9rZW5UeXBlIjoxNSwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoiIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiSXNNYXAiOmZhbHNlfSwiY3RyTmFtZSI6IiIsIklzVW5zYWZlIjpmYWxzZSwiSXNBcnJheSI6dHJ1ZSwiSXNNYXAiOmZhbHNlfX0sIjQiOnsiaWQiOjQsIk5hbWUiOiJ1aTY0TWFwIiwiVHlwZSI6eyJUb2tlblR5cGUiOjAsIk1hcEtleVR5cGUiOnsiVG9rZW5UeXBlIjoxNSwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoiIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiSXNNYXAiOmZhbHNlfSwiQ2hpbGRUeXBlIjp7IlRva2VuVHlwZSI6MTYsIk1hcEtleVR5cGUiOm51bGwsIkNoaWxkVHlwZSI6bnVsbCwiY3RyTmFtZSI6IiIsIklzVW5zYWZlIjpmYWxzZSwiSXNBcnJheSI6ZmFsc2UsIklzTWFwIjpmYWxzZX0sImN0ck5hbWUiOiIiLCJJc1Vuc2FmZSI6ZmFsc2UsIklzQXJyYXkiOmZhbHNlLCJJc01hcCI6dHJ1ZX19LCI1Ijp7ImlkIjo1LCJOYW1lIjoidWkzMiIsIlR5cGUiOnsiVG9rZW5UeXBlIjoxNiwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoiIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiSXNNYXAiOmZhbHNlfX0sIjYiOnsiaWQiOjYsIk5hbWUiOiJ1aTE2IiwiVHlwZSI6eyJUb2tlblR5cGUiOjE3LCJNYXBLZXlUeXBlIjpudWxsLCJDaGlsZFR5cGUiOm51bGwsImN0ck5hbWUiOiIiLCJJc1Vuc2FmZSI6ZmFsc2UsIklzQXJyYXkiOmZhbHNlLCJJc01hcCI6ZmFsc2V9fSwiNyI6eyJpZCI6NywiTmFtZSI6ImV4YW1wbGVFbnVtIiwiVHlwZSI6eyJUb2tlblR5cGUiOjAsIk1hcEtleVR5cGUiOm51bGwsIkNoaWxkVHlwZSI6bnVsbCwiY3RyTmFtZSI6IkV4YW1wbGVFbnVtIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiSXNNYXAiOmZhbHNlfX0sIjgiOnsiaWQiOjgsIk5hbWUiOiJleGFtcGxlRW51bTIiLCJUeXBlIjp7IlRva2VuVHlwZSI6MCwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoiRXhhbXBsZUVudW0yIiwiSXNVbnNhZmUiOmZhbHNlLCJJc0FycmF5IjpmYWxzZSwiSXNNYXAiOmZhbHNlfX0sIjkiOnsiaWQiOjksIk5hbWUiOiJwZXJzb24iLCJUeXBlIjp7IlRva2VuVHlwZSI6MCwiTWFwS2V5VHlwZSI6bnVsbCwiQ2hpbGRUeXBlIjpudWxsLCJjdHJOYW1lIjoicGVyc29uLlBlcnNvbiIsIklzVW5zYWZlIjpmYWxzZSwiSXNBcnJheSI6ZmFsc2UsIklzTWFwIjpmYWxzZX19fX19fQ== [meta_e] \ No newline at end of file