diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-27 02:48:11 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2014-04-27 02:48:11 +0900 |
| commit | 4bfd25d4050c91cbc4f91c884ee65055d943668c (patch) | |
| tree | 90bf79a820c62635a6c607bde67e40c2acf1de7a /src/gc.c | |
| parent | 3d87596a710a1424641bfebdb287477d70548486 (diff) | |
| download | mruby-4bfd25d4050c91cbc4f91c884ee65055d943668c.tar.gz mruby-4bfd25d4050c91cbc4f91c884ee65055d943668c.zip | |
mark may be missed when eval() is called
Diffstat (limited to 'src/gc.c')
| -rw-r--r-- | src/gc.c | 16 |
1 files changed, 9 insertions, 7 deletions
@@ -448,26 +448,28 @@ mark_context_stack(mrb_state *mrb, struct mrb_context *c) static void mark_context(mrb_state *mrb, struct mrb_context *c) { - size_t i; - size_t e; + int i, e = 0; mrb_callinfo *ci; /* mark stack */ mark_context_stack(mrb, c); - /* mark ensure stack */ - e = (c->ci) ? c->ci->eidx : 0; - for (i=0; i<e; i++) { - mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]); - } /* mark VM stack */ if (c->cibase) { for (ci = c->cibase; ci <= c->ci; ci++) { + if (ci->eidx > e) { + abort(); + e = ci->eidx; + } mrb_gc_mark(mrb, (struct RBasic*)ci->env); mrb_gc_mark(mrb, (struct RBasic*)ci->proc); mrb_gc_mark(mrb, (struct RBasic*)ci->target_class); } } + /* mark ensure stack */ + for (i=0; i<e; i++) { + mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]); + } /* mark fibers */ if (c->prev && c->prev->fib) { mrb_gc_mark(mrb, (struct RBasic*)c->prev->fib); |
