mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-03 02:27:48 +00:00
compiler: support panics inside indirect deferred functions
Found this bug while working on WebAssembly recover support.
This commit is contained in:
+2
-2
@@ -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]
|
||||
|
||||
|
||||
Vendored
+27
@@ -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())
|
||||
|
||||
Vendored
+6
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user