aboutsummaryrefslogtreecommitdiffstats
path: root/pkg
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-01-26 10:26:16 +0100
committerDmitry Vyukov <dvyukov@google.com>2020-01-26 11:07:18 +0100
commit55da6462ff4c89d7cb74be37dd5960fb93e0bf32 (patch)
treeb2a6138c23b4c17d5d38ab9d8d91f300297198c6 /pkg
parentf4e7270e33225b8f25b74ab9072e9b670f2f82ae (diff)
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).
Diffstat (limited to 'pkg')
-rw-r--r--pkg/serializer/serializer.go23
-rw-r--r--pkg/serializer/serializer_test.go6
2 files changed, 22 insertions, 7 deletions
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 {