]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: delete Func.Outer
authorRuss Cox <rsc@golang.org>
Fri, 27 May 2016 03:43:19 +0000 (23:43 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 27 May 2016 15:33:01 +0000 (15:33 +0000)
This was just storage for a linked list.

Change-Id: I850e8db1e1f5e72410f5c904be9409179b56a94a
Reviewed-on: https://go-review.googlesource.com/23484
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/gc/dcl.go
src/cmd/compile/internal/gc/go.go
src/cmd/compile/internal/gc/sizeof_test.go
src/cmd/compile/internal/gc/syntax.go

index b22b6cdde5f0b763f7d922954795c726ca731687..12a217753ac31b16ee5ce479042f090ae143d9d5 100644 (file)
@@ -505,10 +505,8 @@ func ifacedcl(n *Node) {
        n.Func = new(Func)
        n.Func.FCurfn = Curfn
        dclcontext = PPARAM
-       markdcl()
-       Funcdepth++
-       n.Func.Outer = Curfn
-       Curfn = n
+       
+       funcstart(n)
        funcargs(n.Right)
 
        // funcbody is normally called after the parser has
@@ -535,11 +533,7 @@ func funchdr(n *Node) {
        }
 
        dclcontext = PAUTO
-       markdcl()
-       Funcdepth++
-
-       n.Func.Outer = Curfn
-       Curfn = n
+       funcstart(n)
 
        if n.Func.Nname != nil {
                funcargs(n.Func.Nname.Name.Param.Ntype)
@@ -672,6 +666,19 @@ func funcargs2(t *Type) {
        }
 }
 
+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) {
+       markdcl()
+       funcstack = append(funcstack, Curfn)
+       Funcdepth++
+       Curfn = n
+}
+
 // finish the body.
 // called in auto-declaration context.
 // returns in extern-declaration context.
@@ -681,9 +688,8 @@ func funcbody(n *Node) {
                Fatalf("funcbody: unexpected dclcontext %d", dclcontext)
        }
        popdcl()
+       funcstack, Curfn = funcstack[:len(funcstack)-1], funcstack[len(funcstack)-1]
        Funcdepth--
-       Curfn = n.Func.Outer
-       n.Func.Outer = nil
        if Funcdepth == 0 {
                dclcontext = PEXTERN
        }
index fedc785aeedb9f407bb89fdbe5c51feaa32c2a49..b6b858c0d980c86c3c3c78b50b8b1c50450d5779 100644 (file)
@@ -259,8 +259,6 @@ var Widthreg int
 
 var nblank *Node
 
-var Funcdepth int32
-
 var typecheckok bool
 
 var compiling_runtime bool
index a01da13883e5a9c95a24504e533753070647b1c0..c474c47ddbdcedf54f27f6d9c836b5cf5c250097 100644 (file)
@@ -23,7 +23,7 @@ func TestSizeof(t *testing.T) {
                _64bit uintptr     // size on 64bit platforms
        }{
                {Flow{}, 52, 88},
-               {Func{}, 96, 168},
+               {Func{}, 92, 160},
                {Name{}, 52, 80},
                {Node{}, 92, 144},
                {Sym{}, 60, 112},
index 89c96cb2d8b9ababe93ea0ff7473ebd791ee76da..cd4f2e6d62d8b455fa1a8e10c634f4263c53433a 100644 (file)
@@ -199,9 +199,8 @@ type Func struct {
        Dcl        []*Node // autodcl for this func/closure
        Inldcl     Nodes   // copy of dcl for use in inlining
        Closgen    int
-       Outerfunc  *Node
+       Outerfunc  *Node // outer function (for closure)
        FieldTrack map[*Sym]struct{}
-       Outer      *Node // outer func for closure
        Ntype      *Node // signature
        Top        int   // top context (Ecall, Eproc, etc)
        Closure    *Node // OCLOSURE <-> ODCLFUNC