diff options
| author | ksss <[email protected]> | 2014-05-09 07:16:23 +0900 |
|---|---|---|
| committer | ksss <[email protected]> | 2014-05-09 08:04:36 +0900 |
| commit | 06a67df950a4a56190e1047d42054e0307f8c301 (patch) | |
| tree | f1ab69d9b46bdbe9e4a5a9fca9478a95ceb8a28c | |
| parent | c071ad13a9df20e8e030320eef0a483bf4e64932 (diff) | |
| download | mruby-06a67df950a4a56190e1047d42054e0307f8c301.tar.gz mruby-06a67df950a4a56190e1047d42054e0307f8c301.zip | |
OP_ENTER clean block object in register
| -rw-r--r-- | src/vm.c | 1 | ||||
| -rw-r--r-- | test/t/proc.rb | 17 |
2 files changed, 18 insertions, 0 deletions
@@ -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(®s[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 |
