From 93369001c76e01b2fe8b0d8a5074d62d0b8fdc81 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Thu, 26 May 2016 23:43:19 -0400 Subject: [PATCH] cmd/compile: delete Func.Outer This was just storage for a linked list. Change-Id: I850e8db1e1f5e72410f5c904be9409179b56a94a Reviewed-on: https://go-review.googlesource.com/23484 Reviewed-by: David Chase --- src/cmd/compile/internal/gc/dcl.go | 28 +++++++++++++--------- src/cmd/compile/internal/gc/go.go | 2 -- src/cmd/compile/internal/gc/sizeof_test.go | 2 +- src/cmd/compile/internal/gc/syntax.go | 3 +-- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/src/cmd/compile/internal/gc/dcl.go b/src/cmd/compile/internal/gc/dcl.go index b22b6cdde5f..12a217753ac 100644 --- a/src/cmd/compile/internal/gc/dcl.go +++ b/src/cmd/compile/internal/gc/dcl.go @@ -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 } diff --git a/src/cmd/compile/internal/gc/go.go b/src/cmd/compile/internal/gc/go.go index fedc785aeed..b6b858c0d98 100644 --- a/src/cmd/compile/internal/gc/go.go +++ b/src/cmd/compile/internal/gc/go.go @@ -259,8 +259,6 @@ var Widthreg int var nblank *Node -var Funcdepth int32 - var typecheckok bool var compiling_runtime bool diff --git a/src/cmd/compile/internal/gc/sizeof_test.go b/src/cmd/compile/internal/gc/sizeof_test.go index a01da13883e..c474c47ddbd 100644 --- a/src/cmd/compile/internal/gc/sizeof_test.go +++ b/src/cmd/compile/internal/gc/sizeof_test.go @@ -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}, diff --git a/src/cmd/compile/internal/gc/syntax.go b/src/cmd/compile/internal/gc/syntax.go index 89c96cb2d8b..cd4f2e6d62d 100644 --- a/src/cmd/compile/internal/gc/syntax.go +++ b/src/cmd/compile/internal/gc/syntax.go @@ -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