diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/array.c | 3 | ||||
| -rw-r--r-- | src/backtrace.c | 1 | ||||
| -rw-r--r-- | src/gc.c | 2 | ||||
| -rw-r--r-- | src/vm.c | 2 |
4 files changed, 7 insertions, 1 deletions
diff --git a/src/array.c b/src/array.c index bfa6e5f06..2152e292d 100644 --- a/src/array.c +++ b/src/array.c @@ -377,6 +377,9 @@ ary_replace(mrb_state *mrb, struct RArray *a, struct RArray *b) if (ARY_EMBED_P(a)) { ARY_UNSET_EMBED_FLAG(a); } + else { + mrb_free(mrb, a->as.heap.ptr); + } a->as.heap.ptr = b->as.heap.ptr; a->as.heap.len = len; a->as.heap.aux.shared = b->as.heap.aux.shared; diff --git a/src/backtrace.c b/src/backtrace.c index 30febdc1c..57ae7fd7f 100644 --- a/src/backtrace.c +++ b/src/backtrace.c @@ -51,6 +51,7 @@ each_backtrace(mrb_state *mrb, ptrdiff_t ciidx, mrb_code *pc0, each_backtrace_fu pc = mrb->c->cibase[i].err; } else if (i+1 <= ciidx) { + if (!mrb->c->cibase[i + 1].pc) continue; pc = &mrb->c->cibase[i+1].pc[-1]; } else { @@ -938,7 +938,7 @@ gc_gray_mark(mrb_state *mrb, mrb_gc *gc, struct RBasic *obj) break; case MRB_TT_ENV: - children += (int)obj->flags; + children += MRB_ENV_STACK_LEN(obj); break; case MRB_TT_FIBER: @@ -527,6 +527,8 @@ mrb_exec_irep(mrb_state *mrb, mrb_value self, struct RProc *p) return MRB_PROC_CFUNC(p)(mrb, self); } ci->nregs = p->body.irep->nregs; + ci->env = MRB_PROC_ENV(p); + if (ci->env) ci->env->stack[0] = self; if (ci->argc < 0) keep = 3; else keep = ci->argc + 2; if (ci->nregs < keep) { |
