Skip to content

Commit

Permalink
cmd/compile: escape "go" wrapper closure everywhere
Browse files Browse the repository at this point in the history
For go statement, the wrapper closure needs to esacpe because it
runs asynchronously. Currently, it is not allowed for closures to
escape in the runtime. We have worked around this in the runtime,
so it doesn't "go" any function with arguments and so doesn't
need wrapping. If it ever does, it is not that we can have the
closure not escape, which may lead to miscompilation. Instead,
make the closure escape (which will fail the compilation). In the
future we may allow go'd closure to escape in the runtime.

Change-Id: I5bbe47b524371d2270c242f6c275013cd52abfc1
Reviewed-on: https://go-review.googlesource.com/c/go/+/312889
Trust: Cherry Zhang <[email protected]>
Reviewed-by: Than McIntosh <[email protected]>
  • Loading branch information
cherrymui committed Apr 23, 2021
1 parent cfac62a commit 1b0a031
Showing 1 changed file with 2 additions and 4 deletions.
6 changes: 2 additions & 4 deletions src/cmd/compile/internal/walk/order.go
Original file line number Diff line number Diff line change
Expand Up @@ -1582,10 +1582,8 @@ func (o *orderState) wrapGoDefer(n *ir.GoDeferStmt) {
// (needs heap allocation).
cloEscapes := func() bool {
if n.Op() == ir.OGO {
// For "go", assume that all closures escape (with an
// exception for the runtime, which doesn't permit
// heap-allocated closures).
return base.Ctxt.Pkgpath != "runtime"
// For "go", assume that all closures escape.
return true
}
// For defer, just use whatever result escape analysis
// has determined for the defer.
Expand Down

0 comments on commit 1b0a031

Please sign in to comment.