Bug #7676 ยป bug-7676.patch
| array.c | ||
|---|---|---|
|
len1 = RARRAY_LEN(ary1);
|
||
|
for (i = 0; i < len1; i++) {
|
||
|
if (*p1 != *p2) {
|
||
|
if (rb_equal(*p1, *p2)) {
|
||
|
len1 = RARRAY_LEN(ary1);
|
||
|
if (len1 != RARRAY_LEN(ary2))
|
||
|
return Qfalse;
|
||
|
if (len1 < i)
|
||
|
return Qtrue;
|
||
|
p1 = RARRAY_PTR(ary1) + i;
|
||
|
p2 = RARRAY_PTR(ary2) + i;
|
||
|
}
|
||
|
else {
|
||
|
if (rb_equal(*p1, *p2)) {
|
||
|
len1 = RARRAY_LEN(ary1);
|
||
|
if (len1 != RARRAY_LEN(ary2))
|
||
|
return Qfalse;
|
||
|
}
|
||
|
if (len1 < i)
|
||
|
return Qtrue;
|
||
|
p1 = RARRAY_PTR(ary1) + i;
|
||
|
p2 = RARRAY_PTR(ary2) + i;
|
||
|
}
|
||
|
else {
|
||
|
return Qfalse;
|
||
|
}
|
||
|
p1++;
|
||
|
p2++;
|
||
| object.c | ||
|---|---|---|
|
VALUE
|
||
|
rb_equal(VALUE obj1, VALUE obj2)
|
||
|
{
|
||
|
VALUE result;
|
||
|
if (obj1 == obj2) return Qtrue;
|
||
|
result = rb_funcall(obj1, id_eq, 1, obj2);
|
||
|
VALUE result = rb_funcall(obj1, id_eq, 1, obj2);
|
||
|
if (RTEST(result)) return Qtrue;
|
||
|
return Qfalse;
|
||
|
}
|
||
| test/ruby/test_array.rb | ||
|---|---|---|
|
a = [0, 4, 7, 10, 12]
|
||
|
assert_equal(nil, a.bsearch {|x| "foo" }) # undefined behavior
|
||
|
end
|
||
|
def test_array_equal_with_identical_but_nonequal_objects # [ruby-core:51328]
|
||
|
refute [Float::NAN] == [Float::NAN]
|
||
|
o = Object.new
|
||
|
def o.==(other)
|
||
|
false
|
||
|
end
|
||
|
refute [o] == [o]
|
||
|
end
|
||
|
end
|
||