summaryrefslogtreecommitdiffhomepage
path: root/src/vm.c
diff options
context:
space:
mode:
authorLian Cheng <[email protected]>2012-12-12 21:05:02 +0800
committerLian Cheng <[email protected]>2012-12-12 21:05:02 +0800
commit2fa0be2a3013478275fb392b267a99ae2425be65 (patch)
tree25f05c3212ddc635a54dc26b70bea04a86b1f683 /src/vm.c
parent975adbfb5fde10f797480efb3f97b6d8bf659443 (diff)
downloadmruby-2fa0be2a3013478275fb392b267a99ae2425be65.tar.gz
mruby-2fa0be2a3013478275fb392b267a99ae2425be65.zip
Call mrb_gc_arena_save/mrb_gc_arena_restore instead of manipulating arena index directly
Diffstat (limited to 'src/vm.c')
-rw-r--r--src/vm.c46
1 files changed, 23 insertions, 23 deletions
diff --git a/src/vm.c b/src/vm.c
index 2b0dda7d5..bee99515e 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -363,9 +363,9 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, int argc, mr
mrb->stack[argc+1] = blk;
if (MRB_PROC_CFUNC_P(p)) {
- int ai = mrb->arena_idx;
+ int ai = mrb_gc_arena_save(mrb);
val = p->body.func(mrb, self);
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
mrb_gc_protect(mrb, val);
mrb->stack = mrb->stbase + mrb->ci->stackidx;
cipop(mrb);
@@ -511,7 +511,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
mrb_sym *syms = irep->syms;
mrb_value *regs = NULL;
mrb_code i;
- int ai = mrb->arena_idx;
+ int ai = mrb_gc_arena_save(mrb);
jmp_buf *prev_jmp = (jmp_buf *)mrb->jmp;
jmp_buf c_jmp;
@@ -761,7 +761,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
mrb->ensure = (struct RProc **)mrb_realloc(mrb, mrb->ensure, sizeof(struct RProc*) * mrb->esize);
}
mrb->ensure[mrb->ci->eidx++] = p;
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
@@ -773,7 +773,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
for (n=0; n<a; n++) {
ecall(mrb, --mrb->ci->eidx);
}
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
@@ -849,7 +849,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
}
result = m->body.func(mrb, recv);
mrb->stack[0] = result;
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
if (mrb->exc) goto L_RAISE;
/* pop stackpos */
regs = mrb->stack = mrb->stbase + mrb->ci->stackidx;
@@ -902,7 +902,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
/* prepare stack */
if (MRB_PROC_CFUNC_P(m)) {
recv = m->body.func(mrb, recv);
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
if (mrb->exc) goto L_RAISE;
/* pop stackpos */
ci = mrb->ci;
@@ -981,7 +981,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
if (MRB_PROC_CFUNC_P(m)) {
mrb->stack[0] = m->body.func(mrb, recv);
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
if (mrb->exc) goto L_RAISE;
/* pop stackpos */
regs = mrb->stack = mrb->stbase + mrb->ci->stackidx;
@@ -1058,7 +1058,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
rest->len = m1+len+m2;
}
regs[a+1] = stack[m1+r+m2];
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
@@ -1277,7 +1277,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
if (MRB_PROC_CFUNC_P(m)) {
mrb->stack[0] = m->body.func(mrb, recv);
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
goto L_RETURN;
}
else {
@@ -1372,7 +1372,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
default:
goto L_SEND;
}
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
@@ -1619,7 +1619,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
CASE(OP_ARRAY) {
/* A B C R(A) := ary_new(R(B),R(B+1)..R(B+C)) */
regs[GETARG_A(i)] = mrb_ary_new_from_values(mrb, GETARG_C(i), &regs[GETARG_B(i)]);
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
@@ -1627,7 +1627,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
/* A B mrb_ary_concat(R(A),R(B)) */
mrb_ary_concat(mrb, regs[GETARG_A(i)],
mrb_ary_splat(mrb, regs[GETARG_B(i)]));
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
@@ -1699,14 +1699,14 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
}
}
}
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
CASE(OP_STRING) {
/* A Bx R(A) := str_new(Lit(Bx)) */
regs[GETARG_A(i)] = mrb_str_literal(mrb, pool[GETARG_Bx(i)]);
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
@@ -1728,7 +1728,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
b+=2;
}
regs[GETARG_A(i)] = hash;
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
@@ -1745,7 +1745,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
}
if (c & OP_L_STRICT) p->flags |= MRB_PROC_STRICT;
regs[GETARG_A(i)] = mrb_obj_value(p);
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
@@ -1769,7 +1769,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
}
c = mrb_vm_define_class(mrb, base, super, id);
regs[a] = mrb_obj_value(c);
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
@@ -1786,7 +1786,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
}
c = mrb_vm_define_module(mrb, base, id);
regs[a] = mrb_obj_value(c);
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
@@ -1815,7 +1815,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
if (MRB_PROC_CFUNC_P(p)) {
mrb->stack[0] = p->body.func(mrb, recv);
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
if (mrb->exc) goto L_RAISE;
/* pop stackpos */
regs = mrb->stack = mrb->stbase + mrb->ci->stackidx;
@@ -1840,14 +1840,14 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
struct RClass *c = mrb_class_ptr(regs[a]);
mrb_define_method_vm(mrb, c, syms[GETARG_B(i)], regs[a+1]);
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
CASE(OP_SCLASS) {
/* A B R(A) := R(B).singleton_class */
regs[GETARG_A(i)] = mrb_singleton_class(mrb, regs[GETARG_B(i)]);
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}
@@ -1867,7 +1867,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
/* A B C R(A) := range_new(R(B),R(B+1),C) */
int b = GETARG_B(i);
regs[GETARG_A(i)] = mrb_range_new(mrb, regs[b], regs[b+1], GETARG_C(i));
- mrb->arena_idx = ai;
+ mrb_gc_arena_restore(mrb, ai);
NEXT;
}