From 55da6462ff4c89d7cb74be37dd5960fb93e0bf32 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Sun, 26 Jan 2020 10:26:16 +0100 Subject: pkg/serializer: do not write field names if it won't save space If we are going to write all values, don't write field names. This only increases size of generated files. The change reduces size of generated files by 5.8% (62870496-59410354=3460142 bytes saved). --- pkg/serializer/serializer.go | 23 ++++++++++++++++++----- pkg/serializer/serializer_test.go | 6 ++++-- 2 files changed, 22 insertions(+), 7 deletions(-) (limited to 'pkg') diff --git a/pkg/serializer/serializer.go b/pkg/serializer/serializer.go index 473b6fa74..4de4dc093 100644 --- a/pkg/serializer/serializer.go +++ b/pkg/serializer/serializer.go @@ -57,7 +57,10 @@ func (w *writer) do(v reflect.Value, sliceElem bool) { case reflect.String: fmt.Fprintf(w.w, "%q", v.String()) case reflect.Func: - // Skip, no way to serialize this. + if !v.IsNil() { + panic("no way to serialize funcs") + } + fmt.Fprintf(w.w, "nil") default: panic(fmt.Sprintf("unsupported type: %#v", v.Type().String())) } @@ -111,17 +114,27 @@ func (w *writer) doStruct(v reflect.Value, sliceElem bool) { w.string(v.Type().Name()) } w.byte('{') + fieldNames := false + for i := 0; i < v.NumField(); i++ { + f := v.Field(i) + if isDefaultValue(f) || !f.CanSet() { + fieldNames = true + break + } + } needComma := false for i := 0; i < v.NumField(); i++ { f := v.Field(i) - if isDefaultValue(f) { + if fieldNames && (isDefaultValue(f) || !f.CanSet()) { continue } if needComma { w.byte(',') } - w.string(v.Type().Field(i).Name) - w.byte(':') + if fieldNames { + w.string(v.Type().Field(i).Name) + w.byte(':') + } w.do(f, false) needComma = true } @@ -177,7 +190,7 @@ func isDefaultValue(v reflect.Value) bool { case reflect.String: return v.String() == "" case reflect.Func: - return true + return false default: return false } diff --git a/pkg/serializer/serializer_test.go b/pkg/serializer/serializer_test.go index 06dbaf304..c33b316a9 100644 --- a/pkg/serializer/serializer_test.go +++ b/pkg/serializer/serializer_test.go @@ -13,9 +13,10 @@ func TestSerializer(t *testing.T) { Y: Y{1}, P: &Y{2}, A: []Y{{3}, {4}}, - F: true, + B: true, S: "a\x09b", T: T1, + F: nil, } buf := new(bytes.Buffer) Write(buf, x) @@ -27,9 +28,10 @@ type X struct { Y Y P *Y A []Y - F bool + B bool S string T T + F func() } type Y struct { -- cgit mrf-deployment