diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | array.c | 4 | ||||
-rw-r--r-- | test/ruby/test_array.rb | 14 |
3 files changed, 25 insertions, 1 deletions
@@ -1,3 +1,11 @@ +Sun Nov 4 11:27:54 2012 Masaki Matsushita <glass.saga@gmail.com> + + * array.c (recursive_equal): fix to return true when self and other + are resized to same size and the current index become out of + range. + + * test/ruby/test_array.rb: add a test for the above. + Sun Nov 4 10:19:03 2012 Nobuyoshi Nakada <nobu@ruby-lang.org> * dir.c (file_s_fnmatch): match with expanding braces if FNM_EXTGLOB @@ -3282,8 +3282,10 @@ recursive_equal(VALUE ary1, VALUE ary2, int recur) if (*p1 != *p2) { if (rb_equal(*p1, *p2)) { len1 = RARRAY_LEN(ary1); - if (len1 != RARRAY_LEN(ary2) || len1 < i) + if (len1 != RARRAY_LEN(ary2)) return Qfalse; + if (len1 < i) + return Qtrue; p1 = RARRAY_PTR(ary1) + i; p2 = RARRAY_PTR(ary2) + i; } diff --git a/test/ruby/test_array.rb b/test/ruby/test_array.rb index b4115ac5dd..845a05089a 100644 --- a/test/ruby/test_array.rb +++ b/test/ruby/test_array.rb @@ -1923,6 +1923,20 @@ class TestArray < Test::Unit::TestCase assert_not_equal([0, 1, 2], [0, 1, 3]) end + A = Array.new(3, &:to_s) + B = A.dup + + def test_equal_resize + o = Object.new + def o.==(o) + A.clear + B.clear + true + end + A[1] = o + assert_equal(A, B) + end + def test_hash2 a = [] a << a |