mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: change Func.Cvars to the new Nodes type
Update #14473. Change-Id: Iba1ecf42d9ab5a93144941439d5cc6b0b4f4a3ac Reviewed-on: https://go-review.googlesource.com/19992 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
7da4ceddd0
commit
922ce58de0
6 changed files with 12 additions and 33 deletions
|
|
@ -67,7 +67,7 @@ func closurebody(body *NodeList) *Node {
|
|||
// ordinary ones in the symbol table; see oldname.
|
||||
// unhook them.
|
||||
// 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.Outerexpr = oldname(v.Sym)
|
||||
}
|
||||
|
|
@ -76,7 +76,7 @@ func closurebody(body *NodeList) *Node {
|
|||
}
|
||||
|
||||
func typecheckclosure(func_ *Node, top int) {
|
||||
for _, ln := range func_.Func.Cvars() {
|
||||
for _, ln := range func_.Func.Cvars.Slice() {
|
||||
n := ln.Name.Param.Closure
|
||||
if !n.Name.Captured {
|
||||
n.Name.Captured = true
|
||||
|
|
@ -224,7 +224,7 @@ func capturevars(xfunc *Node) {
|
|||
|
||||
func_ := xfunc.Func.Closure
|
||||
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 is nil, it means v looked like it was
|
||||
// going to be used in the closure but wasn't.
|
||||
|
|
@ -306,7 +306,7 @@ func transformclosure(xfunc *Node) {
|
|||
|
||||
var addr *Node
|
||||
var fld *Type
|
||||
for _, v := range func_.Func.Cvars() {
|
||||
for _, v := range func_.Func.Cvars.Slice() {
|
||||
if v.Op == OXXX {
|
||||
continue
|
||||
}
|
||||
|
|
@ -354,7 +354,7 @@ func transformclosure(xfunc *Node) {
|
|||
offset := int64(Widthptr)
|
||||
var addr *Node
|
||||
var cv *Node
|
||||
for _, v := range func_.Func.Cvars() {
|
||||
for _, v := range func_.Func.Cvars.Slice() {
|
||||
if v.Op == OXXX {
|
||||
continue
|
||||
}
|
||||
|
|
@ -406,7 +406,7 @@ func transformclosure(xfunc *Node) {
|
|||
|
||||
func walkclosure(func_ *Node, init **NodeList) *Node {
|
||||
// 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
|
||||
}
|
||||
|
||||
|
|
@ -428,7 +428,7 @@ func walkclosure(func_ *Node, init **NodeList) *Node {
|
|||
|
||||
typ.List = list1(Nod(ODCLFIELD, newname(Lookup(".F")), typenod(Types[TUINTPTR])))
|
||||
var typ1 *Node
|
||||
for _, v := range func_.Func.Cvars() {
|
||||
for _, v := range func_.Func.Cvars.Slice() {
|
||||
if v.Op == OXXX {
|
||||
continue
|
||||
}
|
||||
|
|
|
|||
|
|
@ -426,7 +426,7 @@ func oldname(s *Sym) *Node {
|
|||
n.Name.Param.Closure = c
|
||||
c.Name.Param.Closure = n
|
||||
c.Xoffset = 0
|
||||
Curfn.Func.CvarAppend(c)
|
||||
Curfn.Func.Cvars.Append(c)
|
||||
}
|
||||
|
||||
// return ref to closure var, not original
|
||||
|
|
|
|||
|
|
@ -864,7 +864,7 @@ func esc(e *EscState, n *Node, up *Node) {
|
|||
// Link addresses of captured variables to closure.
|
||||
case OCLOSURE:
|
||||
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
|
||||
continue
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1137,7 +1137,7 @@ func orderexpr(np **Node, order *Order, lhs *Node) {
|
|||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -475,7 +475,7 @@ func staticassign(l *Node, r *Node, out **NodeList) bool {
|
|||
break
|
||||
|
||||
case OCLOSURE:
|
||||
if len(r.Func.Cvars()) == 0 {
|
||||
if len(r.Func.Cvars.Slice()) == 0 {
|
||||
// Closures with no captured variables are globals,
|
||||
// so the assignment can be done at link time.
|
||||
n := *l
|
||||
|
|
|
|||
|
|
@ -151,7 +151,7 @@ type Func struct {
|
|||
Shortname *Node
|
||||
Enter Nodes
|
||||
Exit Nodes
|
||||
cvars *[]*Node // closure params
|
||||
Cvars Nodes // closure params
|
||||
Dcl []*Node // autodcl for this func/closure
|
||||
Inldcl *[]*Node // copy of dcl for use in inlining
|
||||
Closgen int
|
||||
|
|
@ -177,27 +177,6 @@ type Func struct {
|
|||
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
|
||||
|
||||
// Node ops.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue