diff options
| author | ksss <[email protected]> | 2014-05-06 23:23:32 +0900 |
|---|---|---|
| committer | ksss <[email protected]> | 2014-05-06 23:30:02 +0900 |
| commit | 0c3226db0443972eb76bde5af3f9e14bdb4dbd85 (patch) | |
| tree | acae276ce7c4169b084a209ee179f6a2ad003ee0 | |
| parent | 12915f95777448b9d8173e24824641eb7da10068 (diff) | |
| download | mruby-0c3226db0443972eb76bde5af3f9e14bdb4dbd85.tar.gz mruby-0c3226db0443972eb76bde5af3f9e14bdb4dbd85.zip | |
OP_ENTER fix variable assignment
| -rw-r--r-- | src/vm.c | 6 | ||||
| -rw-r--r-- | test/t/bs_block.rb | 7 |
2 files changed, 11 insertions, 2 deletions
@@ -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(®s[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(®s[m1+o+r+1], &argv[argc-m2], m2); + value_move(®s[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 |
