Commit d7eb4901 authored by Matthew Dempsky's avatar Matthew Dempsky

cmd/compile: remove funcdepth variables

There were only two large classes of use for these variables:

1) Testing "funcdepth != 0" or "funcdepth > 0", which is equivalent to
checking "Curfn != nil".

2) In oldname, detecting whether a closure variable has been created
for the current function, which can be handled by instead testing
"n.Name.Curfn != Curfn".

Lastly, merge funcstart into funchdr, since it's only called once, and
it better matches up with funcbody now.

Passes toolstash-check.

Change-Id: I8fe159a9d37ef7debc4cd310354cea22a8b23394
Reviewed-on: https://go-review.googlesource.com/99076
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
parent aa00ca12
...@@ -178,8 +178,8 @@ func Import(imp *types.Pkg, in *bufio.Reader) { ...@@ -178,8 +178,8 @@ func Import(imp *types.Pkg, in *bufio.Reader) {
} }
i0 = i i0 = i
if funcdepth != 0 { if Curfn != nil {
p.formatErrorf("unexpected Funcdepth %d", funcdepth) p.formatErrorf("unexpected Curfn %v", Curfn)
} }
// Note: In the original code, funchdr and funcbody are called for // Note: In the original code, funchdr and funcbody are called for
......
...@@ -16,7 +16,6 @@ func (p *noder) funcLit(expr *syntax.FuncLit) *Node { ...@@ -16,7 +16,6 @@ func (p *noder) funcLit(expr *syntax.FuncLit) *Node {
n := p.nod(expr, OCLOSURE, nil, nil) n := p.nod(expr, OCLOSURE, nil, nil)
n.Func.SetIsHiddenClosure(Curfn != nil) n.Func.SetIsHiddenClosure(Curfn != nil)
n.Func.Ntype = ntype n.Func.Ntype = ntype
n.Func.Depth = funcdepth
n.Func.Outerfunc = Curfn n.Func.Outerfunc = Curfn
old := p.funchdr(n) old := p.funchdr(n)
...@@ -220,8 +219,6 @@ func makeclosure(func_ *Node) *Node { ...@@ -220,8 +219,6 @@ func makeclosure(func_ *Node) *Node {
xfunc.Func.Nname.Name.Param.Ntype = xtype xfunc.Func.Nname.Name.Param.Ntype = xtype
xfunc.Func.Nname.Name.Defn = xfunc xfunc.Func.Nname.Name.Defn = xfunc
declare(xfunc.Func.Nname, PFUNC) declare(xfunc.Func.Nname, PFUNC)
xfunc.Func.Nname.Name.Funcdepth = func_.Func.Depth
xfunc.Func.Depth = func_.Func.Depth
xfunc.Func.Endlineno = func_.Func.Endlineno xfunc.Func.Endlineno = func_.Func.Endlineno
if Ctxt.Flag_dynlink { if Ctxt.Flag_dynlink {
makefuncsym(xfunc.Func.Nname.Sym) makefuncsym(xfunc.Func.Nname.Sym)
......
...@@ -128,7 +128,6 @@ func declare(n *Node, ctxt Class) { ...@@ -128,7 +128,6 @@ func declare(n *Node, ctxt Class) {
s.Lastlineno = lineno s.Lastlineno = lineno
s.Def = asTypesNode(n) s.Def = asTypesNode(n)
n.Name.Vargen = int32(gen) n.Name.Vargen = int32(gen)
n.Name.Funcdepth = funcdepth
n.SetClass(ctxt) n.SetClass(ctxt)
autoexport(n, ctxt) autoexport(n, ctxt)
...@@ -160,7 +159,7 @@ func variter(vl []*Node, t *Node, el []*Node) []*Node { ...@@ -160,7 +159,7 @@ func variter(vl []*Node, t *Node, el []*Node) []*Node {
declare(v, dclcontext) declare(v, dclcontext)
v.Name.Param.Ntype = t v.Name.Param.Ntype = t
v.Name.Defn = as2 v.Name.Defn = as2
if funcdepth > 0 { if Curfn != nil {
init = append(init, nod(ODCL, v, nil)) init = append(init, nod(ODCL, v, nil))
} }
} }
...@@ -183,8 +182,8 @@ func variter(vl []*Node, t *Node, el []*Node) []*Node { ...@@ -183,8 +182,8 @@ func variter(vl []*Node, t *Node, el []*Node) []*Node {
declare(v, dclcontext) declare(v, dclcontext)
v.Name.Param.Ntype = t v.Name.Param.Ntype = t
if e != nil || funcdepth > 0 || isblank(v) { if e != nil || Curfn != nil || isblank(v) {
if funcdepth > 0 { if Curfn != nil {
init = append(init, nod(ODCL, v, nil)) init = append(init, nod(ODCL, v, nil))
} }
e = nod(OAS, v, e) e = nod(OAS, v, e)
...@@ -276,7 +275,7 @@ func oldname(s *types.Sym) *Node { ...@@ -276,7 +275,7 @@ func oldname(s *types.Sym) *Node {
return newnoname(s) return newnoname(s)
} }
if Curfn != nil && n.Op == ONAME && n.Name.Funcdepth > 0 && n.Name.Funcdepth != funcdepth { if Curfn != nil && n.Op == ONAME && n.Name.Curfn != nil && n.Name.Curfn != Curfn {
// Inner func is referring to var in outer func. // Inner func is referring to var in outer func.
// //
// TODO(rsc): If there is an outer variable x and we // TODO(rsc): If there is an outer variable x and we
...@@ -284,7 +283,7 @@ func oldname(s *types.Sym) *Node { ...@@ -284,7 +283,7 @@ func oldname(s *types.Sym) *Node {
// the := it looks like a reference to the outer x so we'll // the := it looks like a reference to the outer x so we'll
// make x a closure variable unnecessarily. // make x a closure variable unnecessarily.
c := n.Name.Param.Innermost c := n.Name.Param.Innermost
if c == nil || c.Name.Funcdepth != funcdepth { if c == nil || c.Name.Curfn != Curfn {
// Do not have a closure var for the active closure yet; make one. // Do not have a closure var for the active closure yet; make one.
c = newname(s) c = newname(s)
c.SetClass(PAUTOHEAP) c.SetClass(PAUTOHEAP)
...@@ -292,7 +291,6 @@ func oldname(s *types.Sym) *Node { ...@@ -292,7 +291,6 @@ func oldname(s *types.Sym) *Node {
c.SetIsddd(n.Isddd()) c.SetIsddd(n.Isddd())
c.Name.Defn = n c.Name.Defn = n
c.SetAddable(false) c.SetAddable(false)
c.Name.Funcdepth = funcdepth
// Link into list of active closure variables. // Link into list of active closure variables.
// Popped from list in func closurebody. // Popped from list in func closurebody.
...@@ -384,12 +382,14 @@ func ifacedcl(n *Node) { ...@@ -384,12 +382,14 @@ func ifacedcl(n *Node) {
// returns in auto-declaration context. // returns in auto-declaration context.
func funchdr(n *Node) { func funchdr(n *Node) {
// change the declaration context from extern to auto // change the declaration context from extern to auto
if funcdepth == 0 && dclcontext != PEXTERN { if Curfn == nil && dclcontext != PEXTERN {
Fatalf("funchdr: dclcontext = %d", dclcontext) Fatalf("funchdr: dclcontext = %d", dclcontext)
} }
dclcontext = PAUTO dclcontext = PAUTO
funcstart(n) types.Markdcl()
funcstack = append(funcstack, Curfn)
Curfn = n
if n.Func.Nname != nil { if n.Func.Nname != nil {
funcargs(n.Func.Nname.Name.Param.Ntype) funcargs(n.Func.Nname.Name.Param.Ntype)
...@@ -523,16 +523,6 @@ func funcargs2(t *types.Type) { ...@@ -523,16 +523,6 @@ func funcargs2(t *types.Type) {
} }
var funcstack []*Node // stack of previous values of Curfn var funcstack []*Node // stack of previous values of Curfn
var funcdepth int32 // len(funcstack) during parsing, but then forced to be the same later during compilation
// start the function.
// called before funcargs; undone at end of funcbody.
func funcstart(n *Node) {
types.Markdcl()
funcstack = append(funcstack, Curfn)
funcdepth++
Curfn = n
}
// finish the body. // finish the body.
// called in auto-declaration context. // called in auto-declaration context.
...@@ -544,8 +534,7 @@ func funcbody() { ...@@ -544,8 +534,7 @@ func funcbody() {
} }
types.Popdcl() types.Popdcl()
funcstack, Curfn = funcstack[:len(funcstack)-1], funcstack[len(funcstack)-1] funcstack, Curfn = funcstack[:len(funcstack)-1], funcstack[len(funcstack)-1]
funcdepth-- if Curfn == nil {
if funcdepth == 0 {
dclcontext = PEXTERN dclcontext = PEXTERN
} }
} }
......
...@@ -436,13 +436,6 @@ func (n *Node) jconv(s fmt.State, flag FmtFlag) { ...@@ -436,13 +436,6 @@ func (n *Node) jconv(s fmt.State, flag FmtFlag) {
fmt.Fprintf(s, " colas(%v)", n.Colas()) fmt.Fprintf(s, " colas(%v)", n.Colas())
} }
if n.Name != nil && n.Name.Funcdepth != 0 {
fmt.Fprintf(s, " f(%d)", n.Name.Funcdepth)
}
if n.Func != nil && n.Func.Depth != 0 {
fmt.Fprintf(s, " ff(%d)", n.Func.Depth)
}
switch n.Esc { switch n.Esc {
case EscUnknown: case EscUnknown:
break break
......
...@@ -204,13 +204,11 @@ func funccompile(fn *Node) { ...@@ -204,13 +204,11 @@ func funccompile(fn *Node) {
} }
dclcontext = PAUTO dclcontext = PAUTO
funcdepth = fn.Func.Depth + 1
Curfn = fn Curfn = fn
compile(fn) compile(fn)
Curfn = nil Curfn = nil
funcdepth = 0
dclcontext = PEXTERN dclcontext = PEXTERN
} }
......
...@@ -22,8 +22,8 @@ func TestSizeof(t *testing.T) { ...@@ -22,8 +22,8 @@ func TestSizeof(t *testing.T) {
_32bit uintptr // size on 32bit platforms _32bit uintptr // size on 32bit platforms
_64bit uintptr // size on 64bit platforms _64bit uintptr // size on 64bit platforms
}{ }{
{Func{}, 132, 232}, {Func{}, 128, 232},
{Name{}, 36, 56}, {Name{}, 32, 56},
{Param{}, 28, 56}, {Param{}, 28, 56},
{Node{}, 76, 128}, {Node{}, 76, 128},
} }
......
...@@ -242,7 +242,6 @@ type Name struct { ...@@ -242,7 +242,6 @@ type Name struct {
Param *Param // additional fields for ONAME, OTYPE Param *Param // additional fields for ONAME, OTYPE
Decldepth int32 // declaration loop depth, increased for every loop or label Decldepth int32 // declaration loop depth, increased for every loop or label
Vargen int32 // unique name for ONAME within a function. Function outputs are numbered starting at one. Vargen int32 // unique name for ONAME within a function. Function outputs are numbered starting at one.
Funcdepth int32
used bool // for variable declared and not used error used bool // for variable declared and not used error
flags bitset8 flags bitset8
...@@ -433,7 +432,6 @@ type Func struct { ...@@ -433,7 +432,6 @@ type Func struct {
Inl Nodes // copy of the body for use in inlining Inl Nodes // copy of the body for use in inlining
InlCost int32 InlCost int32
Depth int32
Label int32 // largest auto-generated label in this function Label int32 // largest auto-generated label in this function
......
...@@ -3868,9 +3868,6 @@ func wrapCall(n *Node, init *Nodes) *Node { ...@@ -3868,9 +3868,6 @@ func wrapCall(n *Node, init *Nodes) *Node {
args = append(args, a.Left) args = append(args, a.Left)
} }
oldfn := Curfn
Curfn = nil
wrapCall_prgen++ wrapCall_prgen++
sym := lookupN("wrap·", wrapCall_prgen) sym := lookupN("wrap·", wrapCall_prgen)
fn := dclfunc(sym, t) fn := dclfunc(sym, t)
...@@ -3885,7 +3882,6 @@ func wrapCall(n *Node, init *Nodes) *Node { ...@@ -3885,7 +3882,6 @@ func wrapCall(n *Node, init *Nodes) *Node {
fn = typecheck(fn, Etop) fn = typecheck(fn, Etop)
typecheckslice(fn.Nbody.Slice(), Etop) typecheckslice(fn.Nbody.Slice(), Etop)
xtop = append(xtop, fn) xtop = append(xtop, fn)
Curfn = oldfn
a = nod(OCALL, nil, nil) a = nod(OCALL, nil, nil)
a.Left = fn.Func.Nname a.Left = fn.Func.Nname
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment