From bc131350d416409220fd3294d2ffcea3ae73027d Mon Sep 17 00:00:00 2001 From: take_cheeze Date: Thu, 29 Aug 2013 18:58:48 +0900 Subject: print singleton class name in verbose backtrace --- src/backtrace.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'src/backtrace.c') diff --git a/src/backtrace.c b/src/backtrace.c index cee2c9389..d7881dce1 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -9,6 +9,7 @@ #include "mruby/proc.h" #include "mruby/array.h" #include "mruby/string.h" +#include "mruby/class.h" #include typedef void (*output_stream_func)(mrb_state*, void*, int, const char*, ...); @@ -104,7 +105,16 @@ mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func fun method = mrb_sym2name(mrb, ci->proc->env->mid); } if (method) { - const char *cn = mrb_class_name(mrb, ci->proc->target_class); + const char *cn = NULL; + if(verbose && ci->proc->target_class->tt == MRB_TT_SCLASS) { + cn = RSTRING_PTR(mrb_str_cat_cstr( + mrb, mrb_str_new_cstr(mrb, "(singleton class of)"), + mrb_class_name(mrb, mrb_class_ptr(mrb_mod_cv_get( + mrb, ci->proc->target_class, mrb_intern_cstr(mrb, "__attached__")))))); + } + else { + cn = mrb_class_name(mrb, ci->proc->target_class); + } if (cn) { func(mrb, stream, 1, "\t[%d] ", i); -- cgit v1.2.3