Need to free contexts when freeing fibers.

Memory leak fixed; ref #3711
This commit is contained in:
Yukihiro "Matz" Matsumoto
2017-11-29 20:24:03 +09:00
parent 9c78a9bfa2
commit b746a0f0d2
+9 -7
View File
@@ -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);
}