From 0558b1abd81dedb64090b4f89b84dd2dfe34c5f8 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 3 Jul 2023 15:26:45 +0900 Subject: [PATCH] backtrace.c: reorder functions for clarity --- src/backtrace.c | 130 +++++++++++++++++++++++------------------------- 1 file changed, 63 insertions(+), 67 deletions(-) diff --git a/src/backtrace.c b/src/backtrace.c index 5cb1f5d39..5d581dd2d 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -56,8 +56,6 @@ typedef void (*each_backtrace_func)(mrb_state*, const struct backtrace_location* static const mrb_data_type bt_type = { "Backtrace", mrb_free }; -static struct RObject *mrb_unpack_backtrace(mrb_state *mrb, struct RObject *backtrace); - static uint32_t each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, each_backtrace_func func, void *data) { @@ -116,71 +114,6 @@ each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, each_backtrace_func func, void * return n; } -#ifndef MRB_NO_STDIO - -static void -print_backtrace(mrb_state *mrb, struct RObject *exc, struct RArray *backtrace) -{ - mrb_int i; - mrb_int n = (backtrace ? ARY_LEN(backtrace) : 0); - mrb_value *loc, mesg; - - if (n != 0) { - if (n > 1) { - fputs("trace (most recent call last):\n", stderr); - } - for (i=n-1,loc=&ARY_PTR(backtrace)[i]; i>0; i--,loc--) { - if (mrb_string_p(*loc)) { - fprintf(stderr, "\t[%d] ", (int)i); - fwrite(RSTRING_PTR(*loc), (int)RSTRING_LEN(*loc), 1, stderr); - fputc('\n', stderr); - } - } - if (mrb_string_p(*loc)) { - fwrite(RSTRING_PTR(*loc), (int)RSTRING_LEN(*loc), 1, stderr); - fputs(": ", stderr); - } - } - else { - fputs("(unknown):0: ", stderr); - } - - if (exc == mrb->nomem_err) { - static const char nomem[] = "Out of memory (NoMemoryError)\n"; - fwrite(nomem, sizeof(nomem)-1, 1, stderr); - } - else { - mesg = mrb_exc_inspect(mrb, mrb_obj_value(exc)); - fwrite(RSTRING_PTR(mesg), RSTRING_LEN(mesg), 1, stderr); - fputc('\n', stderr); - } -} - -/* mrb_print_backtrace - - function to retrieve backtrace information from the last exception. -*/ - -MRB_API void -mrb_print_backtrace(mrb_state *mrb) -{ - if (!mrb->exc || mrb->exc->tt != MRB_TT_EXCEPTION) { - return; - } - - struct RObject *backtrace = ((struct RException*)mrb->exc)->backtrace; - if (backtrace && backtrace->tt != MRB_TT_ARRAY) backtrace = mrb_unpack_backtrace(mrb, backtrace); - print_backtrace(mrb, mrb->exc, (struct RArray*)backtrace); -} -#else - -MRB_API void -mrb_print_backtrace(mrb_state *mrb) -{ -} - -#endif - static void pack_backtrace_i(mrb_state *mrb, const struct backtrace_location *loc, @@ -294,3 +227,66 @@ mrb_get_backtrace(mrb_state *mrb) { return mrb_obj_value(mrb_unpack_backtrace(mrb, packed_backtrace(mrb))); } + +#ifndef MRB_NO_STDIO + +static void +print_backtrace(mrb_state *mrb, struct RObject *exc, struct RArray *backtrace) +{ + mrb_int i; + mrb_int n = (backtrace ? ARY_LEN(backtrace) : 0); + mrb_value *loc, mesg; + + if (n != 0) { + if (n > 1) { + fputs("trace (most recent call last):\n", stderr); + } + for (i=n-1,loc=&ARY_PTR(backtrace)[i]; i>0; i--,loc--) { + if (mrb_string_p(*loc)) { + fprintf(stderr, "\t[%d] ", (int)i); + fwrite(RSTRING_PTR(*loc), (int)RSTRING_LEN(*loc), 1, stderr); + fputc('\n', stderr); + } + } + if (mrb_string_p(*loc)) { + fwrite(RSTRING_PTR(*loc), (int)RSTRING_LEN(*loc), 1, stderr); + fputs(": ", stderr); + } + } + else { + fputs("(unknown):0: ", stderr); + } + + if (exc == mrb->nomem_err) { + static const char nomem[] = "Out of memory (NoMemoryError)\n"; + fwrite(nomem, sizeof(nomem)-1, 1, stderr); + } + else { + mesg = mrb_exc_inspect(mrb, mrb_obj_value(exc)); + fwrite(RSTRING_PTR(mesg), RSTRING_LEN(mesg), 1, stderr); + fputc('\n', stderr); + } +} + +/* mrb_print_backtrace + + function to retrieve backtrace information from the last exception. +*/ + +MRB_API void +mrb_print_backtrace(mrb_state *mrb) +{ + if (!mrb->exc || mrb->exc->tt != MRB_TT_EXCEPTION) { + return; + } + + struct RObject *backtrace = ((struct RException*)mrb->exc)->backtrace; + if (backtrace && backtrace->tt != MRB_TT_ARRAY) backtrace = mrb_unpack_backtrace(mrb, backtrace); + print_backtrace(mrb, mrb->exc, (struct RArray*)backtrace); +} +#else +MRB_API void +mrb_print_backtrace(mrb_state *mrb) +{ +} +#endif