summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/src/vm.c b/src/vm.c
index 3047c9360..a08565d55 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -75,7 +75,12 @@ stack_clear(mrb_value *from, size_t count)
const mrb_value mrb_value_zero = { { 0 } };
while (count-- > 0) {
+#ifndef MRB_NAN_BOXING
*from++ = mrb_value_zero;
+#else
+ SET_NIL_VALUE(*from);
+ from++;
+#endif
}
}
@@ -156,15 +161,7 @@ stack_extend(mrb_state *mrb, int room, int keep)
}
if (room > keep) {
-#ifndef MRB_NAN_BOXING
stack_clear(&(mrb->c->stack[keep]), room - keep);
-#else
- struct mrb_context *c = mrb->c;
- int i;
- for (i=keep; i<room; i++) {
- SET_NIL_VALUE(c->stack[i]);
- }
-#endif
}
}
@@ -229,6 +226,8 @@ cipush(mrb_state *mrb)
ci->eidx = eidx;
ci->ridx = ridx;
ci->env = 0;
+ ci->pc = 0;
+
return ci;
}
@@ -512,8 +511,9 @@ argnum_error(mrb_state *mrb, int num)
mrb->exc = mrb_obj_ptr(exc);
}
+#define ERR_PC_HOOK(mrb, pc) mrb->c->ci->err = pc;
#ifdef ENABLE_DEBUG
-#define CODE_FETCH_HOOK(mrb, irep, pc, regs) if ((mrb)->code_fetch_hook) (mrb)->code_fetch_hook((mrb), (irep), (pc), (regs));
+#define CODE_FETCH_HOOK(mrb, irep, pc, regs) if ((mrb)->code_fetch_hook) (mrb)->code_fetch_hook((mrb), (irep), (pc), (regs));
#else
#define CODE_FETCH_HOOK(mrb, irep, pc, regs)
#endif
@@ -596,6 +596,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
stack_init(mrb);
}
stack_extend(mrb, irep->nregs, irep->nregs);
+ mrb->c->ci->err = pc;
mrb->c->ci->proc = proc;
mrb->c->ci->nregs = irep->nregs + 1;
regs = mrb->c->stack;
@@ -687,6 +688,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
CASE(OP_GETCV) {
/* A B R(A) := ivget(Sym(B)) */
+ ERR_PC_HOOK(mrb, pc);
regs[GETARG_A(i)] = mrb_vm_cv_get(mrb, syms[GETARG_Bx(i)]);
NEXT;
}
@@ -699,7 +701,12 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
CASE(OP_GETCONST) {
/* A B R(A) := constget(Sym(B)) */
- regs[GETARG_A(i)] = mrb_vm_const_get(mrb, syms[GETARG_Bx(i)]);
+ mrb_value val;
+
+ ERR_PC_HOOK(mrb, pc);
+ val = mrb_vm_const_get(mrb, syms[GETARG_Bx(i)]);
+ regs = mrb->c->stack;
+ regs[GETARG_A(i)] = val;
NEXT;
}
@@ -711,9 +718,13 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
CASE(OP_GETMCNST) {
/* A B C R(A) := R(C)::Sym(B) */
+ mrb_value val;
int a = GETARG_A(i);
- regs[a] = mrb_const_get(mrb, regs[a], syms[GETARG_Bx(i)]);
+ ERR_PC_HOOK(mrb, pc);
+ val = mrb_const_get(mrb, regs[a], syms[GETARG_Bx(i)]);
+ regs = mrb->c->stack;
+ regs[a] = val;
NEXT;
}