mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.typeparams] all: merge dev.regabi (d9acf6f) into dev.typeparams
Conflicts: - src/cmd/compile/fmtmap_test.go Merge List: + 2021-01-12d9acf6f3a3[dev.regabi] cmd/compile: remove Func.ClosureType + 2021-01-1241352fd401[dev.regabi] cmd/compile: transform closures during walk + 2021-01-12d6ad88b4db[dev.regabi] cmd/compile: compile functions before closures + 2021-01-12432f9ffb11[dev.regabi] cmd/compile: unindent compileFunctions + 2021-01-12cc90e7a51e[dev.regabi] cmd/compile: always use the compile queue + 2021-01-12cd5b74d2df[dev.regabi] cmd/compile: call NeedFuncSym in InitLSym + 2021-01-1295acd8121b[dev.regabi] cmd/compile: remove Name.Typegen + 2021-01-1212ee55ba7b[dev.regabi] cmd/compile: stop using Vargen for import/export + 2021-01-12b4d2a0445b[dev.regabi] cmd/compile: refactor closure var setup/teardown + 2021-01-12f57f484053[dev.regabi] cmd/compile: decouple escape analysis from Name.Vargen + 2021-01-107fd84c6e46[dev.regabi] cmd/compile: remove OCLOSUREREAD + 2021-01-10c9c26d7ffb[dev.regabi] cmd/compile: use ClosureVars for method value wrappers + 2021-01-10950cf4d46c[dev.regabi] cmd/compile: bind closure vars during SSA constructions + 2021-01-108b2efa990b[dev.regabi] cmd/compile: deref PAUTOHEAPs during SSA construction + 2021-01-086ee9b118a2[dev.regabi] cmd/compile: remove fmt_test code; it has outlived its usefulness + 2021-01-08b241938e04[dev.regabi] cmd/compile: fix some methods error text Change-Id: I9a530f9a78b16e2bb14ea0a4ecbd9a75f9350342
This commit is contained in:
commit
f065ff221b
37 changed files with 639 additions and 1264 deletions
|
|
@ -1888,7 +1888,6 @@ func fakeRecv() *ir.Field {
|
|||
|
||||
func (p *noder) funcLit(expr *syntax.FuncLit) ir.Node {
|
||||
xtype := p.typeExpr(expr.Type)
|
||||
ntype := p.typeExpr(expr.Type)
|
||||
|
||||
fn := ir.NewFunc(p.pos(expr))
|
||||
fn.SetIsHiddenClosure(ir.CurFunc != nil)
|
||||
|
|
@ -1899,50 +1898,11 @@ func (p *noder) funcLit(expr *syntax.FuncLit) ir.Node {
|
|||
fn.Nname.Defn = fn
|
||||
|
||||
clo := ir.NewClosureExpr(p.pos(expr), fn)
|
||||
fn.ClosureType = ntype
|
||||
fn.OClosure = clo
|
||||
|
||||
p.funcBody(fn, expr.Body)
|
||||
|
||||
// closure-specific variables are hanging off the
|
||||
// ordinary ones in the symbol table; see oldname.
|
||||
// unhook them.
|
||||
// make the list of pointers for the closure call.
|
||||
for _, v := range fn.ClosureVars {
|
||||
// Unlink from v1; see comment in syntax.go type Param for these fields.
|
||||
v1 := v.Defn
|
||||
v1.Name().Innermost = v.Outer
|
||||
|
||||
// If the closure usage of v is not dense,
|
||||
// we need to make it dense; now that we're out
|
||||
// of the function in which v appeared,
|
||||
// look up v.Sym in the enclosing function
|
||||
// and keep it around for use in the compiled code.
|
||||
//
|
||||
// That is, suppose we just finished parsing the innermost
|
||||
// closure f4 in this code:
|
||||
//
|
||||
// func f() {
|
||||
// v := 1
|
||||
// func() { // f2
|
||||
// use(v)
|
||||
// func() { // f3
|
||||
// func() { // f4
|
||||
// use(v)
|
||||
// }()
|
||||
// }()
|
||||
// }()
|
||||
// }
|
||||
//
|
||||
// At this point v.Outer is f2's v; there is no f3's v.
|
||||
// To construct the closure f4 from within f3,
|
||||
// we need to use f3's v and in this case we need to create f3's v.
|
||||
// We are now in the context of f3, so calling oldname(v.Sym)
|
||||
// obtains f3's v, creating it if necessary (as it is in the example).
|
||||
//
|
||||
// capturevars will decide whether to use v directly or &v.
|
||||
v.Outer = oldname(v.Sym()).(*ir.Name)
|
||||
}
|
||||
ir.FinishCaptureNames(base.Pos, ir.CurFunc, fn)
|
||||
|
||||
return clo
|
||||
}
|
||||
|
|
@ -1976,32 +1936,12 @@ func oldname(s *types.Sym) ir.Node {
|
|||
return ir.NewIdent(base.Pos, s)
|
||||
}
|
||||
|
||||
if ir.CurFunc != nil && n.Op() == ir.ONAME && n.Name().Curfn != nil && n.Name().Curfn != ir.CurFunc {
|
||||
// Inner func is referring to var in outer func.
|
||||
//
|
||||
if n, ok := n.(*ir.Name); ok {
|
||||
// TODO(rsc): If there is an outer variable x and we
|
||||
// are parsing x := 5 inside the closure, until we get to
|
||||
// the := it looks like a reference to the outer x so we'll
|
||||
// make x a closure variable unnecessarily.
|
||||
n := n.(*ir.Name)
|
||||
c := n.Innermost
|
||||
if c == nil || c.Curfn != ir.CurFunc {
|
||||
// Do not have a closure var for the active closure yet; make one.
|
||||
c = typecheck.NewName(s)
|
||||
c.Class = ir.PAUTOHEAP
|
||||
c.SetIsClosureVar(true)
|
||||
c.Defn = n
|
||||
|
||||
// Link into list of active closure variables.
|
||||
// Popped from list in func funcLit.
|
||||
c.Outer = n.Innermost
|
||||
n.Innermost = c
|
||||
|
||||
ir.CurFunc.ClosureVars = append(ir.CurFunc.ClosureVars, c)
|
||||
}
|
||||
|
||||
// return ref to closure var, not original
|
||||
return c
|
||||
return ir.CaptureName(base.Pos, ir.CurFunc, n)
|
||||
}
|
||||
|
||||
return n
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue