compiler: support panics inside indirect deferred functions

Found this bug while working on WebAssembly recover support.
This commit is contained in:
Ayke van Laethem
2024-08-04 15:37:50 +02:00
parent a47ff02c82
commit 2f7952ff29
3 changed files with 35 additions and 2 deletions
+2 -2
View File
@@ -528,7 +528,7 @@ func (b *builder) createRunDefers() {
forwardParams = append(forwardParams, llvm.Undef(b.dataPtrType))
}
b.createCall(fnType, fnPtr, forwardParams, "")
b.createInvoke(fnType, fnPtr, forwardParams, "")
case *ssa.Function:
// Direct call.
@@ -583,7 +583,7 @@ func (b *builder) createRunDefers() {
// Call deferred function.
fnType, llvmFn := b.getFunction(fn)
b.createCall(fnType, llvmFn, forwardParams, "")
b.createInvoke(fnType, llvmFn, forwardParams, "")
case *ssa.Builtin:
db := b.deferBuiltinFuncs[callback]
+27
View File
@@ -17,6 +17,12 @@ func main() {
println("\n# panic inside defer")
panicInsideDefer()
println("\n# panic inside indirect defer")
panicInsideIndirectDefer(callPanic)
println("\n# panic inside closure")
panicInsideClosure()
println("\n# panic replace")
panicReplace()
}
@@ -77,6 +83,27 @@ func panicInsideDefer() {
}()
}
func panicInsideIndirectDefer(callback func()) {
defer func() {
printitf("recovered:", recover())
}()
defer callback()
}
func callPanic() {
panic("panic")
}
func panicInsideClosure() {
msg := "panic"
defer func() {
printitf("recovered:", recover())
}()
defer func() {
panic(msg)
}()
}
func panicReplace() {
defer func() {
printitf("recovered:", recover())
+6
View File
@@ -19,6 +19,12 @@ recovered 2: foo
# panic inside defer
recovered: panic
# panic inside indirect defer
recovered: panic
# panic inside closure
recovered: panic
# panic replace
panic 1
panic 2