mirror of
https://github.com/golang/go
synced 2024-09-05 07:54:46 +00:00
[dev.typeparams] cmd/compile: remove SetClosureCalled(false) hacks
The current go/defer wrapping code goes to some length to clear ClosureCalled when a function call will end up not being called directly, and so it will need to use the context register. But we already have a flag to indicate we need to use the context register: Needctxt. The real issue here is just that buildssa was using fn.ClosureCalled instead of fn.Needctxt. Change-Id: Ic9f5f23b66eb467fc61fa84eacb45d46c54133d2 Reviewed-on: https://go-review.googlesource.com/c/go/+/330329 Trust: Matthew Dempsky <mdempsky@google.com> Run-TryBot: Matthew Dempsky <mdempsky@google.com> Reviewed-by: Cuong Manh Le <cuong.manhle.vn@gmail.com>
This commit is contained in:
parent
107b1fce64
commit
70f4ab6565
|
@ -535,7 +535,7 @@ func buildssa(fn *ir.Func, worker int) *ssa.Func {
|
|||
}
|
||||
|
||||
// Populate closure variables.
|
||||
if !fn.ClosureCalled() {
|
||||
if fn.Needctxt() {
|
||||
clo := s.entryNewValue0(ssa.OpGetClosurePtr, s.f.Config.Types.BytePtr)
|
||||
offset := int64(types.PtrSize) // PtrSize to skip past function entry PC field
|
||||
for _, n := range fn.ClosureVars {
|
||||
|
|
|
@ -1566,7 +1566,6 @@ func (o *orderState) wrapGoDefer(n *ir.GoDeferStmt) {
|
|||
if len(callArgs) == 0 && call.Op() == ir.OCALLFUNC && callX.Type().NumResults() == 0 {
|
||||
if callX.Op() == ir.OCLOSURE {
|
||||
clo := callX.(*ir.ClosureExpr)
|
||||
clo.Func.SetClosureCalled(false)
|
||||
clo.IsGoWrap = true
|
||||
}
|
||||
return
|
||||
|
@ -1691,12 +1690,6 @@ func (o *orderState) wrapGoDefer(n *ir.GoDeferStmt) {
|
|||
// Deal with "defer returnsafunc()(x, y)" (for
|
||||
// example) by copying the callee expression.
|
||||
fnExpr = mkArgCopy(callX)
|
||||
if callX.Op() == ir.OCLOSURE {
|
||||
// For "defer func(...)", in addition to copying the
|
||||
// closure into a temp, mark it as no longer directly
|
||||
// called.
|
||||
callX.(*ir.ClosureExpr).Func.SetClosureCalled(false)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1770,8 +1763,6 @@ func (o *orderState) wrapGoDefer(n *ir.GoDeferStmt) {
|
|||
topcall := ir.NewCallExpr(n.Pos(), ir.OCALL, clo, nil)
|
||||
typecheck.Call(topcall)
|
||||
|
||||
fn.SetClosureCalled(false)
|
||||
|
||||
// Finally, point the defer statement at the newly generated call.
|
||||
n.Call = topcall
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue