Bug #7676 ยป bug7676.patch
array.c  

3532  3532 
len1 = RARRAY_LEN(ary1); 
3533  3533  
3534  3534 
for (i = 0; i < len1; i++) { 
3535 
if (*p1 != *p2) { 

3536 
if (rb_equal(*p1, *p2)) { 

3537 
len1 = RARRAY_LEN(ary1); 

3538 
if (len1 != RARRAY_LEN(ary2)) 

3539 
return Qfalse; 

3540 
if (len1 < i) 

3541 
return Qtrue; 

3542 
p1 = RARRAY_PTR(ary1) + i; 

3543 
p2 = RARRAY_PTR(ary2) + i; 

3544 
} 

3545 
else { 

3535 
if (rb_equal(*p1, *p2)) { 

3536 
len1 = RARRAY_LEN(ary1); 

3537 
if (len1 != RARRAY_LEN(ary2)) 

3546  3538 
return Qfalse; 
3547 
} 

3539 
if (len1 < i) 

3540 
return Qtrue; 

3541 
p1 = RARRAY_PTR(ary1) + i; 

3542 
p2 = RARRAY_PTR(ary2) + i; 

3543 
} 

3544 
else { 

3545 
return Qfalse; 

3548  3546 
} 
3549  3547 
p1++; 
3550  3548 
p2++; 
object.c  

51  51 
VALUE 
52  52 
rb_equal(VALUE obj1, VALUE obj2) 
53  53 
{ 
54 
VALUE result; 

55  
56 
if (obj1 == obj2) return Qtrue; 

57 
result = rb_funcall(obj1, id_eq, 1, obj2); 

54 
VALUE result = rb_funcall(obj1, id_eq, 1, obj2); 

58  55 
if (RTEST(result)) return Qtrue; 
59  56 
return Qfalse; 
60  57 
} 
test/ruby/test_array.rb  

2275  2275 
a = [0, 4, 7, 10, 12] 
2276  2276 
assert_equal(nil, a.bsearch {x "foo" }) # undefined behavior 
2277  2277 
end 
2278  
2279 
def test_array_equal_with_identical_but_nonequal_objects # [rubycore:51328] 

2280 
refute [Float::NAN] == [Float::NAN] 

2281  
2282 
o = Object.new 

2283 
def o.==(other) 

2284 
false 

2285 
end 

2286 
refute [o] == [o] 

2287 
end 

2278  2288 
end 