summaryrefslogtreecommitdiff
path: root/range.c
diff options
context:
space:
mode:
authorNobuyoshi Nakada <[email protected]>2024-03-04 21:02:08 +0900
committerNobuyoshi Nakada <[email protected]>2024-03-04 21:02:08 +0900
commitb176315827d1082f43628013a7d89fda02724d33 (patch)
tree6c953c38ede5cb26e6b5a624ec9e2022ccf3d1e4 /range.c
parentef5af32799b04da61bbd1bdaf464012a755c4936 (diff)
[Bug #20324] Uncomparable ranges are not overlapping
Diffstat (limited to 'range.c')
-rw-r--r--range.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/range.c b/range.c
index 22dbd989d4..e9073e53c4 100644
--- a/range.c
+++ b/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;