aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--insnhelper.ci9
-rw-r--r--test/ruby/test_yield.rb8
3 files changed, 19 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index c931b63150..dc16d8d625 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Nov 28 16:29:35 2007 Koichi Sasada <ko1@atdot.net>
+
+ * insnhelper.ci (vm_invoke_block): should splat args.
+ [ruby-dev:32392]
+
+ * test/ruby/test_yield.rb: add tests for above.
+
Wed Nov 28 14:43:14 2007 Nobuyoshi Nakada <nobu@ruby-lang.org>
* ext/extmk.rb (extract_makefile): use dldflags instead of DLDFLAGS to
diff --git a/insnhelper.ci b/insnhelper.ci
index 1518afa8b1..12ce484612 100644
--- a/insnhelper.ci
+++ b/insnhelper.ci
@@ -798,13 +798,12 @@ vm_invoke_block(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_num_t num, rb_n
}
iseq = block->iseq;
+ argc = caller_setup_args(th, GET_CFP(), flag, argc, 0, 0);
+
if (BUILTIN_TYPE(iseq) != T_NODE) {
int opt_pc;
- argc = caller_setup_args(th, GET_CFP(), flag, argc, 0, 0);
-
CHECK_STACK_OVERFLOW(GET_CFP(), iseq->stack_max);
-
DEC_SP(argc);
opt_pc = vm_yield_setup_args(th, iseq, argc, GET_SP(), 0,
block_proc_is_lambda(block->proc));
@@ -820,8 +819,8 @@ vm_invoke_block(rb_thread_t *th, rb_control_frame_t *reg_cfp, rb_num_t num, rb_n
return Qundef;
}
else {
- val = vm_yield_with_cfunc(th, block, block->self, num, STACK_ADDR_FROM_TOP(num));
- POPN(num); /* TODO: should put before C/yield? */
+ val = vm_yield_with_cfunc(th, block, block->self, argc, STACK_ADDR_FROM_TOP(argc));
+ POPN(argc); /* TODO: should put before C/yield? */
return val;
}
}
diff --git a/test/ruby/test_yield.rb b/test/ruby/test_yield.rb
index 3ae6881b87..e7de995743 100644
--- a/test/ruby/test_yield.rb
+++ b/test/ruby/test_yield.rb
@@ -64,6 +64,14 @@ class TestRubyYield < Test::Unit::TestCase
}
end
+ def test_with_enum
+ obj = Object
+ def obj.each
+ yield(*[])
+ end
+ obj.each{|*v| assert_equal([], [], '[ruby-dev:32392]')}
+ obj.to_enum.each{|*v| assert_equal([], [], '[ruby-dev:32392]')}
+ end
end
require 'sentence'