From c1ccc983ff34df27b30d32bc20acd93323457fe5 Mon Sep 17 00:00:00 2001 From: ko1 Date: Wed, 27 Jun 2007 08:21:21 +0000 Subject: * 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: http://svn.ruby-lang.org/repos/ruby/trunk@12633 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm_evalbody.ci | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) (limited to 'vm_evalbody.ci') diff --git a/vm_evalbody.ci b/vm_evalbody.ci index a7c0f8326..53683865d 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 -- cgit