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

ruby-changes:4990

From: ko1@a...
Date: Mon, 19 May 2008 23:36:26 +0900 (JST)
Subject: [ruby-changes:4990] ko1 - Ruby:r16483 (trunk): * vm.c (invoke_block_from_c): fix call flow.

ko1	2008-05-19 23:36:13 +0900 (Mon, 19 May 2008)

  New Revision: 16483

  Modified files:
    trunk/ChangeLog
    trunk/vm.c

  Log:
    * vm.c (invoke_block_from_c): fix call flow.
    


  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=16483&r2=16482&diff_format=u
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/vm.c?r1=16483&r2=16482&diff_format=u

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 16482)
+++ ChangeLog	(revision 16483)
@@ -1,3 +1,7 @@
+Mon May 19 23:32:12 2008  Koichi Sasada  <ko1@a...>
+
+	* vm.c (invoke_block_from_c): fix call flow.
+
 Mon May 19 23:19:35 2008  Yusuke Endoh  <mame@t...>
 
 	* regexec.c (slow_search): check the case when the length is 1.
Index: vm.c
===================================================================
--- vm.c	(revision 16482)
+++ vm.c	(revision 16483)
@@ -536,7 +536,7 @@
 
 /* C -> Ruby: block */
 
-static VALUE
+static inline VALUE
 invoke_block_from_c(rb_thread_t *th, rb_block_t *block, VALUE self,
 		    int argc, VALUE *argv, rb_block_t *blockptr, NODE *cref)
 {
@@ -563,8 +563,11 @@
 		      self, GC_GUARDED_PTR(block->dfp),
 		      iseq->iseq_encoded + opt_pc, cfp->sp + arg_size, block->lfp,
 		      iseq->local_size - arg_size);
-	th->cfp->dfp[-1] = (VALUE)cref;
 
+	if (cref) {
+	    th->cfp->dfp[-1] = (VALUE)cref;
+	}
+
 	val = vm_eval_body(th);
     }
     else {
@@ -573,22 +576,30 @@
     return val;
 }
 
-VALUE
-vm_yield_with_cref(rb_thread_t *th, int argc, VALUE *argv, NODE *cref)
+static inline rb_block_t *
+check_block(rb_thread_t *th)
 {
-    rb_block_t *block = GC_GUARDED_PTR_REF(th->cfp->lfp[0]);
+    rb_block_t *blockptr = GC_GUARDED_PTR_REF(th->cfp->lfp[0]);
 
-    if (block == 0) {
+    if (blockptr == 0) {
 	vm_localjump_error("no block given", Qnil, 0);
     }
 
-    return invoke_block_from_c(th, block, block->self, argc, argv, 0, cref);
+    return blockptr;
 }
 
 VALUE
+vm_yield_with_cref(rb_thread_t *th, int argc, VALUE *argv, NODE *cref)
+{
+    rb_block_t *blockptr = check_block(th);
+    return invoke_block_from_c(th, blockptr, blockptr->self, argc, argv, 0, cref);
+}
+
+VALUE
 vm_yield(rb_thread_t *th, int argc, VALUE *argv)
 {
-    return vm_yield_with_cref(th, argc, argv, (NODE *)Qnil);
+    rb_block_t *blockptr = check_block(th);
+    return invoke_block_from_c(th, blockptr, blockptr->self, argc, argv, 0, 0);
 }
 
 VALUE
@@ -603,7 +614,7 @@
     TH_PUSH_TAG(th);
     if ((state = EXEC_TAG()) == 0) {
 	th->safe_level = proc->safe_level;
-	val = invoke_block_from_c(th, &proc->block, self, argc, argv, blockptr, (NODE *)Qnil);
+	val = invoke_block_from_c(th, &proc->block, self, argc, argv, blockptr, 0);
     }
     TH_POP_TAG();
 

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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