From e846db709f2ce879a91dcc4c90b7f348020ff6b0 Mon Sep 17 00:00:00 2001 From: KOBAYASHI Shuji Date: Thu, 7 Feb 2019 23:52:08 +0900 Subject: Fix `Enumerator#(initialize|inspect)` for `nil`/`false` --- mrbgems/mruby-enumerator/mrblib/enumerator.rb | 12 +++++------- mrbgems/mruby-enumerator/test/enumerator.rb | 13 ++++++++----- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb index cbf53974a..143f2b74f 100644 --- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb +++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb @@ -109,11 +109,11 @@ class Enumerator # # p fib.take(10) # => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] # - def initialize(obj=nil, meth=:each, *args, &block) + def initialize(obj=NONE, meth=:each, *args, &block) if block obj = Generator.new(&block) - else - raise ArgumentError unless obj + elsif obj == NONE + raise ArgumentError, "wrong number of arguments (given 0, expected 1+)" end if @obj and !self.respond_to?(meth) raise NoMethodError, "undefined method #{meth}" @@ -221,13 +221,11 @@ class Enumerator end def inspect - return "#<#{self.class}: uninitialized>" unless @obj - if @args && @args.size > 0 args = @args.join(", ") - "#<#{self.class}: #{@obj}:#{@meth}(#{args})>" + "#<#{self.class}: #{@obj.inspect}:#{@meth}(#{args})>" else - "#<#{self.class}: #{@obj}:#{@meth}>" + "#<#{self.class}: #{@obj.inspect}:#{@meth}>" end end diff --git a/mrbgems/mruby-enumerator/test/enumerator.rb b/mrbgems/mruby-enumerator/test/enumerator.rb index f3bd1bdba..0d2a95292 100644 --- a/mrbgems/mruby-enumerator/test/enumerator.rb +++ b/mrbgems/mruby-enumerator/test/enumerator.rb @@ -21,6 +21,7 @@ assert 'Enumerator.new' do assert_equal [1,2,3], @obj.to_enum(:foo, 1,2,3).to_a assert_equal [1,2,3], Enumerator.new(@obj, :foo, 1,2,3).to_a assert_equal [1,2,3], Enumerator.new { |y| i = 0; loop { y << (i += 1) } }.take(3) + assert_equal [], Enumerator.new(false, :__id__).to_a assert_raise(ArgumentError) { Enumerator.new } assert_raise(ArgumentError) { @obj.to_enum } @@ -92,11 +93,13 @@ end assert 'Enumerator#inspect' do e = (0..10).each - assert_equal("#", e.inspect) - e = Enumerator.new("FooObject", :foo, 1) - assert_equal("#", e.inspect) - e = Enumerator.new("FooObject", :foo, 1, 2, 3) - assert_equal("#", e.inspect) + assert_equal('#', e.inspect) + e = Enumerator.new('FooObject', :foo, 1) + assert_equal('#', e.inspect) + e = Enumerator.new('FooObject', :foo, 1, 2, 3) + assert_equal('#', e.inspect) + e = Enumerator.new(nil, :to_s) + assert_equal('#', e.inspect) end assert 'Enumerator#each' do -- cgit v1.2.3 From 32f3ffa2c9ab4f02b085ef6d8c0fa1c9f2eda799 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 8 Feb 2019 09:31:55 +0900 Subject: Update #4265 patch. * Update doc comment to clarify `Enumerator.new` without a block is deprecated and left only for internal use. * Fixed some cases `mruby` raise `ArgumentError` too eagerly compared with `CRuby`. --- mrbgems/mruby-enumerator/mrblib/enumerator.rb | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb index 143f2b74f..cecc424e6 100644 --- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb +++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb @@ -109,14 +109,22 @@ class Enumerator # # p fib.take(10) # => [1, 1, 2, 3, 5, 8, 13, 21, 34, 55] # + # In the second, deprecated, form, a generated Enumerator iterates over the + # given object using the given method with the given arguments passed. This + # form is left only for internal use. + # + # Use of this form is discouraged. Use Kernel#enum_for or Kernel#to_enum + # instead. def initialize(obj=NONE, meth=:each, *args, &block) if block obj = Generator.new(&block) - elsif obj == NONE - raise ArgumentError, "wrong number of arguments (given 0, expected 1+)" - end - if @obj and !self.respond_to?(meth) - raise NoMethodError, "undefined method #{meth}" + else + if obj == NONE + raise ArgumentError, "wrong number of arguments (given 0, expected 1+)" + end + if @obj && !self.respond_to?(meth) + raise NoMethodError, "undefined method #{meth}" + end end @obj = obj @@ -610,9 +618,6 @@ module Kernel # enum.first(4) # => [1, 1, 1, 2] # def to_enum(meth=:each, *args) - unless self.respond_to?(meth) - raise ArgumentError, "undefined method #{meth}" - end Enumerator.new self, meth, *args end alias enum_for to_enum -- cgit v1.2.3 From c32e3158f50fb9018702d356c303e61ee3a2e1ea Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Fri, 8 Feb 2019 09:34:31 +0900 Subject: Update `mruby-enumerator` test to conform the last update. --- mrbgems/mruby-enumerator/test/enumerator.rb | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/mrbgems/mruby-enumerator/test/enumerator.rb b/mrbgems/mruby-enumerator/test/enumerator.rb index 0d2a95292..57f971fba 100644 --- a/mrbgems/mruby-enumerator/test/enumerator.rb +++ b/mrbgems/mruby-enumerator/test/enumerator.rb @@ -19,11 +19,8 @@ assert 'Enumerator.new' do assert_equal [:x,:y,:z], [:x,:y,:z].each.map{|i| i}.sort assert_equal [[:x,1],[:y,2]], {x:1, y:2}.each.map{|i| i}.sort assert_equal [1,2,3], @obj.to_enum(:foo, 1,2,3).to_a - assert_equal [1,2,3], Enumerator.new(@obj, :foo, 1,2,3).to_a assert_equal [1,2,3], Enumerator.new { |y| i = 0; loop { y << (i += 1) } }.take(3) - assert_equal [], Enumerator.new(false, :__id__).to_a assert_raise(ArgumentError) { Enumerator.new } - assert_raise(ArgumentError) { @obj.to_enum } # examples fib = Enumerator.new do |y| @@ -94,11 +91,11 @@ end assert 'Enumerator#inspect' do e = (0..10).each assert_equal('#', e.inspect) - e = Enumerator.new('FooObject', :foo, 1) + e = 'FooObject'.enum_for(:foo, 1) assert_equal('#', e.inspect) - e = Enumerator.new('FooObject', :foo, 1, 2, 3) + e = 'FooObject'.enum_for(:foo, 1, 2, 3) assert_equal('#', e.inspect) - e = Enumerator.new(nil, :to_s) + e = nil.enum_for(:to_s) assert_equal('#', e.inspect) end @@ -422,7 +419,6 @@ end assert 'Kernel#to_enum' do assert_equal Enumerator, [].to_enum.class - assert_raise(ArgumentError){ nil.to_enum } end assert 'modifying existing methods' do -- cgit v1.2.3