diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-11-29 20:24:03 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-11-29 20:24:03 +0900 |
| commit | b746a0f0d273cb4b6f16ffad86ca7ea64d002ad2 (patch) | |
| tree | 6ac22521f5422d33666b205f87239094e5d35cfc /src/gc.c | |
| parent | 9c78a9bfa2665c1801bea0298cf5c6b930faea1c (diff) | |
| download | mruby-b746a0f0d273cb4b6f16ffad86ca7ea64d002ad2.tar.gz mruby-b746a0f0d273cb4b6f16ffad86ca7ea64d002ad2.zip | |
Need to free contexts when freeing fibers.
Memory leak fixed; ref #3711
Diffstat (limited to 'src/gc.c')
| -rw-r--r-- | src/gc.c | 16 |
1 files changed, 9 insertions, 7 deletions
@@ -780,17 +780,19 @@ obj_free(mrb_state *mrb, struct RBasic *obj, int end) { struct mrb_context *c = ((struct RFiber*)obj)->cxt; - if (!end && c && c != mrb->root_c) { + if (c && c != mrb->root_c) { mrb_callinfo *ci = c->ci; mrb_callinfo *ce = c->cibase; - while (ce <= ci) { - struct REnv *e = ci->env; - if (e && !is_dead(&mrb->gc, e) && - e->tt == MRB_TT_ENV && MRB_ENV_STACK_SHARED_P(e)) { - mrb_env_unshare(mrb, e); + if (!end) { + while (ce <= ci) { + struct REnv *e = ci->env; + if (e && !is_dead(&mrb->gc, e) && + e->tt == MRB_TT_ENV && MRB_ENV_STACK_SHARED_P(e)) { + mrb_env_unshare(mrb, e); + } + ci--; } - ci--; } mrb_free_context(mrb, c); } |
