compiler: make map and channel panics recoverable

Change hashmap set operations and channel send/close from
createRuntimeCall to createRuntimeInvoke. This places a setjmp
checkpoint before each call, allowing runtimePanicAt to safely
longjmp when these operations panic.
This commit is contained in:
Jake Bailey
2026-05-10 15:55:36 -07:00
committed by Ron Evans
parent eed4afda63
commit 039f48f3d2
4 changed files with 29 additions and 4 deletions
+20
View File
@@ -41,6 +41,9 @@ func main() {
println("\n# recover runtime errors")
recoverRuntimeError()
println("\n# recover from nil map and closed channel")
recoverNilMapAndChan()
}
func recoverSimple() {
@@ -241,3 +244,20 @@ func recoverMustPanic(name string, f func()) {
}()
f()
}
// Test recovering from nil map assignment and closed channel send.
func recoverNilMapAndChan() {
recoverMustPanic("nil map", func() {
var m map[string]int
m["x"] = 1
})
recoverMustPanic("closed chan", func() {
ch := make(chan int)
close(ch)
ch <- 1
})
recoverMustPanic("close nil chan", func() {
var ch chan int
close(ch)
})
}
+5
View File
@@ -44,3 +44,8 @@ outer recovered: repanic value
recovered: slice
recovered: type assert
recovered: empty interface type assert
# recover from nil map and closed channel
recovered: nil map
recovered: closed chan
recovered: close nil chan