summaryrefslogtreecommitdiffhomepage
path: root/src/backtrace.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-06-01 09:48:04 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-06-01 09:48:04 +0900
commit90fb4dd5b31e7cdd7e4538d2bde692fd92d0ce7e (patch)
tree09b1eb5872c294255d71ed02c1f04028cfa22f1d /src/backtrace.c
parenta893877b0dc62d29dc4b220a95a6d9ee36b3a263 (diff)
downloadmruby-90fb4dd5b31e7cdd7e4538d2bde692fd92d0ce7e.tar.gz
mruby-90fb4dd5b31e7cdd7e4538d2bde692fd92d0ce7e.zip
Print most recent call last as CPython does.
Diffstat (limited to 'src/backtrace.c')
-rw-r--r--src/backtrace.c22
1 files changed, 10 insertions, 12 deletions
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)
{