diff --git a/src/error.c b/src/error.c index cf3d861fd..6991e6149 100644 --- a/src/error.c +++ b/src/error.c @@ -490,6 +490,8 @@ mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_value args, char const* fmt, mrb_exc_raise(mrb, exc); } +void mrb_core_init_printabort(void); + int mrb_core_init_protect(mrb_state *mrb, void (*body)(mrb_state *, void *), void *opaque) { @@ -502,7 +504,13 @@ mrb_core_init_protect(mrb_state *mrb, void (*body)(mrb_state *, void *), void *o body(mrb, opaque); err = 0; } MRB_CATCH(&c_jmp) { - mrb->exc = NULL; + if (mrb->exc) { + mrb_p(mrb, mrb_obj_value(mrb->exc)); + mrb->exc = NULL; + } + else { + mrb_core_init_printabort(); + } } MRB_END_EXC(&c_jmp); mrb->jmp = prev_jmp; diff --git a/src/print.c b/src/print.c index 03b5eadfa..6b4f9a490 100644 --- a/src/print.c +++ b/src/print.c @@ -7,24 +7,48 @@ #include #include #include +#include +#include #ifndef MRB_DISABLE_STDIO +static void +printcstr(const char *str, size_t len, FILE *stream) +{ + if (str) { + fwrite(str, len, 1, stream); + putc('\n', stream); + } +} + static void printstr(mrb_value obj, FILE *stream) { if (mrb_string_p(obj)) { - fwrite(RSTRING_PTR(obj), RSTRING_LEN(obj), 1, stream); - putc('\n', stream); + printcstr(RSTRING_PTR(obj), RSTRING_LEN(obj), stream); } } #else +# define printcstr(str, len, stream) (void)0 # define printstr(obj, stream) (void)0 #endif +void +mrb_core_init_printabort(void) +{ + static const char *str = "Failed mruby core initialization"; + printcstr(str, strlen(str), stdout); +} + MRB_API void mrb_p(mrb_state *mrb, mrb_value obj) { - printstr(mrb_inspect(mrb, obj), stdout); + if (mrb_type(obj) == MRB_TT_EXCEPTION && mrb_obj_ptr(obj) == mrb->nomem_err) { + static const char *str = "Out of memory"; + printcstr(str, strlen(str), stdout); + } + else { + printstr(mrb_inspect(mrb, obj), stdout); + } } MRB_API void