summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-05-19 14:36:13 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-05-19 14:36:13 +0000
commit1368e42faf625167bbb9e356d864162e3665f196 (patch)
treef215e1c07fe2c71fdb617a9f163d01c932d515c2
parent50373cfc34ff99e92c42ca9351b025c81a9ed0a2 (diff)
downloadruby-1368e42faf625167bbb9e356d864162e3665f196.tar.gz
ruby-1368e42faf625167bbb9e356d864162e3665f196.tar.xz
ruby-1368e42faf625167bbb9e356d864162e3665f196.zip
* vm.c (invoke_block_from_c): fix call flow.
git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@16483 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog4
-rw-r--r--vm.c29
2 files changed, 24 insertions, 9 deletions
diff --git a/ChangeLog b/ChangeLog
index 290a58aac..8ae437486 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Mon May 19 23:32:12 2008 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (invoke_block_from_c): fix call flow.
+
Mon May 19 23:19:35 2008 Yusuke Endoh <mame@tsg.ne.jp>
* regexec.c (slow_search): check the case when the length is 1.
diff --git a/vm.c b/vm.c
index f5038462f..86cb92862 100644
--- a/vm.c
+++ b/vm.c
@@ -536,7 +536,7 @@ rb_call_super(int argc, const VALUE *argv)
/* 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,7 +563,10 @@ invoke_block_from_c(rb_thread_t *th, rb_block_t *block, VALUE self,
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);
}
@@ -573,22 +576,30 @@ invoke_block_from_c(rb_thread_t *th, rb_block_t *block, VALUE self,
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 @@ vm_invoke_proc(rb_thread_t *th, rb_proc_t *proc,
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();