static VALUE exc_backtrace(VALUE exc) { VALUE obj; obj = rb_attr_get(exc, id_bt); if (rb_backtrace_p(obj)) { obj = rb_backtrace_to_str_ary(obj); /* rb_ivar_set(exc, id_bt, obj); */ } return obj; }
static void set_backtrace(VALUE info, VALUE bt) { ID set_backtrace = rb_intern("set_backtrace"); if (rb_backtrace_p(bt)) { if (rb_method_basic_definition_p(CLASS_OF(info), set_backtrace)) { rb_exc_set_backtrace(info, bt); return; } else { bt = rb_backtrace_to_str_ary(bt); } } rb_check_funcall(info, set_backtrace, 1, &bt); }
static VALUE exc_backtrace(VALUE exc) { ID bt; VALUE obj; CONST_ID(bt, "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 rb_check_backtrace(VALUE bt) { long i; static const char err[] = "backtrace must be Array of String"; 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); } for (i=0;i<RARRAY_LEN(bt);i++) { if (!RB_TYPE_P(RARRAY_PTR(bt)[i], T_STRING)) { rb_raise(rb_eTypeError, err); } } } return bt; }