mirror of
https://github.com/golang/go
synced 2024-11-23 00:00:07 -07:00
cmd/compile: escape "go" wrapper closure everywhere
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 <cherryyz@google.com> Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
parent
cfac62a1cc
commit
1b0a031680
@ -1582,10 +1582,8 @@ func (o *orderState) wrapGoDefer(n *ir.GoDeferStmt) {
|
|||||||
// (needs heap allocation).
|
// (needs heap allocation).
|
||||||
cloEscapes := func() bool {
|
cloEscapes := func() bool {
|
||||||
if n.Op() == ir.OGO {
|
if n.Op() == ir.OGO {
|
||||||
// For "go", assume that all closures escape (with an
|
// For "go", assume that all closures escape.
|
||||||
// exception for the runtime, which doesn't permit
|
return true
|
||||||
// heap-allocated closures).
|
|
||||||
return base.Ctxt.Pkgpath != "runtime"
|
|
||||||
}
|
}
|
||||||
// For defer, just use whatever result escape analysis
|
// For defer, just use whatever result escape analysis
|
||||||
// has determined for the defer.
|
// has determined for the defer.
|
||||||
|
Loading…
Reference in New Issue
Block a user