diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-22 14:35:36 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-22 14:35:36 +0900 |
| commit | 5513fcee22ceab9293bff7815f961616c1fa3e83 (patch) | |
| tree | 917ae5efe1eff1f8b56342ba822137f9f450419c /src/gc.c | |
| parent | 3b0a36d3993ff6c553b171c8bcb0e703a471ef5e (diff) | |
| download | mruby-5513fcee22ceab9293bff7815f961616c1fa3e83.tar.gz mruby-5513fcee22ceab9293bff7815f961616c1fa3e83.zip | |
Keep reference to mrb_context from env; fix #3619
Diffstat (limited to 'src/gc.c')
| -rw-r--r-- | src/gc.c | 13 |
1 files changed, 7 insertions, 6 deletions
@@ -593,8 +593,9 @@ mark_context(mrb_state *mrb, struct mrb_context *c) 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); + mrb_gc_mark(mrb, (struct RBasic*)c->fib); + if (c->prev) { + mark_context(mrb, c->prev); } } @@ -646,6 +647,9 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj) struct REnv *e = (struct REnv*)obj; mrb_int i, len; + if (MRB_ENV_STACK_SHARED_P(e) && e->cxt.c->fib) { + mrb_gc_mark(mrb, (struct RBasic*)e->cxt.c->fib); + } len = MRB_ENV_STACK_LEN(e); for (i=0; i<len; i++) { mrb_gc_mark_value(mrb, e->stack[i]); @@ -878,13 +882,10 @@ root_scan_phase(mrb_state *mrb, mrb_gc *gc) mrb_gc_mark(mrb, (struct RBasic*)mrb->arena_err); #endif - mark_context(mrb, mrb->root_c); - if (mrb->root_c->fib) { - mrb_gc_mark(mrb, (struct RBasic*)mrb->root_c->fib); - } if (mrb->root_c != mrb->c) { mark_context(mrb, mrb->c); } + mark_context(mrb, mrb->root_c); } static size_t |
