[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]