diff options
| author | take_cheeze <[email protected]> | 2013-08-26 22:51:53 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2013-09-02 00:48:06 +0900 |
| commit | d12b6ab2187528828977ba1ea8b6f6fc9f6e42f2 (patch) | |
| tree | 9d3bbe7d7c8d7beede1ce6841c56e35b7a9fe781 /src/backtrace.c | |
| parent | d19d9bb047a8b63c79442d5713be9205cf74c60c (diff) | |
| download | mruby-d12b6ab2187528828977ba1ea8b6f6fc9f6e42f2.tar.gz mruby-d12b6ab2187528828977ba1ea8b6f6fc9f6e42f2.zip | |
add verbose_backtrace
Diffstat (limited to 'src/backtrace.c')
| -rw-r--r-- | src/backtrace.c | 34 |
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; } |
