Skip to content

Commit 61b6027

Browse files
committed
Print errors by calling mrb_print_backtrace() without backtrace
- In case of `NoMemoryError` exceptions, the error message is now printed directly. - Replaced `mrb_p()` used by mruby#4250 with `mrb_print_error()`. ref. squashed commit f1523d2 ref. subcommit da7d7f8 ref. subcommit d9c7b6b
1 parent 3a0e225 commit 61b6027

2 files changed

Lines changed: 18 additions & 9 deletions

File tree

src/backtrace.c

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ static void
100100
print_backtrace(mrb_state *mrb, struct RObject *exc, struct RArray *backtrace)
101101
{
102102
mrb_int i;
103-
mrb_int n = ARY_LEN(backtrace);
103+
mrb_int n = (backtrace ? ARY_LEN(backtrace) : 0);
104104
mrb_value *loc, mesg;
105105

106106
if (n != 0) {
@@ -117,9 +117,19 @@ print_backtrace(mrb_state *mrb, struct RObject *exc, struct RArray *backtrace)
117117
fprintf(stderr, "%.*s: ", (int)RSTRING_LEN(*loc), RSTRING_PTR(*loc));
118118
}
119119
}
120-
mesg = mrb_exc_inspect(mrb, mrb_obj_value(exc));
121-
fwrite(RSTRING_PTR(mesg), RSTRING_LEN(mesg), 1, stderr);
122-
fputc('\n', stderr);
120+
else {
121+
fprintf(stderr, "%s:0: ", "(unknown)");
122+
}
123+
124+
if (exc == mrb->nomem_err) {
125+
static const char nomem[] = "Out of memory (NoMemoryError)\n";
126+
fwrite(nomem, sizeof(nomem) - 1, 1, stderr);
127+
}
128+
else {
129+
mesg = mrb_exc_inspect(mrb, mrb_obj_value(exc));
130+
fwrite(RSTRING_PTR(mesg), RSTRING_LEN(mesg), 1, stderr);
131+
fputc('\n', stderr);
132+
}
123133
}
124134

125135
/* mrb_print_backtrace
@@ -130,13 +140,12 @@ print_backtrace(mrb_state *mrb, struct RObject *exc, struct RArray *backtrace)
130140
MRB_API void
131141
mrb_print_backtrace(mrb_state *mrb)
132142
{
133-
if (!mrb->exc) {
143+
if (!mrb->exc || mrb->exc->tt != MRB_TT_EXCEPTION) {
134144
return;
135145
}
136146

137147
struct RObject *backtrace = ((struct RException*)mrb->exc)->backtrace;
138-
if (!backtrace) return;
139-
if (backtrace->tt != MRB_TT_ARRAY) backtrace = mrb_unpack_backtrace(mrb, backtrace);
148+
if (backtrace && backtrace->tt != MRB_TT_ARRAY) backtrace = mrb_unpack_backtrace(mrb, backtrace);
140149
print_backtrace(mrb, mrb->exc, (struct RArray*)backtrace);
141150
}
142151
#else

src/error.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ static mrb_noreturn void
195195
exc_throw(mrb_state *mrb, mrb_value exc)
196196
{
197197
if (!mrb->jmp) {
198-
mrb_p(mrb, exc);
198+
mrb_print_error(mrb);
199199
abort();
200200
}
201201
MRB_THROW(mrb->jmp);
@@ -576,7 +576,7 @@ mrb_core_init_protect(mrb_state *mrb, void (*body)(mrb_state *, void *), void *o
576576
err = 0;
577577
} MRB_CATCH(&c_jmp) {
578578
if (mrb->exc) {
579-
mrb_p(mrb, mrb_obj_value(mrb->exc));
579+
mrb_print_error(mrb);
580580
mrb->exc = NULL;
581581
}
582582
else {

0 commit comments

Comments
 (0)