[dev.typeparams] cmd/compile: formalize "hidden parameters" idea

This CL formalizes the closure-var trick used for method-value
wrappers to be reusable for defining other functions that take hidden
parameters via the closure-context register. In particular, it:

1. Adds a new ir.NewHiddenParam function for creating hidden
parameters.

2. Changes ir.NewClosureVar to copy Type/Typecheck from the closure
variable, so that callers can needing to manually copy these.

3. Updates existing code accordingly (i.e., method-value wrappers to
start using ir.NewHiddenParam, and closure builders to stop copying
types).

Longer term, I anticipate using this to pass dictionaries to stenciled
functions within unified IR.

Change-Id: I9da3ffdb2a26d15c6e89a21b4e080686d6dc872c
Reviewed-on: https://go-review.googlesource.com/c/go/+/332612
Trust: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
Matthew Dempsky 2021-07-02 16:29:42 -07:00
parent 611056ec34
commit 5dac279fbd
8 changed files with 43 additions and 39 deletions

View file

@ -1623,11 +1623,7 @@ func (r *reader) funcLit() ir.Node {
fn.ClosureVars = make([]*ir.Name, 0, r.len())
for len(fn.ClosureVars) < cap(fn.ClosureVars) {
pos := r.pos()
outer := r.useLocal()
cv := ir.NewClosureVar(pos, fn, outer)
r.setType(cv, outer.Type())
ir.NewClosureVar(r.pos(), fn, r.useLocal())
}
r.addBody(fn)
@ -2204,17 +2200,10 @@ func (r *reader) methodValueWrapper(tbase *types.Type, method *types.Field, targ
pos := base.AutogeneratedPos
fn := r.newWrapperFunc(pos, sym, nil, method)
fn.SetNeedctxt(true)
sym.Def = fn
// Declare and initialize variable holding receiver.
recv := ir.NewNameAt(pos, typecheck.Lookup(".this"))
recv.Class = ir.PAUTOHEAP
recv.SetType(recvType)
recv.Curfn = fn
recv.SetIsClosureVar(true)
recv.SetByval(true)
fn.ClosureVars = append(fn.ClosureVars, recv)
recv := ir.NewHiddenParam(pos, fn, typecheck.Lookup(".this"), recvType)
addTailCall(pos, fn, recv, method)