error.c: redefined backtrace

* error.c (rb_get_backtrace): honor redefined Exception#backtrace
  method.  [ruby-core:78097] [Bug #12925]

* eval.c (setup_exception): rescue exceptions during backtrace
  setup.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56767 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2016-11-13 05:25:54 +00:00
parent d432839cbd
commit 7ab8dcebbf
3 changed files with 66 additions and 16 deletions

25
eval.c
View file

@ -507,13 +507,25 @@ setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg, VALUE cause)
rb_ivar_set(mesg, idBt_locations, at);
}
}
else if (NIL_P(rb_get_backtrace(mesg))) {
at = rb_vm_backtrace_object();
if (OBJ_FROZEN(mesg)) {
mesg = rb_obj_dup(mesg);
else {
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 (NIL_P(bt)) {
at = rb_vm_backtrace_object();
if (OBJ_FROZEN(mesg)) {
mesg = rb_obj_dup(mesg);
}
rb_ivar_set(mesg, idBt_locations, at);
set_backtrace(mesg, at);
}
rb_threadptr_reset_raised(th);
}
rb_ivar_set(mesg, idBt_locations, at);
set_backtrace(mesg, at);
TH_POP_TAG();
}
}
@ -556,6 +568,7 @@ setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg, VALUE cause)
}
if (rb_threadptr_set_raised(th)) {
fatal:
th->errinfo = exception_error;
rb_threadptr_reset_raised(th);
TH_JUMP_TAG(th, TAG_FATAL);