diff --git a/src/error.c b/src/error.c index 57cdfcfe1..6674fe7ad 100644 --- a/src/error.c +++ b/src/error.c @@ -240,6 +240,16 @@ mrb_exc_set(mrb_state *mrb, mrb_value exc) } } +static mrb_noreturn void +exc_throw(mrb_state *mrb, mrb_value exc) +{ + if (!mrb->jmp) { + mrb_p(mrb, exc); + abort(); + } + MRB_THROW(mrb->jmp); +} + MRB_API mrb_noreturn void mrb_exc_raise(mrb_state *mrb, mrb_value exc) { @@ -247,11 +257,7 @@ mrb_exc_raise(mrb_state *mrb, mrb_value exc) mrb_raise(mrb, E_TYPE_ERROR, "exception object expected"); } mrb_exc_set(mrb, exc); - if (!mrb->jmp) { - mrb_p(mrb, exc); - abort(); - } - MRB_THROW(mrb->jmp); + exc_throw(mrb, exc); } MRB_API mrb_noreturn void @@ -483,6 +489,24 @@ mrb_no_method_error(mrb_state *mrb, mrb_sym id, mrb_value args, char const* fmt, mrb_exc_raise(mrb, exc); } +mrb_noreturn void +mrb_core_init_abort(mrb_state *mrb) +{ + mrb->exc = NULL; + exc_throw(mrb, mrb_nil_value()); +} + +mrb_noreturn void +mrb_raise_nomemory(mrb_state *mrb) +{ + if (mrb->nomem_err) { + mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err)); + } + else { + mrb_core_init_abort(mrb); + } +} + void mrb_init_exception(mrb_state *mrb) { diff --git a/src/gc.c b/src/gc.c index ec52787e8..c67454f5f 100644 --- a/src/gc.c +++ b/src/gc.c @@ -198,6 +198,8 @@ gettimeofday_time(void) #define objects(p) ((RVALUE *)p->objects) +mrb_noreturn void mrb_raise_nomemory(mrb_state *mrb); + MRB_API void* mrb_realloc_simple(mrb_state *mrb, void *p, size_t len) { @@ -221,12 +223,12 @@ mrb_realloc(mrb_state *mrb, void *p, size_t len) if (len == 0) return p2; if (p2 == NULL) { if (mrb->gc.out_of_memory) { - mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err)); + mrb_raise_nomemory(mrb); /* mrb_panic(mrb); */ } else { mrb->gc.out_of_memory = TRUE; - mrb_exc_raise(mrb, mrb_obj_value(mrb->nomem_err)); + mrb_raise_nomemory(mrb); } } else {