From a7bccb20f87978ec7c49191d88cf51d51770f44d Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 18 Aug 2017 12:17:59 +0000 Subject: [PATCH] vm_insnhelper.c: raise ruby_error_sysstack_gc * vm_insnhelper.c (rb_threadptr_stack_overflow): rb_fatal is not available during GC. raise the preallocated fatal error. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@59618 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- eval.c | 1 + vm_core.h | 1 + vm_insnhelper.c | 4 +++- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/eval.c b/eval.c index 2b6f7849fd..c94fbe4275 100644 --- a/eval.c +++ b/eval.c @@ -1930,6 +1930,7 @@ Init_eval(void) rb_define_global_function("untrace_var", rb_f_untrace_var, -1); /* in variable.c */ rb_vm_register_special_exception(ruby_error_reenter, rb_eFatal, "exception reentered"); + rb_vm_register_special_exception(ruby_error_sysstack_gc, rb_eFatal, "machine stack overflow while GC is running."); id_signo = rb_intern_const("signo"); id_status = rb_intern_const("status"); diff --git a/vm_core.h b/vm_core.h index 5fc7b2b3ba..861cae0018 100644 --- a/vm_core.h +++ b/vm_core.h @@ -455,6 +455,7 @@ enum ruby_special_exceptions { ruby_error_reenter, ruby_error_nomemory, ruby_error_sysstack, + ruby_error_sysstack_gc, ruby_error_stream_closed, ruby_special_error_count }; diff --git a/vm_insnhelper.c b/vm_insnhelper.c index 303f9cc2fb..03b9d49e0e 100644 --- a/vm_insnhelper.c +++ b/vm_insnhelper.c @@ -57,7 +57,9 @@ void rb_threadptr_stack_overflow(rb_thread_t *th) { if (rb_during_gc()) { - rb_fatal("machine stack overflow while GC is running."); + th->ec.raised_flag = RAISED_STACKOVERFLOW; + th->ec.errinfo = th->vm->special_exceptions[ruby_error_sysstack_gc]; + TH_JUMP_TAG(th, TAG_RAISE); } #ifdef USE_SIGALTSTACK threadptr_stack_overflow(th, TRUE);