From 90fb4dd5b31e7cdd7e4538d2bde692fd92d0ce7e Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 1 Jun 2017 09:48:04 +0900 Subject: Print most recent call last as CPython does. --- src/backtrace.c | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) (limited to 'src/backtrace.c') diff --git a/src/backtrace.c b/src/backtrace.c index dd00bc9d2..392ce4e07 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -70,13 +70,6 @@ each_backtrace(mrb_state *mrb, mrb_int ciidx, mrb_code *pc0, each_backtrace_func } } -/* mrb_print_backtrace - - function to retrieve backtrace information from the exception. - note that if you call method after the exception, call stack will be - overwritten. So invoke these functions just after detecting exceptions. -*/ - #ifndef MRB_DISABLE_STDIO static void @@ -89,8 +82,8 @@ print_backtrace(mrb_state *mrb, mrb_value backtrace) fprintf(stream, "trace:\n"); n = RARRAY_LEN(backtrace); - for (i = 0; i < n; i++) { - mrb_value entry = RARRAY_PTR(backtrace)[i]; + for (i=0; n--; i++) { + mrb_value entry = RARRAY_PTR(backtrace)[n]; if (mrb_string_p(entry)) { fprintf(stream, "\t[%d] %.*s\n", i, (int)RSTRING_LEN(entry), RSTRING_PTR(entry)); @@ -103,7 +96,7 @@ print_packed_backtrace(mrb_state *mrb, mrb_value packed) { FILE *stream = stderr; struct backtrace_location *bt; - mrb_int n, i; + int n, i; bt = (struct backtrace_location*)mrb_data_check_get_ptr(mrb, packed, &bt_type); if (bt == NULL) { @@ -112,9 +105,9 @@ print_packed_backtrace(mrb_state *mrb, mrb_value packed) n = (mrb_int)RDATA(packed)->flags; fprintf(stream, "trace:\n"); - for (i = 0; i < n; i++) { + for (i = 0; n--; i++) { int ai = mrb_gc_arena_save(mrb); - struct backtrace_location *entry = &bt[i]; + struct backtrace_location *entry = &bt[n]; if (entry->filename == NULL) continue; fprintf(stream, "\t[%d] %s:%d", (int)i, entry->filename, entry->lineno); if (entry->method_id != 0) { @@ -128,6 +121,11 @@ print_packed_backtrace(mrb_state *mrb, mrb_value packed) } } +/* mrb_print_backtrace + + function to retrieve backtrace information from the last exception. +*/ + MRB_API void mrb_print_backtrace(mrb_state *mrb) { -- cgit v1.2.3