* 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.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@37464 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
glass 2012-11-04 02:44:58 +00:00
Родитель e59d5667c7
Коммит a28a060db4
3 изменённых файлов: 25 добавлений и 1 удалений

Просмотреть файл

@ -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;
}

Просмотреть файл

@ -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