mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
pre-allocate arena overflow error
This commit is contained in:
@@ -221,6 +221,9 @@ typedef struct mrb_state {
|
||||
struct RClass *eException_class;
|
||||
struct RClass *eStandardError_class;
|
||||
struct RObject *nomem_err; /* pre-allocated NoMemoryError */
|
||||
#ifdef MRB_GC_FIXED_ARENA
|
||||
struct RObject *arena_err; /* pre-allocated arena overfow error */
|
||||
#endif
|
||||
|
||||
void *ud; /* auxiliary data */
|
||||
|
||||
|
||||
+4
-1
@@ -465,7 +465,7 @@ exception_call:
|
||||
}
|
||||
if (argc > 0) {
|
||||
if (!mrb_obj_is_kind_of(mrb, mesg, mrb->eException_class))
|
||||
mrb_raise(mrb, E_TYPE_ERROR, "exception object expected");
|
||||
mrb_raise(mrb, mrb->eException_class, "exception object expected");
|
||||
if (argc > 2)
|
||||
set_backtrace(mrb, mesg, argv[2]);
|
||||
}
|
||||
@@ -532,6 +532,9 @@ mrb_init_exception(mrb_state *mrb)
|
||||
mrb->eStandardError_class = mrb_define_class(mrb, "StandardError", mrb->eException_class); /* 15.2.23 */
|
||||
runtime_error = mrb_define_class(mrb, "RuntimeError", mrb->eStandardError_class); /* 15.2.28 */
|
||||
mrb->nomem_err = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, runtime_error, "Out of memory"));
|
||||
#ifdef MRB_GC_FIXED_ARENA
|
||||
mrb->arena_err = mrb_obj_ptr(mrb_exc_new_str_lit(mrb, runtime_error, "arena overflow error"));
|
||||
#endif
|
||||
script_error = mrb_define_class(mrb, "ScriptError", mrb->eException_class); /* 15.2.37 */
|
||||
mrb_define_class(mrb, "SyntaxError", script_error); /* 15.2.38 */
|
||||
mrb_define_class(mrb, "SystemStackError", exception);
|
||||
|
||||
@@ -403,7 +403,7 @@ gc_protect(mrb_state *mrb, mrb_gc *gc, struct RBasic *p)
|
||||
if (gc->arena_idx >= MRB_GC_ARENA_SIZE) {
|
||||
/* arena overflow error */
|
||||
gc->arena_idx = MRB_GC_ARENA_SIZE - 4; /* force room in arena */
|
||||
mrb_raise(mrb, E_RUNTIME_ERROR, "arena overflow error");
|
||||
mrb_exc_raise(mrb, mrb_obj_value(mrb->arena_err));
|
||||
}
|
||||
#else
|
||||
if (gc->arena_idx >= gc->arena_capa) {
|
||||
@@ -816,6 +816,9 @@ root_scan_phase(mrb_state *mrb, mrb_gc *gc)
|
||||
mrb_gc_mark(mrb, (struct RBasic*)mrb->exc);
|
||||
/* mark pre-allocated exception */
|
||||
mrb_gc_mark(mrb, (struct RBasic*)mrb->nomem_err);
|
||||
#ifdef MRB_GC_FIXED_ARENA
|
||||
mrb_gc_mark(mrb, (struct RBasic*)mrb->arena_err);
|
||||
#endif
|
||||
|
||||
mark_context(mrb, mrb->root_c);
|
||||
if (mrb->root_c->fib) {
|
||||
|
||||
Reference in New Issue
Block a user