mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
compact arena before raising exception; also reserve a few slots to allocate exception objects
This commit is contained in:
@@ -261,12 +261,24 @@ mrb_obj_alloc(mrb_state *mrb, enum mrb_vtype ttype, struct RClass *cls)
|
||||
}
|
||||
|
||||
mrb->live++;
|
||||
if (mrb->arena_idx > MRB_ARENA_SIZE - 4) {
|
||||
struct RBasic **p, **q, **e;
|
||||
|
||||
p = q = mrb->arena;
|
||||
e = p + mrb->arena_idx;
|
||||
while (p < e) {
|
||||
if (is_white(*p))
|
||||
*q++ = *p;
|
||||
p++;
|
||||
}
|
||||
if (p == q) {
|
||||
/* arena overflow error */
|
||||
mrb_raise(mrb, E_TYPE_ERROR, "arena overflow error");
|
||||
}
|
||||
mrb->arena_idx = q - mrb->arena;
|
||||
}
|
||||
mrb->arena[mrb->arena_idx++] = p;
|
||||
memset(p, 0, sizeof(RVALUE));
|
||||
if (mrb->arena_idx >= MRB_ARENA_SIZE) {
|
||||
/* arena overflow error */
|
||||
mrb_raise(mrb, E_TYPE_ERROR, "arena overflow error");
|
||||
}
|
||||
p->tt = ttype;
|
||||
p->c = cls;
|
||||
paint_partial_white(mrb, p);
|
||||
|
||||
@@ -538,7 +538,6 @@ mrb_read_irep(mrb_state *mrb, const char *bin)
|
||||
}
|
||||
|
||||
mrb->irep_len += nirep;
|
||||
|
||||
error_exit:
|
||||
mrb_gc_arena_restore(mrb, ai);
|
||||
if (ret != MRB_DUMP_OK) {
|
||||
|
||||
Reference in New Issue
Block a user