aboutsummaryrefslogtreecommitdiffstats
path: root/vm_evalbody.ci
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-06-27 08:21:21 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-06-27 08:21:21 +0000
commitc44e2cdd58efbe13ed3b57cd56f98fc81ea64c2e (patch)
treeabdc14d507681448910f39bd422f65296ed9b8ce /vm_evalbody.ci
parent35ecb83d413f5d7143dd269b2d591cb742526a90 (diff)
downloadruby-c44e2cdd58efbe13ed3b57cd56f98fc81ea64c2e.tar.gz
* vm_evalbody.ci: support OPT_CALL_THREADED_CODE.
* insns.def, vm.c, vm.h: ditto. * vm.h: add VM_CFP_CNT() and VM_SP_CNT(). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12633 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_evalbody.ci')
-rw-r--r--vm_evalbody.ci19
1 files changed, 14 insertions, 5 deletions
diff --git a/vm_evalbody.ci b/vm_evalbody.ci
index a7c0f83262..53683865d5 100644
--- a/vm_evalbody.ci
+++ b/vm_evalbody.ci
@@ -122,15 +122,24 @@ VALUE
vm_eval(rb_thread_t *th, VALUE initial)
{
register rb_control_frame_t *reg_cfp = th->cfp;
- SET_PC(reg_cfp->iseq->iseq_encoded);
+ VALUE ret;
while (*GET_PC()) {
reg_cfp = ((insn_func_type) (*GET_PC()))(th, reg_cfp);
+
+ if (reg_cfp == 0) {
+ VALUE err = th->errinfo;
+ th->errinfo = Qnil;
+ return err;
+ }
}
- {
- VALUE ret = *--reg_cfp->sp;
- th->cfp--;
- return ret;
+
+ if (th->cfp->magic != FRAME_MAGIC_FINISH) {
+ rb_bug("cfp consistency error");
}
+
+ ret = *(th->cfp->sp-1); /* pop */
+ th->cfp++; /* pop cf */
+ return ret;
}
#endif