mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-08 04:53:42 +00:00
eed4afda63
Emit fault checkpoints around compiler-generated runtime assertions so runtimePanicAt can unwind through the existing defer/recover machinery instead of aborting. This lets panics from bounds checks, type checks, and other compiler-inserted runtime checks be recovered by deferred functions. Mark functions that call recover as noinline. Inlining such a function into a deferred closure can make recover observe the wrong call context and report success when it should return nil. Addresses tinygo-org/tinygo issues 2759 and 3510.
47 lines
782 B
Plaintext
47 lines
782 B
Plaintext
# simple recover
|
|
running panic...
|
|
recovering...
|
|
recovered: panic
|
|
|
|
# recover with result
|
|
running panic...
|
|
recovered: panic
|
|
result: 3
|
|
|
|
# nested defer frame
|
|
deferred nested function
|
|
recovered: panic
|
|
|
|
# nested panic: panic inside recover
|
|
recovered 1: panic
|
|
recovered 2: foo
|
|
|
|
# panic inside defer
|
|
recovered: panic
|
|
|
|
# panic replace
|
|
panic 1
|
|
panic 2
|
|
recovered: panic 2
|
|
|
|
# defer panic
|
|
defer panic
|
|
recovered from deferred call: deferred panic
|
|
|
|
# indirect recover
|
|
indirect recover returned: indirect panic
|
|
|
|
# runtime.Goexit
|
|
Goexit deferred function, recover is nil: true
|
|
|
|
# repanic
|
|
inner, repanicking
|
|
outer recovered: repanic value
|
|
|
|
# recover runtime errors
|
|
recovered: index
|
|
recovered: index from helper
|
|
recovered: slice
|
|
recovered: type assert
|
|
recovered: empty interface type assert
|