From 0a0cc5a217b577dfadddfb250d5a91ca69978887 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Mon, 19 Nov 2018 10:40:07 +0900 Subject: Check method existence for Enumerators; fix #3920 The issue #3920 was fixed but the fundamental flaw of lack of stack depth check along with fibers still remains, even though it's not easy to cause the issue. Use `MRB_GC_FIXED_ARENA` to avoid the issue for workaround. After this patch, `obj.to_enum` raises `ArgumentError` if the object does not respond to the enumerating method. This is incompatible to CRuby but I think this behavior is better and CRuby should be updated to behave like this. --- mrbgems/mruby-enumerator/mrblib/enumerator.rb | 3 +++ 1 file changed, 3 insertions(+) (limited to 'mrbgems/mruby-enumerator/mrblib') diff --git a/mrbgems/mruby-enumerator/mrblib/enumerator.rb b/mrbgems/mruby-enumerator/mrblib/enumerator.rb index 7ca1d5eb6..dbc7d3004 100644 --- a/mrbgems/mruby-enumerator/mrblib/enumerator.rb +++ b/mrbgems/mruby-enumerator/mrblib/enumerator.rb @@ -614,6 +614,9 @@ 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