Commit 31a3b719 authored by Matthew Dempsky's avatar Matthew Dempsky

cmd/compile: cleanup genwrapper slightly

ORETJMP doesn't need an ONAME if we just set the target method on Sym
instead of Left. Conveniently, this is where fmt.go was looking for it
anyway.

Change the iface parameter and global compiling_wrappers to bool.

Passes toolstash-check.

Change-Id: I5333f8bcb4e06bf8161808041125eb95c439aafe
Reviewed-on: https://go-review.googlesource.com/68252
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarDaniel Martí <mvdan@mvdan.cc>
Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
parent a92a77c5
...@@ -198,7 +198,7 @@ var compiling_runtime bool ...@@ -198,7 +198,7 @@ var compiling_runtime bool
// Compiling the standard library // Compiling the standard library
var compiling_std bool var compiling_std bool
var compiling_wrappers int var compiling_wrappers bool
var use_writebarrier bool var use_writebarrier bool
......
...@@ -438,18 +438,18 @@ func methods(t *types.Type) []*Sig { ...@@ -438,18 +438,18 @@ func methods(t *types.Type) []*Sig {
if !sig.isym.Siggen() { if !sig.isym.Siggen() {
sig.isym.SetSiggen(true) sig.isym.SetSiggen(true)
if !eqtype(this, it) || this.Width < int64(Widthptr) { if !eqtype(this, it) || this.Width < int64(Widthptr) {
compiling_wrappers = 1 compiling_wrappers = true
genwrapper(it, f, sig.isym, 1) genwrapper(it, f, sig.isym, true)
compiling_wrappers = 0 compiling_wrappers = false
} }
} }
if !sig.tsym.Siggen() { if !sig.tsym.Siggen() {
sig.tsym.SetSiggen(true) sig.tsym.SetSiggen(true)
if !eqtype(this, t) { if !eqtype(this, t) {
compiling_wrappers = 1 compiling_wrappers = true
genwrapper(t, f, sig.tsym, 0) genwrapper(t, f, sig.tsym, false)
compiling_wrappers = 0 compiling_wrappers = false
} }
} }
} }
...@@ -500,7 +500,7 @@ func imethods(t *types.Type) []*Sig { ...@@ -500,7 +500,7 @@ func imethods(t *types.Type) []*Sig {
isym := methodsym(method, t, false) isym := methodsym(method, t, false)
if !isym.Siggen() { if !isym.Siggen() {
isym.SetSiggen(true) isym.SetSiggen(true)
genwrapper(t, f, isym, 0) genwrapper(t, f, isym, false)
} }
} }
......
...@@ -780,7 +780,7 @@ func (s *state) stmt(n *Node) { ...@@ -780,7 +780,7 @@ func (s *state) stmt(n *Node) {
s.stmtList(n.List) s.stmtList(n.List)
b := s.exit() b := s.exit()
b.Kind = ssa.BlockRetJmp // override BlockRet b.Kind = ssa.BlockRetJmp // override BlockRet
b.Aux = n.Left.Sym.Linksym() b.Aux = n.Sym.Linksym()
case OCONTINUE, OBREAK: case OCONTINUE, OBREAK:
var to *ssa.Block var to *ssa.Block
......
...@@ -1671,7 +1671,7 @@ func structargs(tl *types.Type, mustname bool) []*Node { ...@@ -1671,7 +1671,7 @@ func structargs(tl *types.Type, mustname bool) []*Node {
// rcvr - U // rcvr - U
// method - M func (t T)(), a TFIELD type struct // method - M func (t T)(), a TFIELD type struct
// newnam - the eventual mangled name of this function // newnam - the eventual mangled name of this function
func genwrapper(rcvr *types.Type, method *types.Field, newnam *types.Sym, iface int) { func genwrapper(rcvr *types.Type, method *types.Field, newnam *types.Sym, iface bool) {
if false && Debug['r'] != 0 { if false && Debug['r'] != 0 {
fmt.Printf("genwrapper rcvrtype=%v method=%v newnam=%v\n", rcvr, method, newnam) fmt.Printf("genwrapper rcvrtype=%v method=%v newnam=%v\n", rcvr, method, newnam)
} }
...@@ -1688,7 +1688,7 @@ func genwrapper(rcvr *types.Type, method *types.Field, newnam *types.Sym, iface ...@@ -1688,7 +1688,7 @@ func genwrapper(rcvr *types.Type, method *types.Field, newnam *types.Sym, iface
t := nod(OTFUNC, nil, nil) t := nod(OTFUNC, nil, nil)
l := []*Node{this} l := []*Node{this}
if iface != 0 && rcvr.Width < int64(Widthptr) { if iface && rcvr.Width < int64(Widthptr) {
// Building method for interface table and receiver // Building method for interface table and receiver
// is smaller than the single pointer-sized word // is smaller than the single pointer-sized word
// that the interface call will pass in. // that the interface call will pass in.
...@@ -1746,9 +1746,7 @@ func genwrapper(rcvr *types.Type, method *types.Field, newnam *types.Sym, iface ...@@ -1746,9 +1746,7 @@ func genwrapper(rcvr *types.Type, method *types.Field, newnam *types.Sym, iface
as := nod(OAS, this.Left, nod(OCONVNOP, dot, nil)) as := nod(OAS, this.Left, nod(OCONVNOP, dot, nil))
as.Right.Type = rcvr as.Right.Type = rcvr
fn.Nbody.Append(as) fn.Nbody.Append(as)
n := nod(ORETJMP, nil, nil) fn.Nbody.Append(nodSym(ORETJMP, nil, methodsym(method.Sym, methodrcvr, false)))
n.Left = newname(methodsym(method.Sym, methodrcvr, false))
fn.Nbody.Append(n)
// When tail-calling, we can't use a frame pointer. // When tail-calling, we can't use a frame pointer.
fn.Func.SetNoFramePointer(true) fn.Func.SetNoFramePointer(true)
} else { } else {
......
...@@ -266,7 +266,7 @@ func indexlit(n *Node) *Node { ...@@ -266,7 +266,7 @@ func indexlit(n *Node) *Node {
// n.Left = typecheck1(n.Left, top) // n.Left = typecheck1(n.Left, top)
func typecheck1(n *Node, top int) *Node { func typecheck1(n *Node, top int) *Node {
switch n.Op { switch n.Op {
case OXDOT, ODOT, ODOTPTR, ODOTMETH, ODOTINTER: case OXDOT, ODOT, ODOTPTR, ODOTMETH, ODOTINTER, ORETJMP:
// n.Sym is a field/method name, not a variable. // n.Sym is a field/method name, not a variable.
default: default:
if n.Sym != nil { if n.Sym != nil {
...@@ -2143,7 +2143,7 @@ func typecheck1(n *Node, top int) *Node { ...@@ -2143,7 +2143,7 @@ func typecheck1(n *Node, top int) *Node {
} }
} }
if safemode && !inimport && compiling_wrappers == 0 && t != nil && t.Etype == TUNSAFEPTR { if safemode && !inimport && !compiling_wrappers && t != nil && t.Etype == TUNSAFEPTR {
yyerror("cannot use unsafe.Pointer") yyerror("cannot use unsafe.Pointer")
} }
......
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