* eval.c (setup_exception): do not exit by goto inside
  PUSH_TAG/POP_TAG.  it causes an infinite loop.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@58389 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2017-04-18 08:34:40 +00:00
Родитель a8faecc1e6
Коммит d9ea26de88
1 изменённых файлов: 4 добавлений и 6 удалений

10
eval.c
Просмотреть файл

@ -492,14 +492,11 @@ setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg, VALUE cause)
file = rb_source_loc(&line);
if ((file && !NIL_P(mesg)) || (cause != Qundef)) {
VALUE at;
int status;
TH_PUSH_TAG(th);
if ((status = EXEC_TAG()) == 0) {
VALUE bt;
if (rb_threadptr_set_raised(th)) goto fatal;
bt = rb_get_backtrace(mesg);
if (EXEC_TAG() == 0 && !(status = rb_threadptr_set_raised(th))) {
VALUE bt = rb_get_backtrace(mesg);
if (!NIL_P(bt) || cause == Qundef) {
if (OBJ_FROZEN(mesg)) {
mesg = rb_obj_dup(mesg);
@ -509,13 +506,14 @@ setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg, VALUE cause)
exc_setup_cause(mesg, cause);
}
if (NIL_P(bt)) {
at = rb_threadptr_backtrace_object(th);
VALUE at = rb_threadptr_backtrace_object(th);
rb_ivar_set(mesg, idBt_locations, at);
set_backtrace(mesg, at);
}
rb_threadptr_reset_raised(th);
}
TH_POP_TAG();
if (status) goto fatal;
}
if (!NIL_P(mesg)) {