diff --git a/mrblib/enum.rb b/mrblib/enum.rb index 6496e559b..e4f8973dd 100644 --- a/mrblib/enum.rb +++ b/mrblib/enum.rb @@ -342,6 +342,11 @@ module Enumerable # redefine #hash 15.3.1.3.15 def hash + if __method_recursive?(:hash) + # Recursion detected, return a fixed value to break the loop + return 0 + end + h = 12347 i = 0 self.each do |e| diff --git a/test/t/array.rb b/test/t/array.rb index 52ae7ccb0..ab34264f0 100644 --- a/test/t/array.rb +++ b/test/t/array.rb @@ -468,3 +468,11 @@ assert('Array#delete') do assert_equal nil, a.delete(nil) { "?" } assert_equal [], a end + +assert('Array#hash with self-referencing arrays') do + a = [] + a << a + b = [] + b << b + assert_equal a.hash, b.hash +end