From 0d1a905edb43fe9260302b286d04cec66f7c4416 Mon Sep 17 00:00:00 2001 From: ko1 Date: Tue, 7 Aug 2012 11:13:57 +0000 Subject: * vm_exec.c, insns.def (leave): solve problems on OPT_CALL_THREADED_CODE. Catch up finish frame structure on OPT_CALL_THREADED_CODE. * vm_core.h: add rb_thread_t#retval for temporary space on OPT_CALL_THREADED_CODE. * vm.c (th_init): clear rb_thread_t#retval as Qundef. * vm_dump.c (rb_vmdebug_debug_print_pre): fix debug print format. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@36652 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm_exec.c | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) (limited to 'vm_exec.c') diff --git a/vm_exec.c b/vm_exec.c index 6bd4f4e735..7cdd96ff39 100644 --- a/vm_exec.c +++ b/vm_exec.c @@ -105,39 +105,39 @@ rb_vm_get_insns_address_table(void) return (const void **)vm_exec_core(0, 0); } -#else +#else /* OPT_CALL_THREADED_CODE */ #include "vm.inc" #include "vmtc.inc" -const void *const * +const void ** rb_vm_get_insns_address_table(void) { - return insns_address_table; + return (const void **)insns_address_table; } static VALUE vm_exec_core(rb_thread_t *th, VALUE initial) { register rb_control_frame_t *reg_cfp = th->cfp; - VALUE ret; - while (*GET_PC()) { + while (1) { reg_cfp = ((rb_insn_func_t) (*GET_PC()))(th, reg_cfp); - if (reg_cfp == 0) { - VALUE err = th->errinfo; - th->errinfo = Qnil; - return err; + if (UNLIKELY(reg_cfp == 0)) { + break; } } - if (VM_FRAME_TYPE_FINISH_P(th->cfp)) { - rb_bug("cfp consistency error"); + if (th->retval != Qundef) { + VALUE ret = th->retval; + th->retval = Qundef; + return ret; + } + else { + VALUE err = th->errinfo; + th->errinfo = Qnil; + return err; } - - ret = *(th->cfp->sp-1); /* pop */ - th->cfp++; /* pop cf */ - return ret; } #endif -- cgit v1.2.3