From 93f5f225772c398be6e409da3d3ef0f07ffbe1cf Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Thu, 26 Oct 2017 01:13:57 +0900 Subject: Heavily refactored how lexical scope links are implemented; fix #3821 Instead of `irep` links, we added a `upper` link to `struct RProc`. To make a space for the `upper` link, we moved `target_class` reference. If a `Proc` does not have `env`, `target_class` is saved in an `union` shared with `env` (if a `Proc` has env, you can tell it by `MRB_PROC_ENV_P()). Otherwise `target_class` is referenced from `env->c`. We removed links in `env` as well. This change removes 2 members from `mrb_irep` struct, thus saving 2 words per method/proc/block. This also fixes potential memory leaks due to the circular references caused by a link from `mrb_irep`. --- src/gc.c | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) (limited to 'src/gc.c') diff --git a/src/gc.c b/src/gc.c index 0f95d25ef..a3a638ae3 100644 --- a/src/gc.c +++ b/src/gc.c @@ -647,11 +647,8 @@ gc_mark_children(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj) { struct RProc *p = (struct RProc*)obj; - mrb_gc_mark(mrb, (struct RBasic*)p->env); - mrb_gc_mark(mrb, (struct RBasic*)p->target_class); - if (!MRB_PROC_CFUNC_P(p) && p->body.irep) { - mrb_gc_mark(mrb, (struct RBasic*)p->body.irep->target_class); - } + mrb_gc_mark(mrb, (struct RBasic*)p->upper); + mrb_gc_mark(mrb, (struct RBasic*)p->e.env); } break; @@ -660,12 +657,6 @@ 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)) { - if (e->cxt.c->fib) { - mrb_gc_mark(mrb, (struct RBasic*)e->cxt.c->fib); - } - break; - } len = MRB_ENV_STACK_LEN(e); for (i=0; istack[i]); -- cgit v1.2.3 From b6598e052fda9a27692156ab8b973ce6e3374ee3 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 31 Oct 2017 09:06:04 +0900 Subject: Need to mark fibers referenced from `env`; fix #3837 The issue #3837 is a regression of #3819. I was mistakenly removed a important code to mark fibers from `env`. --- include/mruby/proc.h | 1 - src/gc.c | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'src/gc.c') diff --git a/include/mruby/proc.h b/include/mruby/proc.h index 17290950c..b33e9e1a2 100644 --- a/include/mruby/proc.h +++ b/include/mruby/proc.h @@ -19,7 +19,6 @@ struct REnv { MRB_OBJECT_HEADER; mrb_value *stack; struct mrb_context *cxt; - // struct RProc *proc; mrb_sym mid; }; diff --git a/src/gc.c b/src/gc.c index a3a638ae3..4b83f454b 100644 --- a/src/gc.c +++ b/src/gc.c @@ -657,6 +657,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->fib) { + mrb_gc_mark(mrb, (struct RBasic*)e->cxt->fib); + } len = MRB_ENV_STACK_LEN(e); for (i=0; istack[i]); -- cgit v1.2.3