зеркало из https://github.com/github/ruby.git
* 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
This commit is contained in:
Родитель
fca3c408a7
Коммит
0d1a905edb
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
||||||
|
Tue Aug 07 20:12:39 2012 Koichi Sasada <ko1@atdot.net>
|
||||||
|
|
||||||
|
* 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@ruby-lang.org>
|
Tue Aug 7 11:58:27 2012 NAKAMURA Usaku <usa@ruby-lang.org>
|
||||||
|
|
||||||
* test/ruby/test_require.rb (TestRequire#test_require_twice): added.
|
* test/ruby/test_require.rb (TestRequire#test_require_twice): added.
|
||||||
|
|
|
@ -1116,10 +1116,12 @@ leave
|
||||||
RUBY_VM_CHECK_INTS(th);
|
RUBY_VM_CHECK_INTS(th);
|
||||||
|
|
||||||
if (UNLIKELY(VM_FRAME_TYPE_FINISH_P(GET_CFP()))) {
|
if (UNLIKELY(VM_FRAME_TYPE_FINISH_P(GET_CFP()))) {
|
||||||
#if OPT_CALL_THREADED_CODE
|
|
||||||
rb_bug("unused instruction on OPT_CALL_THREADED_CODE");
|
|
||||||
#else
|
|
||||||
vm_pop_frame(th);
|
vm_pop_frame(th);
|
||||||
|
|
||||||
|
#if OPT_CALL_THREADED_CODE
|
||||||
|
th->retval = val;
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
return val;
|
return val;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
4
vm.c
4
vm.c
|
@ -1796,6 +1796,10 @@ th_init(rb_thread_t *th, VALUE self)
|
||||||
th->errinfo = Qnil;
|
th->errinfo = Qnil;
|
||||||
th->last_status = Qnil;
|
th->last_status = Qnil;
|
||||||
th->waiting_fd = -1;
|
th->waiting_fd = -1;
|
||||||
|
|
||||||
|
#if OPT_CALL_THREADED_CODE
|
||||||
|
th->retval = Qundef;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
|
|
|
@ -454,6 +454,11 @@ typedef struct rb_thread_struct {
|
||||||
/* temporary place of errinfo */
|
/* temporary place of errinfo */
|
||||||
VALUE errinfo;
|
VALUE errinfo;
|
||||||
|
|
||||||
|
/* temporary place of retval on OPT_CALL_THREADED_CODE */
|
||||||
|
#if OPT_CALL_THREADED_CODE
|
||||||
|
VALUE retval;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* async errinfo queue */
|
/* async errinfo queue */
|
||||||
VALUE async_errinfo_queue;
|
VALUE async_errinfo_queue;
|
||||||
int async_errinfo_queue_checked;
|
int async_errinfo_queue_checked;
|
||||||
|
|
|
@ -345,7 +345,7 @@ rb_vmdebug_debug_print_pre(rb_thread_t *th, rb_control_frame_t *cfp)
|
||||||
{
|
{
|
||||||
rb_iseq_t *iseq = cfp->iseq;
|
rb_iseq_t *iseq = cfp->iseq;
|
||||||
|
|
||||||
if (iseq != 0 && !VM_FRAME_TYPE_FINISH_P(cfp)) {
|
if (iseq != 0) {
|
||||||
VALUE *seq = iseq->iseq;
|
VALUE *seq = iseq->iseq;
|
||||||
ptrdiff_t pc = cfp->pc - iseq->iseq_encoded;
|
ptrdiff_t pc = cfp->pc - iseq->iseq_encoded;
|
||||||
int i;
|
int i;
|
||||||
|
|
30
vm_exec.c
30
vm_exec.c
|
@ -105,39 +105,39 @@ rb_vm_get_insns_address_table(void)
|
||||||
return (const void **)vm_exec_core(0, 0);
|
return (const void **)vm_exec_core(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else /* OPT_CALL_THREADED_CODE */
|
||||||
|
|
||||||
#include "vm.inc"
|
#include "vm.inc"
|
||||||
#include "vmtc.inc"
|
#include "vmtc.inc"
|
||||||
|
|
||||||
const void *const *
|
const void **
|
||||||
rb_vm_get_insns_address_table(void)
|
rb_vm_get_insns_address_table(void)
|
||||||
{
|
{
|
||||||
return insns_address_table;
|
return (const void **)insns_address_table;
|
||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
vm_exec_core(rb_thread_t *th, VALUE initial)
|
vm_exec_core(rb_thread_t *th, VALUE initial)
|
||||||
{
|
{
|
||||||
register rb_control_frame_t *reg_cfp = th->cfp;
|
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);
|
reg_cfp = ((rb_insn_func_t) (*GET_PC()))(th, reg_cfp);
|
||||||
|
|
||||||
if (reg_cfp == 0) {
|
if (UNLIKELY(reg_cfp == 0)) {
|
||||||
VALUE err = th->errinfo;
|
break;
|
||||||
th->errinfo = Qnil;
|
|
||||||
return err;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VM_FRAME_TYPE_FINISH_P(th->cfp)) {
|
if (th->retval != Qundef) {
|
||||||
rb_bug("cfp consistency error");
|
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
|
#endif
|
||||||
|
|
Загрузка…
Ссылка в новой задаче