diff --git a/ChangeLog b/ChangeLog index 3d71434870..803e61f170 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +Sat Feb 20 14:36:16 2010 Yukihiro Matsumoto <matz@ruby-lang.org> + + * vm.c (vm_backtrace_each): use called_id when method definition + structure is already freed. [ruby-dev:40234] [ruby-core:27959] + Fri Feb 19 00:04:19 2010 Yusuke Endoh <mame@tsg.ne.jp> * lib/drb/drb.rb (DRbServer#stop_service): join killed thread to diff --git a/vm.c b/vm.c index 6cfea72e33..96a04bfcba 100644 --- a/vm.c +++ b/vm.c @@ -731,8 +731,14 @@ vm_backtrace_each(rb_thread_t *th, int lev, rb_backtrace_iter_func *iter, void * } } else if (RUBYVM_CFUNC_FRAME_P(cfp)) { + ID id; + if (NIL_P(file)) file = rb_str_new_cstr("ruby"); - if ((*iter)(arg, file, line_no, rb_id2str(cfp->me->def->original_id))) break; + if (cfp->me->def) + id = cfp->me->def->original_id; + else + id = cfp->me->called_id; + if ((*iter)(arg, file, line_no, rb_id2str(id))) break; } cfp = RUBY_VM_NEXT_CONTROL_FRAME(cfp); }