Skip to content

Commit 0fc35d5

Browse files
committedJun 9, 2019
Fix encodesize() for nested byte slices
1 parent d60d8d8 commit 0fc35d5

8 files changed

+623
-39
lines changed
 

‎Makefile

+3
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ check-generate-unchanged: check-generate-tests-unchanged check-generate-benchmar
2828
generate-tests: ## Generate encoders and test for test objects
2929
go run cmd/skyencoder/skyencoder.go -struct DemoStruct -output-file demo_struct_skyencoder_test.go github.com/skycoin/skyencoder/tests
3030
go run cmd/skyencoder/skyencoder.go -struct DemoStructOmitEmpty -output-file demo_struct_omit_empty_skyencoder_test.go github.com/skycoin/skyencoder/tests
31+
go run cmd/skyencoder/skyencoder.go -struct DemoStructNestedBytes -output-file demo_struct_nested_bytes_skyencoder_test.go github.com/skycoin/skyencoder/tests
3132
go run cmd/skyencoder/skyencoder.go -struct MaxLenStringStruct1 -output-file max_len_string_struct1_skyencoder_test.go github.com/skycoin/skyencoder/tests
3233
go run cmd/skyencoder/skyencoder.go -struct MaxLenStringStruct2 -output-file max_len_string_struct2_skyencoder_test.go github.com/skycoin/skyencoder/tests
3334
go run cmd/skyencoder/skyencoder.go -struct MaxLenAllStruct1 -output-file max_len_all_struct1_skyencoder_test.go github.com/skycoin/skyencoder/tests
@@ -48,6 +49,8 @@ check-generate-tests-unchanged: ## Check that make generate-tests did not change
4849
@if [ "$(shell git diff ./tests/demo_struct_skyencoder_test_test.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make generate-tests' ; exit 2 ; fi
4950
@if [ "$(shell git diff ./tests/demo_struct_omit_empty_skyencoder_test.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make generate-tests' ; exit 2 ; fi
5051
@if [ "$(shell git diff ./tests/demo_struct_omit_empty_skyencoder_test_test.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make generate-tests' ; exit 2 ; fi
52+
@if [ "$(shell git diff ./tests/demo_struct_nested_bytes_skyencoder_test.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make generate-tests' ; exit 2 ; fi
53+
@if [ "$(shell git diff ./tests/demo_struct_nested_bytes_skyencoder_test_test.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make generate-tests' ; exit 2 ; fi
5154
@if [ "$(shell git diff ./tests/max_len_string_struct1_skyencoder_test.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make generate-tests' ; exit 2 ; fi
5255
@if [ "$(shell git diff ./tests/max_len_string_struct1_skyencoder_test_test.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make generate-tests' ; exit 2 ; fi
5356
@if [ "$(shell git diff ./tests/max_len_string_struct2_skyencoder_test.go | wc -l | tr -d ' ')" != "0" ] ; then echo 'Changes detected after make generate-tests' ; exit 2 ; fi

‎benchmark/benchmark_struct_skyencoder.go

+10-9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎benchmark/signed_block_skyencoder.go

+18-17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎builder.go

+13-10
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,7 @@ func BuildStructEncoder(s *StructInfo, destPackage, fmtFilename string, exported
213213
pkgName = s.Package.Name()
214214
}
215215

216-
pkgHeader := fmt.Sprintf("// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT.\npackage %s\n\n", pkgName)
216+
pkgHeader := fmt.Sprintf("package %s\n\n// Code generated by github.com/skycoin/skyencoder. DO NOT EDIT.\n\n", pkgName)
217217
src = append([]byte(pkgHeader), src...)
218218

219219
// Format with imports
@@ -497,12 +497,13 @@ func buildCodeSectionEncodeSize(t types.Type, varName, baseCounterName string, d
497497
}
498498

499499
nextCounterName := fmt.Sprintf("%s%d", baseCounterName, depth+1)
500-
elemSection, isDynamic, err := buildCodeSectionEncodeSize(elem, "x", baseCounterName, depth+1, nil)
500+
xVarName := fmt.Sprintf("x%d", depth+1)
501+
elemSection, isDynamic, err := buildCodeSectionEncodeSize(elem, xVarName, baseCounterName, depth+1, nil)
501502
if err != nil {
502503
return "", false, err
503504
}
504505

505-
return buildEncodeSizeArray(varName, counterName, nextCounterName, "x", elemSection, x.Len(), isDynamic, options), isDynamic, nil
506+
return buildEncodeSizeArray(varName, counterName, nextCounterName, xVarName, elemSection, x.Len(), isDynamic, options), isDynamic, nil
506507

507508
case *types.Slice:
508509
elem := x.Elem()
@@ -514,39 +515,41 @@ func buildCodeSectionEncodeSize(t types.Type, varName, baseCounterName string, d
514515
}
515516

516517
if isByte(elem) {
517-
return buildEncodeSizeByteSlice(varName, counterName, options), false, nil
518+
return buildEncodeSizeByteSlice(varName, counterName, options), true, nil
518519
}
519520

520521
nextCounterName := fmt.Sprintf("%s%d", baseCounterName, depth+1)
521-
elemSection, isDynamic, err := buildCodeSectionEncodeSize(elem, "x", baseCounterName, depth+1, nil)
522+
xVarName := fmt.Sprintf("x%d", depth+1)
523+
elemSection, isDynamic, err := buildCodeSectionEncodeSize(elem, xVarName, baseCounterName, depth+1, nil)
522524
if err != nil {
523525
return "", false, err
524526
}
525527

526-
return buildEncodeSizeSlice(varName, counterName, nextCounterName, "x", elemSection, isDynamic, options), true, nil
528+
return buildEncodeSizeSlice(varName, counterName, nextCounterName, xVarName, elemSection, isDynamic, options), true, nil
527529

528530
case *types.Map:
529531
nextCounterName := fmt.Sprintf("%s%d", baseCounterName, depth+1)
532+
kVarName := fmt.Sprintf("k%d", depth+1)
533+
vVarName := fmt.Sprintf("v%d", depth+1)
530534

531-
keySection, isDynamicKey, err := buildCodeSectionEncodeSize(x.Key(), "k", baseCounterName, depth+1, nil)
535+
keySection, isDynamicKey, err := buildCodeSectionEncodeSize(x.Key(), kVarName, baseCounterName, depth+1, nil)
532536
if err != nil {
533537
return "", false, err
534538
}
535539

536-
elemSection, isDynamicElem, err := buildCodeSectionEncodeSize(x.Elem(), "v", baseCounterName, depth+1, nil)
540+
elemSection, isDynamicElem, err := buildCodeSectionEncodeSize(x.Elem(), vVarName, baseCounterName, depth+1, nil)
537541
if err != nil {
538542
return "", false, err
539543
}
540544

541-
return buildEncodeSizeMap(varName, counterName, nextCounterName, "k", "v", keySection, elemSection, isDynamicKey, isDynamicElem, options), true, nil
545+
return buildEncodeSizeMap(varName, counterName, nextCounterName, kVarName, vVarName, keySection, elemSection, isDynamicKey, isDynamicElem, options), true, nil
542546

543547
case *types.Struct:
544548
isDynamic := false
545549
sections := make([]string, x.NumFields())
546550
for i := 0; i < x.NumFields(); i++ {
547551
f := x.Field(i)
548552

549-
// TODO -- confirm that the original encoder ignores unexported fields
550553
if !f.Exported() {
551554
continue
552555
}

‎format.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -170,13 +170,15 @@ func buildEncodeSizeArray(name, counterName, nextCounterName, elemVarName, elemS
170170
}
171171

172172
func buildEncodeSizeByteSlice(name, counterName string, options *Options) string {
173+
debugPrintf("buildEncodeSizeByteSlice: name=%s counterName=%s\n", name, counterName)
174+
173175
body := fmt.Sprintf(`
174176
// %[1]s
175177
%[2]s += 4 + uint64(len(%[1]s))
176178
`, name, counterName)
177179

178180
if options != nil && options.OmitEmpty {
179-
return fmt.Sprintf(`
181+
body = fmt.Sprintf(`
180182
// omitempty
181183
if len(%[1]s) != 0 {
182184
%[2]s
@@ -190,7 +192,7 @@ func buildEncodeSizeByteSlice(name, counterName string, options *Options) string
190192
func buildEncodeSizeSlice(name, counterName, nextCounterName, elemVarName, elemSection string, isDynamic bool, options *Options) string {
191193
var body string
192194

193-
debugPrintf("BuildEncodeSizeSlice: counterName=%s\n", counterName)
195+
debugPrintf("buildEncodeSizeSlice: name=%s counterName=%s nextCounterName=%s\n", name, counterName, nextCounterName)
194196

195197
if isDynamic {
196198
body = fmt.Sprintf(`
@@ -219,7 +221,7 @@ func buildEncodeSizeSlice(name, counterName, nextCounterName, elemVarName, elemS
219221
}
220222

221223
if options != nil && options.OmitEmpty {
222-
return fmt.Sprintf(`
224+
body = fmt.Sprintf(`
223225
// omitempty
224226
if len(%[1]s) != 0 {
225227
%[2]s

‎tests/demo_struct_nested_bytes_skyencoder_test.go

+144
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎tests/demo_struct_nested_bytes_skyencoder_test_test.go

+420
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎tests/structs.go

+10
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,16 @@ type DemoStructOmitEmpty struct {
9494
OmitEmpty []byte `enc:",omitempty"`
9595
}
9696

97+
/* nested byte array */
98+
99+
type DemoStructNestedBytes struct {
100+
Objects []DemoStructNestedBytesInner
101+
}
102+
103+
type DemoStructNestedBytesInner struct {
104+
Data []byte
105+
}
106+
97107
/* maxlen tag tests */
98108

99109
type MaxLenStringStruct1 struct {

0 commit comments

Comments
 (0)
Please sign in to comment.