From 0ffcea329570529aedabbc11c1651cba0d46029d Mon Sep 17 00:00:00 2001 From: DesWurstes Date: Mon, 18 May 2020 13:54:09 +0100 Subject: [PATCH] Generate copy() for derived types (#1118) Automatically submitted. --- types_generate.go | 17 +++++++++++------ ztypes.go | 19 +++++++++++++++++-- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/types_generate.go b/types_generate.go index a06619a4..855d5d18 100644 --- a/types_generate.go +++ b/types_generate.go @@ -241,11 +241,15 @@ func main() { for _, name := range namedTypes { o := scope.Lookup(name) st, isEmbedded := getTypeStruct(o.Type(), scope) - if isEmbedded { - continue - } fmt.Fprintf(b, "func (rr *%s) copy() RR {\n", name) - fields := []string{"rr.Hdr"} + fields := make([]string, 0, st.NumFields()) + if isEmbedded { + a, _ := o.Type().Underlying().(*types.Struct) + parent := a.Field(0).Name() + fields = append(fields, "*rr."+parent+".copy().(*"+parent+")") + goto WriteCopy + } + fields = append(fields, "rr.Hdr") for i := 1; i < st.NumFields(); i++ { f := st.Field(i).Name() if sl, ok := st.Field(i).Type().(*types.Slice); ok { @@ -263,8 +267,8 @@ func main() { continue } if t == "APLPrefix" { - fmt.Fprintf(b, "%s := make([]%s, len(rr.%s));\nfor i := range rr.%s {\n %s[i] = rr.%s[i].copy()\n}\n", - f, t, f, f, f, f) + fmt.Fprintf(b, "%s := make([]%s, len(rr.%s));\nfor i,e := range rr.%s {\n %s[i] = e.copy()\n}\n", + f, t, f, f, f) fields = append(fields, f) continue } @@ -279,6 +283,7 @@ func main() { } fields = append(fields, "rr."+f) } + WriteCopy: fmt.Fprintf(b, "return &%s{%s}\n", name, strings.Join(fields, ",")) fmt.Fprintf(b, "}\n") } diff --git a/ztypes.go b/ztypes.go index 1cbd6d3f..5bb59fa6 100644 --- a/ztypes.go +++ b/ztypes.go @@ -685,8 +685,8 @@ func (rr *ANY) copy() RR { } func (rr *APL) copy() RR { Prefixes := make([]APLPrefix, len(rr.Prefixes)) - for i := range rr.Prefixes { - Prefixes[i] = rr.Prefixes[i].copy() + for i, e := range rr.Prefixes { + Prefixes[i] = e.copy() } return &APL{rr.Hdr, Prefixes} } @@ -698,6 +698,12 @@ func (rr *AVC) copy() RR { func (rr *CAA) copy() RR { return &CAA{rr.Hdr, rr.Flag, rr.Tag, rr.Value} } +func (rr *CDNSKEY) copy() RR { + return &CDNSKEY{*rr.DNSKEY.copy().(*DNSKEY)} +} +func (rr *CDS) copy() RR { + return &CDS{*rr.DS.copy().(*DS)} +} func (rr *CERT) copy() RR { return &CERT{rr.Hdr, rr.Type, rr.KeyTag, rr.Algorithm, rr.Certificate} } @@ -712,6 +718,9 @@ func (rr *CSYNC) copy() RR { func (rr *DHCID) copy() RR { return &DHCID{rr.Hdr, rr.Digest} } +func (rr *DLV) copy() RR { + return &DLV{*rr.DS.copy().(*DS)} +} func (rr *DNAME) copy() RR { return &DNAME{rr.Hdr, rr.Target} } @@ -744,6 +753,9 @@ func (rr *HIP) copy() RR { copy(RendezvousServers, rr.RendezvousServers) return &HIP{rr.Hdr, rr.HitLength, rr.PublicKeyAlgorithm, rr.PublicKeyLength, rr.Hit, rr.PublicKey, RendezvousServers} } +func (rr *KEY) copy() RR { + return &KEY{*rr.DNSKEY.copy().(*DNSKEY)} +} func (rr *KX) copy() RR { return &KX{rr.Hdr, rr.Preference, rr.Exchanger} } @@ -847,6 +859,9 @@ func (rr *RRSIG) copy() RR { func (rr *RT) copy() RR { return &RT{rr.Hdr, rr.Preference, rr.Host} } +func (rr *SIG) copy() RR { + return &SIG{*rr.RRSIG.copy().(*RRSIG)} +} func (rr *SMIMEA) copy() RR { return &SMIMEA{rr.Hdr, rr.Usage, rr.Selector, rr.MatchingType, rr.Certificate} }