summaryrefslogtreecommitdiffhomepage
path: root/src/backtrace.c
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2013-08-26 22:51:53 +0900
committertake_cheeze <[email protected]>2013-09-02 00:48:06 +0900
commitd12b6ab2187528828977ba1ea8b6f6fc9f6e42f2 (patch)
tree9d3bbe7d7c8d7beede1ce6841c56e35b7a9fe781 /src/backtrace.c
parentd19d9bb047a8b63c79442d5713be9205cf74c60c (diff)
downloadmruby-d12b6ab2187528828977ba1ea8b6f6fc9f6e42f2.tar.gz
mruby-d12b6ab2187528828977ba1ea8b6f6fc9f6e42f2.zip
add verbose_backtrace
Diffstat (limited to 'src/backtrace.c')
-rw-r--r--src/backtrace.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/backtrace.c b/src/backtrace.c
index 6092aaf86..cee2c9389 100644
--- a/src/backtrace.c
+++ b/src/backtrace.c
@@ -55,7 +55,7 @@ get_backtrace_i(mrb_state *mrb, void *stream, int level, const char *format, ...
}
static void
-mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func func, void *stream)
+mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func func, void *stream, mrb_bool verbose)
{
mrb_callinfo *ci;
mrb_int ciidx;
@@ -72,10 +72,10 @@ mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func fun
filename = "(unknown)";
line = -1;
- if (MRB_PROC_CFUNC_P(ci->proc)) {
+ if (!verbose && MRB_PROC_CFUNC_P(ci->proc)) {
continue;
}
- else {
+ if(!MRB_PROC_CFUNC_P(ci->proc)) {
mrb_irep *irep = ci->proc->body.irep;
if (irep->filename != NULL)
filename = irep->filename;
@@ -93,13 +93,16 @@ mrb_output_backtrace(mrb_state *mrb, struct RObject *exc, output_stream_func fun
}
}
}
- if (line == -1) continue;
+ if (!verbose && line == -1) continue;
if (ci->target_class == ci->proc->target_class)
sep = ".";
else
sep = "#";
method = mrb_sym2name(mrb, ci->mid);
+ if (verbose && !method && ci->proc->env) {
+ method = mrb_sym2name(mrb, ci->proc->env->mid);
+ }
if (method) {
const char *cn = mrb_class_name(mrb, ci->proc->target_class);
@@ -126,7 +129,15 @@ void
mrb_print_backtrace(mrb_state *mrb)
{
#ifdef ENABLE_STDIO
- mrb_output_backtrace(mrb, mrb->exc, print_backtrace_i, (void*)stderr);
+ mrb_output_backtrace(mrb, mrb->exc, print_backtrace_i, (void*)stderr, 0);
+#endif
+}
+
+void
+mrb_print_verbose_backtrace(mrb_state *mrb)
+{
+#ifdef ENABLE_STDIO
+ mrb_output_backtrace(mrb, mrb->exc, print_backtrace_i, (void*)stderr, 1);
#endif
}
@@ -136,7 +147,18 @@ mrb_get_backtrace(mrb_state *mrb, mrb_value self)
mrb_value ary;
ary = mrb_ary_new(mrb);
- mrb_output_backtrace(mrb, mrb_obj_ptr(self), get_backtrace_i, (void*)mrb_ary_ptr(ary));
+ mrb_output_backtrace(mrb, mrb_obj_ptr(self), get_backtrace_i, (void*)mrb_ary_ptr(ary), 0);
+
+ return ary;
+}
+
+mrb_value
+mrb_get_verbose_backtrace(mrb_state *mrb, mrb_value self)
+{
+ mrb_value ary;
+
+ ary = mrb_ary_new(mrb);
+ mrb_output_backtrace(mrb, mrb_obj_ptr(self), get_backtrace_i, (void*)mrb_ary_ptr(ary), 1);
return ary;
}