summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2014-05-09 12:00:53 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2014-05-09 12:00:53 +0900
commitb8e524bb9e0852b10c011d7953daf7284443fe95 (patch)
tree2dee3be1b4ac3b2b691845ce30cb3a9882a49a29
parent78f2d283a76ab4ea94405aa55f98cf1a3cc059b1 (diff)
parent06a67df950a4a56190e1047d42054e0307f8c301 (diff)
downloadmruby-b8e524bb9e0852b10c011d7953daf7284443fe95.tar.gz
mruby-b8e524bb9e0852b10c011d7953daf7284443fe95.zip
Merge pull request #2214 from ksss/proc-clear
OP_ENTER clean block object in register
-rw-r--r--src/vm.c1
-rw-r--r--test/t/proc.rb17
2 files changed, 18 insertions, 0 deletions
diff --git a/src/vm.c b/src/vm.c
index 317b5f6b1..620f9e977 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -1307,6 +1307,7 @@ RETRY_TRY_BLOCK:
mrb->c->ci->argc = len;
if (argc < len) {
regs[len+1] = *blk; /* move block */
+ SET_NIL_VALUE(regs[argc+1]);
if (argv0 != argv) {
value_move(&regs[1], argv, argc-m2); /* m1 + o */
}
diff --git a/test/t/proc.rb b/test/t/proc.rb
index 151e1df86..1be73c99a 100644
--- a/test/t/proc.rb
+++ b/test/t/proc.rb
@@ -55,6 +55,23 @@ assert('Proc#call', '15.2.17.4.3') do
assert_equal 5, a2
end
+assert('Proc#call proc args pos block') do
+ pr = proc {|a,b,&c|
+ [a, b, c.class, c&&c.call(:x)]
+ }
+ assert_equal [nil, nil, Proc, :proc], (pr.call(){ :proc })
+ assert_equal [1, nil, Proc, :proc], (pr.call(1){ :proc })
+ assert_equal [1, 2, Proc, :proc], (pr.call(1, 2){ :proc })
+ assert_equal [1, 2, Proc, :proc], (pr.call(1, 2, 3){ :proc })
+ assert_equal [1, 2, Proc, :proc], (pr.call(1, 2, 3, 4){ :proc })
+
+ assert_equal [nil, nil, Proc, :x], (pr.call(){|x| x})
+ assert_equal [1, nil, Proc, :x], (pr.call(1){|x| x})
+ assert_equal [1, 2, Proc, :x], (pr.call(1, 2){|x| x})
+ assert_equal [1, 2, Proc, :x], (pr.call(1, 2, 3){|x| x})
+ assert_equal [1, 2, Proc, :x], (pr.call(1, 2, 3, 4){|x| x})
+end
+
assert('Proc#return_does_not_break_self') do
class TestClass
attr_accessor :block