diff options
| author | Yukihiro Matsumoto <[email protected]> | 2012-05-29 22:14:32 +0900 |
|---|---|---|
| committer | Yukihiro Matsumoto <[email protected]> | 2012-05-29 22:14:32 +0900 |
| commit | 42b4060c9d75601b81b537323b969c69212a520e (patch) | |
| tree | a1cc38e7b41cc8f036628f2d70c788e107d24640 /src | |
| parent | 836fed4c330495944e60398bf0863d3fef285c5b (diff) | |
| download | mruby-42b4060c9d75601b81b537323b969c69212a520e.tar.gz mruby-42b4060c9d75601b81b537323b969c69212a520e.zip | |
force room in arena before raising arena overflow error
Diffstat (limited to 'src')
| -rw-r--r-- | src/gc.c | 19 |
1 files changed, 4 insertions, 15 deletions
@@ -261,21 +261,10 @@ 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; + if (mrb->arena_idx > MRB_ARENA_SIZE) { + /* arena overflow error */ + mrb->arena_idx = MRB_ARENA_SIZE - 2; /* force room in arena */ + mrb_raise(mrb, mrb->eRuntimeError_class, "arena overflow error"); } mrb->arena[mrb->arena_idx++] = p; memset(p, 0, sizeof(RVALUE)); |
