diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-12-12 06:11:04 -0800 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-12-12 06:11:04 -0800 |
| commit | f2d3c4d2f7361cbd5e246f78630cca919e342673 (patch) | |
| tree | 4e92107e85ecd69146e6c62291f0160295a0cbf5 | |
| parent | fd12f87712ee22b0a727f33f0c46c22ae968ec83 (diff) | |
| parent | 2fa0be2a3013478275fb392b267a99ae2425be65 (diff) | |
| download | mruby-f2d3c4d2f7361cbd5e246f78630cca919e342673.tar.gz mruby-f2d3c4d2f7361cbd5e246f78630cca919e342673.zip | |
Merge pull request #623 from liancheng/master
Call mrb_gc_arena_save/mrb_gc_arena_restore when proper
| -rw-r--r-- | src/codegen.c | 8 | ||||
| -rw-r--r-- | src/vm.c | 46 |
2 files changed, 27 insertions, 27 deletions
diff --git a/src/codegen.c b/src/codegen.c index 75ccce648..4244370e5 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1812,10 +1812,10 @@ codegen(codegen_scope *s, node *tree, int val) if (val) { char *p = (char*)tree->car; size_t len = (intptr_t)tree->cdr; - int ai = s->mrb->arena_idx; + int ai = mrb_gc_arena_save(s->mrb); int off = new_lit(s, mrb_str_new(s->mrb, p, len)); - s->mrb->arena_idx = ai; + mrb_gc_arena_restore(s->mrb, ai); genop(s, MKOP_ABx(OP_STRING, cursp(), off)); push(); } @@ -2083,7 +2083,7 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv) p->lv = lv; p->sp += node_len(lv)+1; /* add self */ p->nlocals = p->sp; - p->ai = mrb->arena_idx; + p->ai = mrb_gc_arena_save(mrb); p->filename = prev->filename; if (p->filename) { @@ -2118,7 +2118,7 @@ scope_finish(codegen_scope *s) irep->nlocals = s->nlocals; irep->nregs = s->nregs; - mrb->arena_idx = s->ai; + mrb_gc_arena_restore(mrb, s->ai); mrb_pool_close(s->mpool); } @@ -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; } @@ -1278,7 +1278,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 { @@ -1373,7 +1373,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; } @@ -1620,7 +1620,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), ®s[GETARG_B(i)]); - mrb->arena_idx = ai; + mrb_gc_arena_restore(mrb, ai); NEXT; } @@ -1628,7 +1628,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; } @@ -1700,14 +1700,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; } @@ -1729,7 +1729,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; } @@ -1746,7 +1746,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; } @@ -1770,7 +1770,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; } @@ -1787,7 +1787,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; } @@ -1816,7 +1816,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; @@ -1841,14 +1841,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; } @@ -1868,7 +1868,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; } |
