diff options
Diffstat (limited to 'error.c')
-rw-r--r-- | error.c | 17 |
1 files changed, 13 insertions, 4 deletions
@@ -673,9 +673,17 @@ static VALUE exc_backtrace(VALUE exc) { ID bt; + VALUE obj; CONST_ID(bt, "bt"); - return rb_attr_get(exc, bt); + obj = rb_attr_get(exc, bt); + + if (rb_backtrace_p(obj)) { + obj = rb_backtrace_to_str_ary(obj); + /* rb_iv_set(exc, "bt", obj); */ + } + + return obj; } VALUE @@ -686,6 +694,7 @@ rb_check_backtrace(VALUE bt) if (!NIL_P(bt)) { if (RB_TYPE_P(bt, T_STRING)) return rb_ary_new3(1, bt); + if (rb_backtrace_p(bt)) return bt; if (!RB_TYPE_P(bt, T_ARRAY)) { rb_raise(rb_eTypeError, err); } @@ -708,8 +717,8 @@ rb_check_backtrace(VALUE bt) * */ -static VALUE -exc_set_backtrace(VALUE exc, VALUE bt) +VALUE +rb_exc_set_backtrace(VALUE exc, VALUE bt) { return rb_iv_set(exc, "bt", rb_check_backtrace(bt)); } @@ -1669,7 +1678,7 @@ Init_Exception(void) rb_define_method(rb_eException, "message", exc_message, 0); rb_define_method(rb_eException, "inspect", exc_inspect, 0); rb_define_method(rb_eException, "backtrace", exc_backtrace, 0); - rb_define_method(rb_eException, "set_backtrace", exc_set_backtrace, 1); + rb_define_method(rb_eException, "set_backtrace", rb_exc_set_backtrace, 1); rb_eSystemExit = rb_define_class("SystemExit", rb_eException); rb_define_method(rb_eSystemExit, "initialize", exit_initialize, -1); |