]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: call missing popdcl in various genxxx functions
authorRobert Griesemer <gri@golang.org>
Thu, 10 Mar 2016 23:07:08 +0000 (15:07 -0800)
committerRobert Griesemer <gri@golang.org>
Fri, 11 Mar 2016 04:12:31 +0000 (04:12 +0000)
Not calling popdcl doesn't have an impact on generated code but
the result is a growing (rather than empty) stack of symbols,
possibly causing more data to remain alive than necessary.

Also: minor cleanups.

Change-Id: Ic4fdbcd8843637d69ab1aa15e896a7e6339bc990
Reviewed-on: https://go-review.googlesource.com/20554
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Robert Griesemer <gri@golang.org>

src/cmd/compile/internal/gc/alg.go
src/cmd/compile/internal/gc/go.go
src/cmd/compile/internal/gc/parser.go
src/cmd/compile/internal/gc/subr.go

index 4a080247d383a0ee29f5247ad72c6d7889efc1cb..5126ebd3a54f8aed90fd45c528c41959e3792221 100644 (file)
@@ -280,6 +280,8 @@ func genhash(sym *Sym, t *Type) {
        typecheck(&fn, Etop)
        typechecklist(fn.Nbody.Slice(), Etop)
        Curfn = nil
+       popdcl()
+       testdclstack()
 
        // Disable safemode while compiling this code: the code we
        // generate internally can refer to unsafe.Pointer.
@@ -472,6 +474,8 @@ func geneq(sym *Sym, t *Type) {
        typecheck(&fn, Etop)
        typechecklist(fn.Nbody.Slice(), Etop)
        Curfn = nil
+       popdcl()
+       testdclstack()
 
        // Disable safemode while compiling this code: the code we
        // generate internally can refer to unsafe.Pointer.
index 3d221e60493124a43cef14fdd8fdc9283cd07055..4bf738540576a90ae4867b570045e7f75becc7f3 100644 (file)
@@ -76,12 +76,13 @@ type Sym struct {
        Pkg        *Pkg
        Name       string // variable name
        Def        *Node  // definition: ONAME OTYPE OPACK or OLITERAL
-       Label      *Label // corresponding label (ephemeral)
        Block      int32  // blocknumber to catch redeclaration
        Lastlineno int32  // last declaration for diagnostic
-       Origpkg    *Pkg   // original package for . import
-       Lsym       *obj.LSym
-       Fsym       *Sym // funcsym
+
+       Label   *Label // corresponding label (ephemeral)
+       Origpkg *Pkg   // original package for . import
+       Lsym    *obj.LSym
+       Fsym    *Sym // funcsym
 }
 
 type Label struct {
index d61597e194461d0cbc1d3ee632474cd38839b48b..fa7e70c43f64f4eb8b108921a811ebeac22dfd40 100644 (file)
@@ -2142,8 +2142,8 @@ func (p *parser) structdcl() []*Node {
                typ := p.ntype()
                tag := p.oliteral()
 
-               if l := fields; len(l) == 0 || l[0].Sym.Name == "?" {
-                       // ? symbol, during import (list1(nil) == nil)
+               if len(fields) == 0 || fields[0].Sym.Name == "?" {
+                       // ? symbol, during import
                        n := typ
                        if n.Op == OIND {
                                n = n.Left
index 96fca9493c7a18362594e9aaaf7f7a84ae967ac1..2933d9055564ebe661c1b2b51c4c9164928b1a0d 100644 (file)
@@ -2030,6 +2030,8 @@ func genwrapper(rcvr *Type, method *Type, newnam *Sym, iface int) {
 
        funcbody(fn)
        Curfn = fn
+       popdcl()
+       testdclstack()
 
        // wrappers where T is anonymous (struct or interface) can be duplicated.
        if rcvr.Etype == TSTRUCT || rcvr.Etype == TINTER || Isptr[rcvr.Etype] && rcvr.Type.Etype == TSTRUCT {