summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/etc.c2
-rw-r--r--src/gc.c14
-rw-r--r--src/proc.c2
-rw-r--r--src/vm.c35
4 files changed, 32 insertions, 21 deletions
diff --git a/src/etc.c b/src/etc.c
index 830c48433..58b1c91c0 100644
--- a/src/etc.c
+++ b/src/etc.c
@@ -108,7 +108,7 @@ mrb_obj_id(mrb_value obj)
{
mrb_int tt = mrb_type(obj);
-#define MakeID2(p,t) (((intptr_t)(p))^(t))
+#define MakeID2(p,t) (mrb_int)(((intptr_t)(p))^(t))
#define MakeID(p) MakeID2(p,tt)
switch (tt) {
diff --git a/src/gc.c b/src/gc.c
index 98a79ac69..2660ffcc7 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -441,7 +441,16 @@ mark_context_stack(mrb_state *mrb, struct mrb_context *c)
if (c->ci) e += c->ci->nregs;
if (c->stbase + e > c->stend) e = c->stend - c->stbase;
for (i=0; i<e; i++) {
- mrb_gc_mark_value(mrb, c->stbase[i]);
+ mrb_value v = c->stbase[i];
+
+ if (!mrb_immediate_p(v)) {
+ if (mrb_basic_ptr(v)->tt == MRB_TT_FREE) {
+ c->stbase[i] = mrb_nil_value();
+ }
+ else {
+ mrb_gc_mark(mrb, mrb_basic_ptr(v));
+ }
+ }
}
}
@@ -531,7 +540,7 @@ gc_mark_children(mrb_state *mrb, struct RBasic *obj)
{
struct mrb_context *c = ((struct RFiber*)obj)->cxt;
- mark_context(mrb, c);
+ if (c) mark_context(mrb, c);
}
break;
@@ -745,6 +754,7 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj)
size_t i;
mrb_callinfo *ci;
+ if (!c) break;
/* mark stack */
i = c->stack - c->stbase;
if (c->ci) i += c->ci->nregs;
diff --git a/src/proc.c b/src/proc.c
index fa4c28fc8..b29bd5977 100644
--- a/src/proc.c
+++ b/src/proc.c
@@ -43,7 +43,7 @@ closure_setup(mrb_state *mrb, struct RProc *p, int nlocals)
e = (struct REnv*)mrb_obj_alloc(mrb, MRB_TT_ENV, (struct RClass*)mrb->c->ci->proc->env);
MRB_ENV_STACK_LEN(e)= (unsigned int)nlocals;
e->mid = mrb->c->ci->mid;
- e->cioff = mrb->c->ci - mrb->c->cibase;
+ e->cioff = mrb->c->ci - mrb->c->cibase;
e->stack = mrb->c->stack;
mrb->c->ci->env = e;
}
diff --git a/src/vm.c b/src/vm.c
index b175ef42f..9756d0c17 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -160,14 +160,14 @@ stack_extend_alloc(mrb_state *mrb, int room)
}
static inline void
-stack_extend(mrb_state *mrb, int room, int init, int keep)
+stack_extend(mrb_state *mrb, int room, int keep)
{
if (mrb->c->stack + room >= mrb->c->stend) {
stack_extend_alloc(mrb, room);
}
- if (init > keep) {
+ if (room > keep) {
/* do not leave uninitialized malloc region */
- stack_clear(&(mrb->c->stack[keep]), init - keep);
+ stack_clear(&(mrb->c->stack[keep]), room - keep);
}
}
@@ -234,6 +234,7 @@ cipush(mrb_state *mrb)
ci->env = 0;
ci->pc = 0;
ci->err = 0;
+ ci->proc = 0;
return ci;
}
@@ -380,11 +381,11 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, mrb_int argc
mrb->c->stack = mrb->c->stack + n;
if (MRB_PROC_CFUNC_P(p)) {
ci->nregs = argc + 2;
- stack_extend(mrb, ci->nregs, 0, 0);
+ stack_extend(mrb, ci->nregs, 0);
}
else {
ci->nregs = p->body.irep->nregs + n;
- stack_extend(mrb, ci->nregs, p->body.irep->nlocals, argc+2);
+ stack_extend(mrb, ci->nregs, argc+2);
}
mrb->c->stack[0] = self;
if (undef) {
@@ -513,11 +514,11 @@ mrb_yield_with_class(mrb_state *mrb, mrb_value b, mrb_int argc, const mrb_value
mrb->c->stack = mrb->c->stack + n;
if (MRB_PROC_CFUNC_P(p)) {
ci->nregs = argc + 2;
- stack_extend(mrb, ci->nregs, 0, 0);
+ stack_extend(mrb, ci->nregs, 0);
}
else {
ci->nregs = p->body.irep->nregs + 1;
- stack_extend(mrb, ci->nregs, p->body.irep->nlocals, argc+2);
+ stack_extend(mrb, ci->nregs, argc+2);
}
mrb->c->stack[0] = self;
@@ -682,7 +683,7 @@ RETRY_TRY_BLOCK:
if (!mrb->c->stack) {
stack_init(mrb);
}
- stack_extend(mrb, irep->nregs, irep->nlocals, stack_keep);
+ stack_extend(mrb, irep->nregs, stack_keep);
mrb->c->ci->proc = proc;
mrb->c->ci->nregs = irep->nregs + 1;
regs = mrb->c->stack;
@@ -1047,11 +1048,11 @@ RETRY_TRY_BLOCK:
ci->nregs = irep->nregs;
if (n == CALL_MAXARGS) {
ci->argc = -1;
- stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, irep->nlocals, 3);
+ stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
}
else {
ci->argc = n;
- stack_extend(mrb, irep->nregs, irep->nlocals, n+2);
+ stack_extend(mrb, irep->nregs, n+2);
}
regs = mrb->c->stack;
pc = irep->iseq;
@@ -1111,10 +1112,10 @@ RETRY_TRY_BLOCK:
syms = irep->syms;
ci->nregs = irep->nregs;
if (ci->argc < 0) {
- stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, irep->nlocals, 3);
+ stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
}
else {
- stack_extend(mrb, irep->nregs, irep->nlocals, ci->argc+2);
+ stack_extend(mrb, irep->nregs, ci->argc+2);
}
regs = mrb->c->stack;
regs[0] = m->env->stack[0];
@@ -1186,10 +1187,10 @@ RETRY_TRY_BLOCK:
syms = irep->syms;
ci->nregs = irep->nregs;
if (n == CALL_MAXARGS) {
- stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, irep->nlocals, 3);
+ stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
}
else {
- stack_extend(mrb, irep->nregs, irep->nlocals, ci->argc+2);
+ stack_extend(mrb, irep->nregs, ci->argc+2);
}
regs = mrb->c->stack;
pc = irep->iseq;
@@ -1532,10 +1533,10 @@ RETRY_TRY_BLOCK:
pool = irep->pool;
syms = irep->syms;
if (ci->argc < 0) {
- stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, irep->nlocals, 3);
+ stack_extend(mrb, (irep->nregs < 3) ? 3 : irep->nregs, 3);
}
else {
- stack_extend(mrb, irep->nregs, irep->nlocals, ci->argc+2);
+ stack_extend(mrb, irep->nregs, ci->argc+2);
}
regs = mrb->c->stack;
pc = irep->iseq;
@@ -2172,7 +2173,7 @@ RETRY_TRY_BLOCK:
irep = p->body.irep;
pool = irep->pool;
syms = irep->syms;
- stack_extend(mrb, irep->nregs, irep->nlocals, 1);
+ stack_extend(mrb, irep->nregs, 1);
ci->nregs = irep->nregs;
regs = mrb->c->stack;
pc = irep->iseq;