diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-03 18:38:49 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-04-03 18:38:49 +0900 |
| commit | b8461c86817fd2f766746e61e9f93362955a3474 (patch) | |
| tree | 25d133ce2e0ba9e17492ad895b65f71edf6a076b /src/gc.c | |
| parent | 6a992a2579562bfeacd6f1f1ef14a98bff59fff0 (diff) | |
| download | mruby-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.c | 8 |
1 files changed, 3 insertions, 5 deletions
@@ -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 */ |
