mirror of
https://github.com/golang/go
synced 2024-11-19 13:44:52 -07:00
cmd/compile: don't inline functions that call recover
recover determines whether it's being called by a deferred frame by matching its caller's argument frame pointer with the one recorded in the panic object. That means its caller needs a valid and unique argument frame pointer, so it must not be inlined. With this fix, test/recover.go passes with -l=4. Fixes #23557. Change-Id: I1f32a624c49e387cfc67893a0829bb248d69c3d4 Reviewed-on: https://go-review.googlesource.com/90035 Run-TryBot: Austin Clements <austin@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
651ddbdb50
commit
b5b35be2b8
@ -314,12 +314,18 @@ func (v *hairyVisitor) visit(n *Node) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Things that are too hairy, irrespective of the budget
|
// Things that are too hairy, irrespective of the budget
|
||||||
case OCALL, OCALLINTER, OPANIC, ORECOVER:
|
case OCALL, OCALLINTER, OPANIC:
|
||||||
if Debug['l'] < 4 {
|
if Debug['l'] < 4 {
|
||||||
v.reason = "non-leaf op " + n.Op.String()
|
v.reason = "non-leaf op " + n.Op.String()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case ORECOVER:
|
||||||
|
// recover matches the argument frame pointer to find
|
||||||
|
// the right panic value, so it needs an argument frame.
|
||||||
|
v.reason = "call to recover"
|
||||||
|
return true
|
||||||
|
|
||||||
case OCLOSURE,
|
case OCLOSURE,
|
||||||
OCALLPART,
|
OCALLPART,
|
||||||
ORANGE,
|
ORANGE,
|
||||||
|
Loading…
Reference in New Issue
Block a user