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 | efe27762873b0aaab265ff645251bbffe2838554 (patch) | |
| tree | d167acd2633820df6a0840a68ae3592bbdb5f0e7 /insnhelper.ci | |
| parent | 9fc443bf1d665535408ae014c5e741a7e7d72c70 (diff) | |
| download | ruby-efe27762873b0aaab265ff645251bbffe2838554.tar.gz ruby-efe27762873b0aaab265ff645251bbffe2838554.tar.xz ruby-efe27762873b0aaab265ff645251bbffe2838554.zip | |
* insnhelper.ci (caller_setup_args): add need_block_check option.
* insns.def: ditto.
* yarvcore.h: add GetCoreDataFromValue().
git-svn-id: http://svn.ruby-lang.org/repos/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 05cb6a03e..02489f7dc 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) { |
