summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2013-08-29 18:58:48 +0900
committertake_cheeze <[email protected]>2013-09-02 00:48:06 +0900
commitbc131350d416409220fd3294d2ffcea3ae73027d (patch)
treed6d090b088712a9a77510abbc51842499cec7d3f /src
parentd12b6ab2187528828977ba1ea8b6f6fc9f6e42f2 (diff)
downloadmruby-bc131350d416409220fd3294d2ffcea3ae73027d.tar.gz
mruby-bc131350d416409220fd3294d2ffcea3ae73027d.zip
print singleton class name in verbose backtrace
Diffstat (limited to 'src')
-rw-r--r--src/backtrace.c12
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);