Commit 922ce58d authored by Ian Lance Taylor's avatar Ian Lance Taylor

cmd/compile: change Func.Cvars to the new Nodes type

Update #14473.

Change-Id: Iba1ecf42d9ab5a93144941439d5cc6b0b4f4a3ac
Reviewed-on: https://go-review.googlesource.com/19992Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 7da4cedd
...@@ -67,7 +67,7 @@ func closurebody(body *NodeList) *Node { ...@@ -67,7 +67,7 @@ func closurebody(body *NodeList) *Node {
// ordinary ones in the symbol table; see oldname. // ordinary ones in the symbol table; see oldname.
// unhook them. // unhook them.
// make the list of pointers for the closure call. // make the list of pointers for the closure call.
for _, v := range func_.Func.Cvars() { for _, v := range func_.Func.Cvars.Slice() {
v.Name.Param.Closure.Name.Param.Closure = v.Name.Param.Outer v.Name.Param.Closure.Name.Param.Closure = v.Name.Param.Outer
v.Name.Param.Outerexpr = oldname(v.Sym) v.Name.Param.Outerexpr = oldname(v.Sym)
} }
...@@ -76,7 +76,7 @@ func closurebody(body *NodeList) *Node { ...@@ -76,7 +76,7 @@ func closurebody(body *NodeList) *Node {
} }
func typecheckclosure(func_ *Node, top int) { func typecheckclosure(func_ *Node, top int) {
for _, ln := range func_.Func.Cvars() { for _, ln := range func_.Func.Cvars.Slice() {
n := ln.Name.Param.Closure n := ln.Name.Param.Closure
if !n.Name.Captured { if !n.Name.Captured {
n.Name.Captured = true n.Name.Captured = true
...@@ -224,7 +224,7 @@ func capturevars(xfunc *Node) { ...@@ -224,7 +224,7 @@ func capturevars(xfunc *Node) {
func_ := xfunc.Func.Closure func_ := xfunc.Func.Closure
func_.Func.Enter.Set(nil) func_.Func.Enter.Set(nil)
for _, v := range func_.Func.Cvars() { for _, v := range func_.Func.Cvars.Slice() {
if v.Type == nil { if v.Type == nil {
// if v->type is nil, it means v looked like it was // if v->type is nil, it means v looked like it was
// going to be used in the closure but wasn't. // going to be used in the closure but wasn't.
...@@ -306,7 +306,7 @@ func transformclosure(xfunc *Node) { ...@@ -306,7 +306,7 @@ func transformclosure(xfunc *Node) {
var addr *Node var addr *Node
var fld *Type var fld *Type
for _, v := range func_.Func.Cvars() { for _, v := range func_.Func.Cvars.Slice() {
if v.Op == OXXX { if v.Op == OXXX {
continue continue
} }
...@@ -354,7 +354,7 @@ func transformclosure(xfunc *Node) { ...@@ -354,7 +354,7 @@ func transformclosure(xfunc *Node) {
offset := int64(Widthptr) offset := int64(Widthptr)
var addr *Node var addr *Node
var cv *Node var cv *Node
for _, v := range func_.Func.Cvars() { for _, v := range func_.Func.Cvars.Slice() {
if v.Op == OXXX { if v.Op == OXXX {
continue continue
} }
...@@ -406,7 +406,7 @@ func transformclosure(xfunc *Node) { ...@@ -406,7 +406,7 @@ func transformclosure(xfunc *Node) {
func walkclosure(func_ *Node, init **NodeList) *Node { func walkclosure(func_ *Node, init **NodeList) *Node {
// If no closure vars, don't bother wrapping. // If no closure vars, don't bother wrapping.
if len(func_.Func.Cvars()) == 0 { if len(func_.Func.Cvars.Slice()) == 0 {
return func_.Func.Closure.Func.Nname return func_.Func.Closure.Func.Nname
} }
...@@ -428,7 +428,7 @@ func walkclosure(func_ *Node, init **NodeList) *Node { ...@@ -428,7 +428,7 @@ func walkclosure(func_ *Node, init **NodeList) *Node {
typ.List = list1(Nod(ODCLFIELD, newname(Lookup(".F")), typenod(Types[TUINTPTR]))) typ.List = list1(Nod(ODCLFIELD, newname(Lookup(".F")), typenod(Types[TUINTPTR])))
var typ1 *Node var typ1 *Node
for _, v := range func_.Func.Cvars() { for _, v := range func_.Func.Cvars.Slice() {
if v.Op == OXXX { if v.Op == OXXX {
continue continue
} }
......
...@@ -426,7 +426,7 @@ func oldname(s *Sym) *Node { ...@@ -426,7 +426,7 @@ func oldname(s *Sym) *Node {
n.Name.Param.Closure = c n.Name.Param.Closure = c
c.Name.Param.Closure = n c.Name.Param.Closure = n
c.Xoffset = 0 c.Xoffset = 0
Curfn.Func.CvarAppend(c) Curfn.Func.Cvars.Append(c)
} }
// return ref to closure var, not original // return ref to closure var, not original
......
...@@ -864,7 +864,7 @@ func esc(e *EscState, n *Node, up *Node) { ...@@ -864,7 +864,7 @@ func esc(e *EscState, n *Node, up *Node) {
// Link addresses of captured variables to closure. // Link addresses of captured variables to closure.
case OCLOSURE: case OCLOSURE:
var a *Node var a *Node
for _, v := range n.Func.Cvars() { for _, v := range n.Func.Cvars.Slice() {
if v.Op == OXXX { // unnamed out argument; see dcl.go:/^funcargs if v.Op == OXXX { // unnamed out argument; see dcl.go:/^funcargs
continue continue
} }
......
...@@ -1137,7 +1137,7 @@ func orderexpr(np **Node, order *Order, lhs *Node) { ...@@ -1137,7 +1137,7 @@ func orderexpr(np **Node, order *Order, lhs *Node) {
} }
case OCLOSURE: case OCLOSURE:
if n.Noescape && len(n.Func.Cvars()) > 0 { if n.Noescape && len(n.Func.Cvars.Slice()) > 0 {
prealloc[n] = ordertemp(Types[TUINT8], order, false) // walk will fill in correct type prealloc[n] = ordertemp(Types[TUINT8], order, false) // walk will fill in correct type
} }
......
...@@ -475,7 +475,7 @@ func staticassign(l *Node, r *Node, out **NodeList) bool { ...@@ -475,7 +475,7 @@ func staticassign(l *Node, r *Node, out **NodeList) bool {
break break
case OCLOSURE: case OCLOSURE:
if len(r.Func.Cvars()) == 0 { if len(r.Func.Cvars.Slice()) == 0 {
// Closures with no captured variables are globals, // Closures with no captured variables are globals,
// so the assignment can be done at link time. // so the assignment can be done at link time.
n := *l n := *l
......
...@@ -151,7 +151,7 @@ type Func struct { ...@@ -151,7 +151,7 @@ type Func struct {
Shortname *Node Shortname *Node
Enter Nodes Enter Nodes
Exit Nodes Exit Nodes
cvars *[]*Node // closure params Cvars Nodes // closure params
Dcl []*Node // autodcl for this func/closure Dcl []*Node // autodcl for this func/closure
Inldcl *[]*Node // copy of dcl for use in inlining Inldcl *[]*Node // copy of dcl for use in inlining
Closgen int Closgen int
...@@ -177,27 +177,6 @@ type Func struct { ...@@ -177,27 +177,6 @@ type Func struct {
Needctxt bool // function uses context register (has closure variables) Needctxt bool // function uses context register (has closure variables)
} }
// Cvars returns the closure variables for this Func.
// These are referenced variables that are defined in enclosing
// functions.
// The cvars field is a pointer to save space, since most Func values
// have no cvars.
func (f *Func) Cvars() []*Node {
if f.cvars == nil {
return nil
}
return *f.cvars
}
// AppendCvar appends a new closure variable.
func (f *Func) CvarAppend(n *Node) {
if f.cvars == nil {
f.cvars = &[]*Node{n}
} else {
*f.cvars = append(*f.cvars, n)
}
}
type Op uint8 type Op uint8
// Node ops. // Node ops.
......
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