mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-14 07:53:40 +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))
|
forwardParams = append(forwardParams, llvm.Undef(b.dataPtrType))
|
||||||
}
|
}
|
||||||
|
|
||||||
b.createCall(fnType, fnPtr, forwardParams, "")
|
b.createInvoke(fnType, fnPtr, forwardParams, "")
|
||||||
|
|
||||||
case *ssa.Function:
|
case *ssa.Function:
|
||||||
// Direct call.
|
// Direct call.
|
||||||
@@ -583,7 +583,7 @@ func (b *builder) createRunDefers() {
|
|||||||
|
|
||||||
// Call deferred function.
|
// Call deferred function.
|
||||||
fnType, llvmFn := b.getFunction(fn)
|
fnType, llvmFn := b.getFunction(fn)
|
||||||
b.createCall(fnType, llvmFn, forwardParams, "")
|
b.createInvoke(fnType, llvmFn, forwardParams, "")
|
||||||
case *ssa.Builtin:
|
case *ssa.Builtin:
|
||||||
db := b.deferBuiltinFuncs[callback]
|
db := b.deferBuiltinFuncs[callback]
|
||||||
|
|
||||||
|
|||||||
Vendored
+27
@@ -17,6 +17,12 @@ func main() {
|
|||||||
println("\n# panic inside defer")
|
println("\n# panic inside defer")
|
||||||
panicInsideDefer()
|
panicInsideDefer()
|
||||||
|
|
||||||
|
println("\n# panic inside indirect defer")
|
||||||
|
panicInsideIndirectDefer(callPanic)
|
||||||
|
|
||||||
|
println("\n# panic inside closure")
|
||||||
|
panicInsideClosure()
|
||||||
|
|
||||||
println("\n# panic replace")
|
println("\n# panic replace")
|
||||||
panicReplace()
|
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() {
|
func panicReplace() {
|
||||||
defer func() {
|
defer func() {
|
||||||
printitf("recovered:", recover())
|
printitf("recovered:", recover())
|
||||||
|
|||||||
Vendored
+6
@@ -19,6 +19,12 @@ recovered 2: foo
|
|||||||
# panic inside defer
|
# panic inside defer
|
||||||
recovered: panic
|
recovered: panic
|
||||||
|
|
||||||
|
# panic inside indirect defer
|
||||||
|
recovered: panic
|
||||||
|
|
||||||
|
# panic inside closure
|
||||||
|
recovered: panic
|
||||||
|
|
||||||
# panic replace
|
# panic replace
|
||||||
panic 1
|
panic 1
|
||||||
panic 2
|
panic 2
|
||||||
|
|||||||
Reference in New Issue
Block a user