Skip to content

Commit 39fa7a1

Browse files
committed
compiler: support panics inside indirect deferred functions
Found this bug while working on WebAssembly recover support.
1 parent a8a532f commit 39fa7a1

File tree

3 files changed

+35
-2
lines changed

3 files changed

+35
-2
lines changed

compiler/defer.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -528,7 +528,7 @@ func (b *builder) createRunDefers() {
528528
forwardParams = append(forwardParams, llvm.Undef(b.dataPtrType))
529529
}
530530

531-
b.createCall(fnType, fnPtr, forwardParams, "")
531+
b.createInvoke(fnType, fnPtr, forwardParams, "")
532532

533533
case *ssa.Function:
534534
// Direct call.
@@ -583,7 +583,7 @@ func (b *builder) createRunDefers() {
583583

584584
// Call deferred function.
585585
fnType, llvmFn := b.getFunction(fn)
586-
b.createCall(fnType, llvmFn, forwardParams, "")
586+
b.createInvoke(fnType, llvmFn, forwardParams, "")
587587
case *ssa.Builtin:
588588
db := b.deferBuiltinFuncs[callback]
589589

testdata/recover.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,12 @@ func main() {
1717
println("\n# panic inside defer")
1818
panicInsideDefer()
1919

20+
println("\n# panic inside indirect defer")
21+
panicInsideIndirectDefer(callPanic)
22+
23+
println("\n# panic inside closure")
24+
panicInsideClosure()
25+
2026
println("\n# panic replace")
2127
panicReplace()
2228
}
@@ -77,6 +83,27 @@ func panicInsideDefer() {
7783
}()
7884
}
7985

86+
func panicInsideIndirectDefer(callback func()) {
87+
defer func() {
88+
printitf("recovered:", recover())
89+
}()
90+
defer callback()
91+
}
92+
93+
func callPanic() {
94+
panic("panic")
95+
}
96+
97+
func panicInsideClosure() {
98+
msg := "panic"
99+
defer func() {
100+
printitf("recovered:", recover())
101+
}()
102+
defer func() {
103+
panic(msg)
104+
}()
105+
}
106+
80107
func panicReplace() {
81108
defer func() {
82109
printitf("recovered:", recover())

testdata/recover.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ recovered 2: foo
1919
# panic inside defer
2020
recovered: panic
2121

22+
# panic inside indirect defer
23+
recovered: panic
24+
25+
# panic inside closure
26+
recovered: panic
27+
2228
# panic replace
2329
panic 1
2430
panic 2

0 commit comments

Comments
 (0)