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>
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.
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.
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 {
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
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 {