diff options
| author | James Tucker <james@tailscale.com> | 2023-09-29 17:29:17 -0700 |
|---|---|---|
| committer | James Tucker <jftucker@gmail.com> | 2023-09-29 17:59:59 -0700 |
| commit | ee90cd02fdd4e4125ec9d12eef1195ed36ef4b2e (patch) | |
| tree | 0f09ecacdb3ae3e01eac81a2bbdc3939d648bd1f /cmd | |
| parent | e91e96dfa58405ce4bbc1478596cd5c41dee3960 (diff) | |
| download | tailscale-ee90cd02fdd4e4125ec9d12eef1195ed36ef4b2e.tar.xz tailscale-ee90cd02fdd4e4125ec9d12eef1195ed36ef4b2e.zip | |
cmd/cloner,*: optimize nillable slice cloner
A wild @josharian appears with a good suggestion for a refactor, thanks
Josh!
Updates #9410
Signed-off-by: James Tucker <james@tailscale.com>
Diffstat (limited to 'cmd')
| -rw-r--r-- | cmd/cloner/cloner.go | 4 | ||||
| -rw-r--r-- | cmd/viewer/tests/tests_clone.go | 32 |
2 files changed, 13 insertions, 23 deletions
diff --git a/cmd/cloner/cloner.go b/cmd/cloner/cloner.go index 5a94fa97d..25d796dbf 100644 --- a/cmd/cloner/cloner.go +++ b/cmd/cloner/cloner.go @@ -122,8 +122,7 @@ func gen(buf *bytes.Buffer, it *codegen.ImportTracker, typ *types.Named) { case *types.Slice: if codegen.ContainsPointers(ft.Elem()) { n := it.QualifiedName(ft.Elem()) - writef("if src.%s != nil {", fname) - writef("dst.%s = make([]%s, len(src.%s))", fname, n, fname) + writef("dst.%s = append([]%s(nil), make([]%s, len(src.%s))...)", fname, n, n, fname) writef("for i := range dst.%s {", fname) if ptr, isPtr := ft.Elem().(*types.Pointer); isPtr { if _, isBasic := ptr.Elem().Underlying().(*types.Basic); isBasic { @@ -138,7 +137,6 @@ func gen(buf *bytes.Buffer, it *codegen.ImportTracker, typ *types.Named) { writef("\tdst.%s[i] = *src.%s[i].Clone()", fname, fname) } writef("}") - writef("}") } else { writef("dst.%s = append(src.%s[:0:0], src.%s...)", fname, fname, fname) } diff --git a/cmd/viewer/tests/tests_clone.go b/cmd/viewer/tests/tests_clone.go index 2b41639fd..35721430e 100644 --- a/cmd/viewer/tests/tests_clone.go +++ b/cmd/viewer/tests/tests_clone.go @@ -136,29 +136,21 @@ func (src *StructWithSlices) Clone() *StructWithSlices { dst := new(StructWithSlices) *dst = *src dst.Values = append(src.Values[:0:0], src.Values...) - if src.ValuePointers != nil { - dst.ValuePointers = make([]*StructWithoutPtrs, len(src.ValuePointers)) - for i := range dst.ValuePointers { - dst.ValuePointers[i] = src.ValuePointers[i].Clone() - } + dst.ValuePointers = append([]*StructWithoutPtrs(nil), make([]*StructWithoutPtrs, len(src.ValuePointers))...) + for i := range dst.ValuePointers { + dst.ValuePointers[i] = src.ValuePointers[i].Clone() } - if src.StructPointers != nil { - dst.StructPointers = make([]*StructWithPtrs, len(src.StructPointers)) - for i := range dst.StructPointers { - dst.StructPointers[i] = src.StructPointers[i].Clone() - } + dst.StructPointers = append([]*StructWithPtrs(nil), make([]*StructWithPtrs, len(src.StructPointers))...) + for i := range dst.StructPointers { + dst.StructPointers[i] = src.StructPointers[i].Clone() } - if src.Structs != nil { - dst.Structs = make([]StructWithPtrs, len(src.Structs)) - for i := range dst.Structs { - dst.Structs[i] = *src.Structs[i].Clone() - } + dst.Structs = append([]StructWithPtrs(nil), make([]StructWithPtrs, len(src.Structs))...) + for i := range dst.Structs { + dst.Structs[i] = *src.Structs[i].Clone() } - if src.Ints != nil { - dst.Ints = make([]*int, len(src.Ints)) - for i := range dst.Ints { - dst.Ints[i] = ptr.To(*src.Ints[i]) - } + dst.Ints = append([]*int(nil), make([]*int, len(src.Ints))...) + for i := range dst.Ints { + dst.Ints[i] = ptr.To(*src.Ints[i]) } dst.Slice = append(src.Slice[:0:0], src.Slice...) dst.Prefixes = append(src.Prefixes[:0:0], src.Prefixes...) |
