ruby-changes:24601
From: ko1 <ko1@a...>
Date: Tue, 7 Aug 2012 20:14:09 +0900 (JST)
Subject: [ruby-changes:24601] ko1:r36652 (trunk): * vm_exec.c, insns.def (leave): solve problems on
ko1 2012-08-07 20:13:57 +0900 (Tue, 07 Aug 2012) New Revision: 36652 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36652 Log: * 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. Modified files: trunk/ChangeLog trunk/insns.def trunk/vm.c trunk/vm_core.h trunk/vm_dump.c trunk/vm_exec.c Index: ChangeLog =================================================================== --- ChangeLog (revision 36651) +++ ChangeLog (revision 36652) @@ -1,3 +1,16 @@ +Tue Aug 07 20:12:39 2012 Koichi Sasada <ko1@a...> + + * 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. + Tue Aug 7 11:58:27 2012 NAKAMURA Usaku <usa@r...> * test/ruby/test_require.rb (TestRequire#test_require_twice): added. Index: insns.def =================================================================== --- insns.def (revision 36651) +++ insns.def (revision 36652) @@ -1116,10 +1116,12 @@ RUBY_VM_CHECK_INTS(th); if (UNLIKELY(VM_FRAME_TYPE_FINISH_P(GET_CFP()))) { + vm_pop_frame(th); + #if OPT_CALL_THREADED_CODE - rb_bug("unused instruction on OPT_CALL_THREADED_CODE"); + th->retval = val; + return 0; #else - vm_pop_frame(th); return val; #endif } Index: vm_core.h =================================================================== --- vm_core.h (revision 36651) +++ vm_core.h (revision 36652) @@ -454,6 +454,11 @@ /* temporary place of errinfo */ VALUE errinfo; + /* temporary place of retval on OPT_CALL_THREADED_CODE */ +#if OPT_CALL_THREADED_CODE + VALUE retval; +#endif + /* async errinfo queue */ VALUE async_errinfo_queue; int async_errinfo_queue_checked; Index: vm_exec.c =================================================================== --- vm_exec.c (revision 36651) +++ vm_exec.c (revision 36652) @@ -105,39 +105,39 @@ 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; } - - ret = *(th->cfp->sp-1); /* pop */ - th->cfp++; /* pop cf */ - return ret; + else { + VALUE err = th->errinfo; + th->errinfo = Qnil; + return err; + } } #endif Index: vm.c =================================================================== --- vm.c (revision 36651) +++ vm.c (revision 36652) @@ -1796,6 +1796,10 @@ th->errinfo = Qnil; th->last_status = Qnil; th->waiting_fd = -1; + +#if OPT_CALL_THREADED_CODE + th->retval = Qundef; +#endif } static VALUE Index: vm_dump.c =================================================================== --- vm_dump.c (revision 36651) +++ vm_dump.c (revision 36652) @@ -345,7 +345,7 @@ { rb_iseq_t *iseq = cfp->iseq; - if (iseq != 0 && !VM_FRAME_TYPE_FINISH_P(cfp)) { + if (iseq != 0) { VALUE *seq = iseq->iseq; ptrdiff_t pc = cfp->pc - iseq->iseq_encoded; int i; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/