summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-01-20 14:18:26 -0800
committerYukihiro "Matz" Matsumoto <[email protected]>2013-01-20 14:18:26 -0800
commitf53d5ee73c9da4c1296df640a3563cd5f42673b1 (patch)
treeb28e3d29b613ae058e3f90ef59d8a2d7ad750ade
parent583983385b81c21f82704b116eab52d606a609f4 (diff)
parent8f8d9fd41a57c8356b92d5e1d5b91ce0f6264b5c (diff)
downloadmruby-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.c5
-rw-r--r--test/t/bs_block.rb8
2 files changed, 12 insertions, 1 deletions
diff --git a/src/vm.c b/src/vm.c
index 8ae28ef5e..696b566c8 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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(&regs[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(&regs[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