summaryrefslogtreecommitdiffhomepage
path: root/src/gc.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-04-03 18:38:49 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-04-03 18:38:49 +0900
commitb8461c86817fd2f766746e61e9f93362955a3474 (patch)
tree25d133ce2e0ba9e17492ad895b65f71edf6a076b /src/gc.c
parent6a992a2579562bfeacd6f1f1ef14a98bff59fff0 (diff)
downloadmruby-b8461c86817fd2f766746e61e9f93362955a3474.tar.gz
mruby-b8461c86817fd2f766746e61e9f93362955a3474.zip
Protect ensure clause lambdas from GC; fix #3491
Diffstat (limited to 'src/gc.c')
-rw-r--r--src/gc.c8
1 files changed, 3 insertions, 5 deletions
diff --git a/src/gc.c b/src/gc.c
index ecf25d637..391da84cb 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -565,7 +565,7 @@ mark_context_stack(mrb_state *mrb, struct mrb_context *c)
static void
mark_context(mrb_state *mrb, struct mrb_context *c)
{
- int i, e = 0;
+ int i;
mrb_callinfo *ci;
/* mark stack */
@@ -574,16 +574,14 @@ mark_context(mrb_state *mrb, struct mrb_context *c)
/* mark VM stack */
if (c->cibase) {
for (ci = c->cibase; ci <= c->ci; ci++) {
- if (ci->eidx > e) {
- 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++) {
+ for (i=0; i<c->esize; i++) {
+ if (c->ensure[i] == NULL) break;
mrb_gc_mark(mrb, (struct RBasic*)c->ensure[i]);
}
/* mark fibers */