summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorksss <[email protected]>2014-05-06 23:23:32 +0900
committerksss <[email protected]>2014-05-06 23:30:02 +0900
commit0c3226db0443972eb76bde5af3f9e14bdb4dbd85 (patch)
treeacae276ce7c4169b084a209ee179f6a2ad003ee0
parent12915f95777448b9d8173e24824641eb7da10068 (diff)
downloadmruby-0c3226db0443972eb76bde5af3f9e14bdb4dbd85.tar.gz
mruby-0c3226db0443972eb76bde5af3f9e14bdb4dbd85.zip
OP_ENTER fix variable assignment
-rw-r--r--src/vm.c6
-rw-r--r--test/t/bs_block.rb7
2 files changed, 11 insertions, 2 deletions
diff --git a/src/vm.c b/src/vm.c
index ae19db0b6..317b5f6b1 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1325,16 +1325,18 @@ RETRY_TRY_BLOCK:
pc += argc - m1 - m2 + 1;
}
else {
+ int rnum = 0;
if (argv0 != argv) {
regs[len+1] = *blk; /* move block */
value_move(&regs[1], argv, m1+o);
}
if (r) {
- regs[m1+o+1] = mrb_ary_new_from_values(mrb, argc-m1-o-m2, argv+m1+o);
+ rnum = argc-m1-o-m2;
+ regs[m1+o+1] = mrb_ary_new_from_values(mrb, rnum, argv+m1+o);
}
if (m2) {
if (argc-m2 > m1) {
- value_move(&regs[m1+o+r+1], &argv[argc-m2], m2);
+ value_move(&regs[m1+o+r+1], &argv[m1+o+rnum], m2);
}
}
if (argv0 == argv) {
diff --git a/test/t/bs_block.rb b/test/t/bs_block.rb
index 0a58741e3..04a4a15ba 100644
--- a/test/t/bs_block.rb
+++ b/test/t/bs_block.rb
@@ -512,3 +512,10 @@ assert('BS Block 37') do
end
end
+assert('BS Block 38') do
+ def iter
+ yield 1,2,3,4,5,6
+ end
+
+ assert_equal [1,2,3,4,5], iter{|a,b,c=:c,d,e| [a,b,c,d,e]}
+end