diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-06-24 18:40:13 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-06-24 18:40:13 +0000 |
commit | 144ff322c7adcc600139da1cfacf0e98010c1bce (patch) | |
tree | d167acd2633820df6a0840a68ae3592bbdb5f0e7 /insnhelper.ci | |
parent | 7980e653e57ae5b539533dee1d0b1a00fc16ea5d (diff) | |
download | ruby-144ff322c7adcc600139da1cfacf0e98010c1bce.tar.gz |
* insnhelper.ci (caller_setup_args): add need_block_check option.
* insns.def: ditto.
* yarvcore.h: add GetCoreDataFromValue().
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12606 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'insnhelper.ci')
-rw-r--r-- | insnhelper.ci | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/insnhelper.ci b/insnhelper.ci index 05cb6a03e8..02489f7dc3 100644 --- a/insnhelper.ci +++ b/insnhelper.ci @@ -191,37 +191,40 @@ vm_callee_setup_arg(rb_thread_t *th, rb_iseq_t *iseq, static inline int caller_setup_args(rb_thread_t *th, rb_control_frame_t *cfp, - VALUE flag, int argc, rb_iseq_t *blockiseq, rb_block_t **block) + VALUE flag, int argc, rb_iseq_t *blockiseq, + rb_block_t **block, int need_block_check) { rb_block_t *blockptr = 0; - if (flag & VM_CALL_ARGS_BLOCKARG_BIT) { - rb_proc_t *po; - VALUE proc; + if (need_block_check) { + if (flag & VM_CALL_ARGS_BLOCKARG_BIT) { + rb_proc_t *po; + VALUE proc; - proc = *(--cfp->sp); + proc = *(--cfp->sp); - if (proc != Qnil) { - if (!rb_obj_is_proc(proc)) { - proc = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc"); + if (proc != Qnil) { if (!rb_obj_is_proc(proc)) { - rb_raise(rb_eTypeError, - "wrong argument type %s (expected Proc)", - rb_obj_classname(proc)); + proc = rb_check_convert_type(proc, T_DATA, "Proc", "to_proc"); + if (!rb_obj_is_proc(proc)) { + rb_raise(rb_eTypeError, + "wrong argument type %s (expected Proc)", + rb_obj_classname(proc)); + } } + GetProcPtr(proc, po); + blockptr = &po->block; + RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp)->proc = proc; + *block = blockptr; } - GetProcPtr(proc, po); - blockptr = &po->block; - RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp)->proc = proc; + } + else if (blockiseq) { + blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp); + blockptr->iseq = blockiseq; + blockptr->proc = 0; *block = blockptr; } } - else if (blockiseq) { - blockptr = RUBY_VM_GET_BLOCK_PTR_IN_CFP(cfp); - blockptr->iseq = blockiseq; - blockptr->proc = 0; - *block = blockptr; - } /* expand top of stack? */ if (flag & VM_CALL_ARGS_SPLAT_BIT) { |