aboutsummaryrefslogtreecommitdiffstats
path: root/eval_error.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2023-07-19 01:27:45 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2023-07-19 03:40:05 +0900
commitfe4d906f5fbacbe6e9267af3bd3503339bad63a9 (patch)
tree504787b149ac6212203202572189b8aa93266486 /eval_error.c
parentac7d34026aced2d38045fae05676d9c1605aa08d (diff)
downloadruby-fe4d906f5fbacbe6e9267af3bd3503339bad63a9.tar.gz
[Bug #19774] Fix segfault at `return` in `END`
Diffstat (limited to 'eval_error.c')
-rw-r--r--eval_error.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/eval_error.c b/eval_error.c
index 04891f4369..bdce295f6e 100644
--- a/eval_error.c
+++ b/eval_error.c
@@ -461,7 +461,12 @@ exiting_split(VALUE errinfo, volatile int *exitcode, volatile int *sigstatus)
if (NIL_P(errinfo)) return 0;
- if (rb_obj_is_kind_of(errinfo, rb_eSystemExit)) {
+ if (THROW_DATA_P(errinfo)) {
+ int throw_state = ((const struct vm_throw_data *)errinfo)->throw_state;
+ ex = throw_state & VM_THROW_STATE_MASK;
+ result |= EXITING_WITH_STATUS;
+ }
+ else if (rb_obj_is_kind_of(errinfo, rb_eSystemExit)) {
ex = sysexit_status(errinfo);
result |= EXITING_WITH_STATUS;
}