summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog13
-rw-r--r--insns.def6
-rw-r--r--vm.c4
-rw-r--r--vm_core.h5
-rw-r--r--vm_dump.c2
-rw-r--r--vm_exec.c30
6 files changed, 42 insertions, 18 deletions
diff --git a/ChangeLog b/ChangeLog
index 8475b67eff..28f0b3a15f 100644
--- a/ChangeLog
+++ b/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>
* test/ruby/test_require.rb (TestRequire#test_require_twice): added.
diff --git a/insns.def b/insns.def
index b616368992..12cbed730d 100644
--- a/insns.def
+++ b/insns.def
@@ -1116,10 +1116,12 @@ leave
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
}
diff --git a/vm.c b/vm.c
index dd216bd048..63021533b6 100644
--- a/vm.c
+++ b/vm.c
@@ -1796,6 +1796,10 @@ th_init(rb_thread_t *th, VALUE self)
th->errinfo = Qnil;
th->last_status = Qnil;
th->waiting_fd = -1;
+
+#if OPT_CALL_THREADED_CODE
+ th->retval = Qundef;
+#endif
}
static VALUE
diff --git a/vm_core.h b/vm_core.h
index 130063a490..62850f28ce 100644
--- a/vm_core.h
+++ b/vm_core.h
@@ -454,6 +454,11 @@ typedef struct rb_thread_struct {
/* 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;
diff --git a/vm_dump.c b/vm_dump.c
index f5081116a8..99da986d7e 100644
--- a/vm_dump.c
+++ b/vm_dump.c
@@ -345,7 +345,7 @@ rb_vmdebug_debug_print_pre(rb_thread_t *th, rb_control_frame_t *cfp)
{
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;
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