summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--insns.def5
-rw-r--r--vm.c15
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 <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
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;
+ }
+}
+
+
/*********************************************************/
/*********************************************************/