diff options
| author | take_cheeze <[email protected]> | 2013-08-29 18:58:48 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2013-09-02 00:48:06 +0900 |
| commit | bc131350d416409220fd3294d2ffcea3ae73027d (patch) | |
| tree | d6d090b088712a9a77510abbc51842499cec7d3f | |
| parent | d12b6ab2187528828977ba1ea8b6f6fc9f6e42f2 (diff) | |
| download | mruby-bc131350d416409220fd3294d2ffcea3ae73027d.tar.gz mruby-bc131350d416409220fd3294d2ffcea3ae73027d.zip | |
print singleton class name in verbose backtrace
| -rw-r--r-- | src/backtrace.c | 12 |
1 files changed, 11 insertions, 1 deletions
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 <stdarg.h> 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); |
