diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | insns.def | 5 | ||||
-rw-r--r-- | vm.c | 15 |
3 files changed, 25 insertions, 2 deletions
@@ -1,3 +1,10 @@ +Tue Jun 5 14:07:55 2007 Koichi Sasada <ko1@atdot.net> + + * insns.def (invokeblock): check block is created by lambda + or Proc.new. + + * vm.c (block_proc_is_lambda): added. + Tue Jun 5 14:47:52 2007 Yukihiro Matsumoto <matz@ruby-lang.org> * lib/pp.rb (PP::PPMethods::seplist): revert last change to work @@ -1238,7 +1238,7 @@ send id = ip->defined_method_id; if (ip != ip->local_iseq) { - /* defined by method_defined() */ + /* defined by Module#define_method() */ rb_control_frame_t *lcfp = GET_CFP(); while (lcfp->iseq != ip) { @@ -1345,7 +1345,8 @@ invokeblock } INC_SP(-argc); - argc = th_yield_setup_args(th, iseq, argc, GET_SP(), 0); + argc = th_yield_setup_args(th, iseq, argc, GET_SP(), + block_proc_is_lambda(block->proc)); INC_SP(argc); push_frame(th, iseq, @@ -1351,6 +1351,21 @@ call_yarv_end_proc(VALUE data) rb_proc_call(data, rb_ary_new2(0)); } +static inline int +block_proc_is_lambda(VALUE procval) +{ + rb_proc_t *proc; + + if (procval) { + GetProcPtr(procval, proc); + return proc->is_lambda; + } + else { + return 0; + } +} + + /*********************************************************/ /*********************************************************/ |