[Bug #20324] Uncomparable ranges are not overlapping
This commit is contained in:
parent
ef5af32799
commit
b176315827
12
range.c
12
range.c
@ -2373,8 +2373,16 @@ range_overlap(VALUE range, VALUE other)
|
||||
if (empty_region_p(self_beg, other_end, other_excl)) return Qfalse;
|
||||
if (empty_region_p(other_beg, self_end, self_excl)) return Qfalse;
|
||||
|
||||
/* if both begin values are equal, no more comparisons needed */
|
||||
if (rb_equal(self_beg, other_beg)) return Qtrue;
|
||||
if (!NIL_P(self_beg) && !NIL_P(other_beg)) {
|
||||
VALUE cmp = rb_funcall(self_beg, id_cmp, 1, other_beg);
|
||||
if (NIL_P(cmp)) return Qfalse;
|
||||
/* if both begin values are equal, no more comparisons needed */
|
||||
if (rb_cmpint(cmp, self_beg, other_beg) == 0) return Qtrue;
|
||||
}
|
||||
else if (NIL_P(self_beg) && NIL_P(other_beg)) {
|
||||
VALUE cmp = rb_funcall(self_end, id_cmp, 1, other_end);
|
||||
return RBOOL(!NIL_P(cmp));
|
||||
}
|
||||
|
||||
if (empty_region_p(self_beg, self_end, self_excl)) return Qfalse;
|
||||
if (empty_region_p(other_beg, other_end, other_excl)) return Qfalse;
|
||||
|
@ -1265,6 +1265,8 @@ class TestRange < Test::Unit::TestCase
|
||||
assert_operator(0.., :overlap?, 1..)
|
||||
|
||||
assert_not_operator((1..3), :overlap?, ('a'..'d'))
|
||||
assert_not_operator((1..), :overlap?, ('a'..))
|
||||
assert_not_operator((..1), :overlap?, (..'a'))
|
||||
|
||||
assert_raise(TypeError) { (0..).overlap?(1) }
|
||||
assert_raise(TypeError) { (0..).overlap?(nil) }
|
||||
|
Loading…
x
Reference in New Issue
Block a user