diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-01-20 14:18:26 -0800 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2013-01-20 14:18:26 -0800 |
| commit | f53d5ee73c9da4c1296df640a3563cd5f42673b1 (patch) | |
| tree | b28e3d29b613ae058e3f90ef59d8a2d7ad750ade | |
| parent | 583983385b81c21f82704b116eab52d606a609f4 (diff) | |
| parent | 8f8d9fd41a57c8356b92d5e1d5b91ce0f6264b5c (diff) | |
| download | mruby-f53d5ee73c9da4c1296df640a3563cd5f42673b1.tar.gz mruby-f53d5ee73c9da4c1296df640a3563cd5f42673b1.zip | |
Merge pull request #751 from masamitsu-murase/modify_block_copy_of_op_enter
Modify handling of OP_ENTER.
| -rw-r--r-- | src/vm.c | 5 | ||||
| -rw-r--r-- | test/t/bs_block.rb | 8 |
2 files changed, 12 insertions, 1 deletions
@@ -1121,6 +1121,7 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) } else { if (argv0 != argv) { + regs[len+1] = *blk; /* move block */ memmove(®s[1], argv, sizeof(mrb_value)*(m1+o)); /* m1 + o */ } if (r) { /* r */ @@ -1129,7 +1130,9 @@ mrb_run(mrb_state *mrb, struct RProc *proc, mrb_value self) if (m2) { memmove(®s[m1+o+r+1], &argv[argc-m2], sizeof(mrb_value)*m2); } - regs[len+1] = *blk; /* move block */ + if (argv0 == argv) { + regs[len+1] = *blk; /* move block */ + } pc += o + 1; } JUMP; diff --git a/test/t/bs_block.rb b/test/t/bs_block.rb index 4bfdc304a..10313908b 100644 --- a/test/t/bs_block.rb +++ b/test/t/bs_block.rb @@ -332,6 +332,14 @@ assert('BS Block [ruby-dev:31160]') do m {|(v,(*))|} == nil end +assert('BS Block [issue #750]') do + def m(a, *b) + yield + end + args = [1, 2, 3] + m(*args){ 1 } == 1 +end + assert('BS Block 31') do def m() yield |
