From 6b3cc0052d93983cd7cb9ee48a3c4c140046fc2a Mon Sep 17 00:00:00 2001 From: ksss Date: Sat, 15 Mar 2014 00:03:53 +0900 Subject: fix self modifying bug --- mrbgems/mruby-enumerator/mrblib/enumerator.rb | 5 +++-- mrbgems/mruby-enumerator/test/enumerator.rb | 21 +++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb index 8641d99e0..cf909bac5 100644 --- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb +++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb @@ -255,6 +255,7 @@ class Enumerator # enum.each(:y, :z) { |elm| elm } #=> :method_returned # def each *argv, &block + obj = self if 0 < argv.length obj = self.dup args = obj.args @@ -264,9 +265,9 @@ class Enumerator else args = argv.dup end - @args = args + obj.args = args end - return self unless block_given? + return obj unless block_given? enumerator_block_call(&block) end diff --git a/mrbgems/mruby-enumerator/test/enumerator.rb b/mrbgems/mruby-enumerator/test/enumerator.rb index bbb22ee6d..2c85feef3 100644 --- a/mrbgems/mruby-enumerator/test/enumerator.rb +++ b/mrbgems/mruby-enumerator/test/enumerator.rb @@ -89,6 +89,27 @@ assert 'Enumerator#each' do assert_equal([1], ary) end +assert 'Enumerator#each arguments' do + obj = Object.new + + def obj.each_arg(a, b=:b, *rest) + yield a + yield b + yield rest + :method_returned + end + + enum = obj.to_enum :each_arg, :a, :x + + assert_equal [:a, :x, []], enum.each.to_a + assert_true enum.each.equal?(enum) + assert_equal :method_returned, enum.each { |elm| elm } + + assert_equal [:a, :x, [:y, :z]], enum.each(:y, :z).to_a + assert_false enum.each(:y, :z).equal?(enum) + assert_equal :method_returned, enum.each(:y, :z) { |elm| elm } +end + assert 'Enumerator#next' do e = 3.times 3.times { |i| -- cgit v1.2.3