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/