From: Nobuyoshi Nakada Date: 2007-07-19T16:10:43+09:00 Subject: [ruby-dev:31261] [ruby-bugs-12398] Redefining Exception#backtrace and unhandled exception bug なかだです。 http://rubyforge.org/tracker/index.php?func=detail&aid=12398&group_id=426&atid=1698 の件、backtraceをセットするときにはチェックしているけれど、取り 出すときには確認してないからですが、どっちがいいでしょう。 (1) 取り出した後でチェックする (2) rb_funcallを使わずexc_backtrace()で直接取り出す 要するに、Exception#backtraceをサブクラスでオーバーライドするこ とを想定するかどうか、ですが。 とりあえず(1)のパッチです。 Index: error.c =================================================================== --- error.c (revision 12814) +++ error.c (working copy) @@ -496,12 +496,12 @@ static VALUE exc_backtrace(VALUE exc) { - ID bt = rb_intern("bt"); + static ID bt; - if (!rb_ivar_defined(exc, bt)) return Qnil; - return rb_ivar_get(exc, bt); + if (!bt) bt = rb_intern("bt"); + return rb_attr_get(exc, bt); } -static VALUE -check_backtrace(VALUE bt) +VALUE +rb_check_backtrace(VALUE bt) { long i; @@ -537,5 +537,5 @@ static VALUE exc_set_backtrace(VALUE exc, VALUE bt) { - return rb_iv_set(exc, "bt", check_backtrace(bt)); + return rb_iv_set(exc, "bt", rb_check_backtrace(bt)); } Index: eval_error.ci =================================================================== --- eval_error.ci (revision 12814) +++ eval_error.ci (working copy) @@ -67,4 +67,6 @@ error_pos(void) } +VALUE rb_check_backtrace(VALUE); + static VALUE get_backtrace(VALUE info) @@ -75,5 +77,5 @@ get_backtrace(VALUE info) if (NIL_P(info)) return Qnil; - return rb_check_array_type(info); + return rb_check_backtrace(info); } -- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦