Commit 965690c9 authored by Yukihiro "Matz" Matsumoto's avatar Yukihiro "Matz" Matsumoto Committed by GitHub

Merge pull request #3339 from kazuho/kazuho/retain-page-with-tt-env

do not destroy a page with an active TT_ENV
parents 7b968ca8 2ef634ed
...@@ -741,10 +741,12 @@ obj_free(mrb_state *mrb, struct RBasic *obj) ...@@ -741,10 +741,12 @@ obj_free(mrb_state *mrb, struct RBasic *obj)
{ {
struct REnv *e = (struct REnv*)obj; struct REnv *e = (struct REnv*)obj;
if (!MRB_ENV_STACK_SHARED_P(e)) { if (MRB_ENV_STACK_SHARED_P(e)) {
mrb_free(mrb, e->stack); /* cannot be freed */
e->stack = NULL; return;
} }
mrb_free(mrb, e->stack);
e->stack = NULL;
} }
break; break;
...@@ -998,9 +1000,13 @@ incremental_sweep_phase(mrb_state *mrb, mrb_gc *gc, size_t limit) ...@@ -998,9 +1000,13 @@ incremental_sweep_phase(mrb_state *mrb, mrb_gc *gc, size_t limit)
if (is_dead(gc, &p->as.basic)) { if (is_dead(gc, &p->as.basic)) {
if (p->as.basic.tt != MRB_TT_FREE) { if (p->as.basic.tt != MRB_TT_FREE) {
obj_free(mrb, &p->as.basic); obj_free(mrb, &p->as.basic);
p->as.free.next = page->freelist; if (p->as.basic.tt == MRB_TT_FREE) {
page->freelist = (struct RBasic*)p; p->as.free.next = page->freelist;
freed++; page->freelist = (struct RBasic*)p;
freed++;
} else {
dead_slot = 0;
}
} }
} }
else { else {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment