summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/array.c3
-rw-r--r--src/backtrace.c1
-rw-r--r--src/gc.c2
-rw-r--r--src/vm.c2
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 {
diff --git a/src/gc.c b/src/gc.c
index 8e2072788..69121d630 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -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:
diff --git a/src/vm.c b/src/vm.c
index 9e43d0a4e..429cc2648 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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) {