From 203286673d0c66fdcaf6e65acfa267aaebdc3400 Mon Sep 17 00:00:00 2001 From: ko1 Date: Tue, 5 Jun 2007 07:13:52 +0000 Subject: [PATCH] * insns.def (invokeblock): check block is created by lambda or Proc.new. * vm.c (block_proc_is_lambda): added. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@12439 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ insns.def | 5 +++-- vm.c | 15 +++++++++++++++ 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 312dbb63aa..ea7c2ee6d4 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Tue Jun 5 14:07:55 2007 Koichi Sasada + + * 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 * lib/pp.rb (PP::PPMethods::seplist): revert last change to work diff --git a/insns.def b/insns.def index ed147a773d..dc8b47b149 100644 --- a/insns.def +++ b/insns.def @@ -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, diff --git a/vm.c b/vm.c index 2c34b17e12..4ec0a8f8ae 100644 --- a/vm.c +++ b/vm.c @@ -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; + } +} + + /*********************************************************/ /*********************************************************/