summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-08-22 11:17:49 +0900
committerYukihiro Matsumoto <[email protected]>2012-08-22 11:17:49 +0900
commit655518f38a712073cd68d678b046226b64c98859 (patch)
tree3971140c6c0fddff71fac86afe7b86e971dd21f0 /src
parentd1f2841660ac4a020b2dfd763ee6a204d6b81577 (diff)
parent836a5ea3032b4dbb62626eb93d46da60082c3739 (diff)
downloadmruby-655518f38a712073cd68d678b046226b64c98859.tar.gz
mruby-655518f38a712073cd68d678b046226b64c98859.zip
Merge branch 'master' of github.com:mruby/mruby
Diffstat (limited to 'src')
-rw-r--r--src/gc.c6
-rw-r--r--src/state.c2
-rw-r--r--src/vm.c12
3 files changed, 12 insertions, 8 deletions
diff --git a/src/gc.c b/src/gc.c
index 9286f361b..9a45049d2 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -587,8 +587,10 @@ root_scan_phase(mrb_state *mrb)
mrb_gc_mark(mrb, (struct RBasic*)ci->target_class);
}
/* mark irep pool */
- for (i=0; i<mrb->irep_len; i++) {
- if (mrb->irep) {
+ if (mrb->irep) {
+ size_t len = mrb->irep_len;
+ if (len > mrb->irep_capa) len = mrb->irep_capa;
+ for (i=0; i<len; i++) {
mrb_irep *irep = mrb->irep[i];
if (!irep) continue;
for (j=0; j<irep->plen; j++) {
diff --git a/src/state.c b/src/state.c
index 6d34381ba..fb2bebe92 100644
--- a/src/state.c
+++ b/src/state.c
@@ -83,10 +83,12 @@ mrb_add_irep(mrb_state *mrb, int idx)
mrb->irep_capa = max;
}
else if (mrb->irep_capa <= idx) {
+ size_t old_capa = mrb->irep_capa;
while (mrb->irep_capa <= idx) {
mrb->irep_capa *= 2;
}
mrb->irep = (mrb_irep **)mrb_realloc(mrb, mrb->irep, sizeof(mrb_irep*)*mrb->irep_capa);
+ memset(mrb->irep + old_capa, 0, sizeof(mrb_irep*) * (mrb->irep_capa - old_capa));
}
}
diff --git a/src/vm.c b/src/vm.c
index cff09c96e..736b69b67 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -287,7 +287,7 @@ mrb_funcall_with_block(mrb_state *mrb, mrb_value self, mrb_sym mid, int argc, mr
val = p->body.func(mrb, self);
mrb->arena_idx = ai;
mrb_gc_protect(mrb, val);
- mrb->stack = mrb->stbase + ci->stackidx;
+ mrb->stack = mrb->stbase + mrb->ci->stackidx;
cipop(mrb);
}
else {
@@ -331,7 +331,7 @@ mrb_yield_internal(mrb_state *mrb, mrb_value b, int argc, mrb_value *argv, mrb_v
if (MRB_PROC_CFUNC_P(p)) {
val = p->body.func(mrb, self);
- mrb->stack = mrb->stbase + ci->stackidx;
+ mrb->stack = mrb->stbase + mrb->ci->stackidx;
cipop(mrb);
}
else {
@@ -772,7 +772,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
mrb->arena_idx = ai;
if (mrb->exc) goto L_RAISE;
/* pop stackpos */
- regs = mrb->stack = mrb->stbase + ci->stackidx;
+ regs = mrb->stack = mrb->stbase + mrb->ci->stackidx;
cipop(mrb);
NEXT;
}
@@ -830,7 +830,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
mrb->arena_idx = ai;
if (mrb->exc) goto L_RAISE;
/* pop stackpos */
- regs = mrb->stack = mrb->stbase + ci->stackidx;
+ regs = mrb->stack = mrb->stbase + mrb->ci->stackidx;
cipop(mrb);
NEXT;
}
@@ -903,7 +903,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
mrb->arena_idx = ai;
if (mrb->exc) goto L_RAISE;
/* pop stackpos */
- regs = mrb->stack = mrb->stbase + ci->stackidx;
+ regs = mrb->stack = mrb->stbase + mrb->ci->stackidx;
cipop(mrb);
NEXT;
}
@@ -1619,7 +1619,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self)
mrb->arena_idx = ai;
if (mrb->exc) goto L_RAISE;
/* pop stackpos */
- regs = mrb->stack = mrb->stbase + ci->stackidx;
+ regs = mrb->stack = mrb->stbase + mrb->ci->stackidx;
cipop(mrb);
NEXT;
}