]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.typeparams] cmd/compile: set sym.Def to ir.Name for method value wrappers
authorMatthew Dempsky <mdempsky@google.com>
Tue, 3 Aug 2021 17:37:33 +0000 (10:37 -0700)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 3 Aug 2021 19:00:56 +0000 (19:00 +0000)
The code for generating method value wrappers is weird that it sets
sym.Def to the generated ir.Func, whereas normally sym.Def points to
ir.Name.

While here, change methodValueWrapper to return the ir.Name too, since
that's what the caller wants.

Change-Id: I3da5320ca0bf4d32d7b420345454f19075d19a26
Reviewed-on: https://go-review.googlesource.com/c/go/+/339410
Trust: Matthew Dempsky <mdempsky@google.com>
Trust: Cuong Manh Le <cuong.manhle.vn@gmail.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>
src/cmd/compile/internal/noder/reader.go
src/cmd/compile/internal/walk/closure.go

index 516bf8f1f748ad5c112384c600d412d04460b9cd..83979a91c8abdc24a41370e977f2b5541d9da927 100644 (file)
@@ -2253,7 +2253,7 @@ func (r *reader) methodValueWrapper(tbase *types.Type, method *types.Field, targ
        pos := base.AutogeneratedPos
 
        fn := r.newWrapperFunc(pos, sym, nil, method)
-       sym.Def = fn
+       sym.Def = fn.Nname
 
        // Declare and initialize variable holding receiver.
        recv := ir.NewHiddenParam(pos, fn, typecheck.Lookup(".this"), recvType)
index 2d0b2dcc0ee2ca9a5fa51fc9041165d25b60901a..902e01ef388ee39ee5046905c1edd024cd27921d 100644 (file)
@@ -179,7 +179,7 @@ func walkMethodValue(n *ir.SelectorExpr, init *ir.Nodes) ir.Node {
 
        clos := ir.NewCompLitExpr(base.Pos, ir.OCOMPLIT, ir.TypeNode(typ), nil)
        clos.SetEsc(n.Esc())
-       clos.List = []ir.Node{ir.NewUnaryExpr(base.Pos, ir.OCFUNC, methodValueWrapper(n).Nname), n.X}
+       clos.List = []ir.Node{ir.NewUnaryExpr(base.Pos, ir.OCFUNC, methodValueWrapper(n)), n.X}
 
        addr := typecheck.NodAddr(clos)
        addr.SetEsc(n.Esc())
@@ -199,11 +199,11 @@ func walkMethodValue(n *ir.SelectorExpr, init *ir.Nodes) ir.Node {
        return walkExpr(cfn, init)
 }
 
-// methodValueWrapper returns the DCLFUNC node representing the
+// methodValueWrapper returns the ONAME node representing the
 // wrapper function (*-fm) needed for the given method value. If the
 // wrapper function hasn't already been created yet, it's created and
 // added to typecheck.Target.Decls.
-func methodValueWrapper(dot *ir.SelectorExpr) *ir.Func {
+func methodValueWrapper(dot *ir.SelectorExpr) *ir.Name {
        if dot.Op() != ir.OMETHVALUE {
                base.Fatalf("methodValueWrapper: unexpected %v (%v)", dot, dot.Op())
        }
@@ -214,7 +214,7 @@ func methodValueWrapper(dot *ir.SelectorExpr) *ir.Func {
        sym := ir.MethodSymSuffix(rcvrtype, meth, "-fm")
 
        if sym.Uniq() {
-               return sym.Def.(*ir.Func)
+               return sym.Def.(*ir.Name)
        }
        sym.SetUniq(true)
 
@@ -262,10 +262,10 @@ func methodValueWrapper(dot *ir.SelectorExpr) *ir.Func {
        // typecheckslice() requires that Curfn is set when processing an ORETURN.
        ir.CurFunc = fn
        typecheck.Stmts(fn.Body)
-       sym.Def = fn
+       sym.Def = fn.Nname
        typecheck.Target.Decls = append(typecheck.Target.Decls, fn)
        ir.CurFunc = savecurfn
        base.Pos = saveLineNo
 
-       return fn
+       return fn.Nname
 }