diff options
author | Nobuyoshi Nakada <[email protected]> | 2024-03-04 21:02:08 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2024-03-04 21:02:08 +0900 |
commit | b176315827d1082f43628013a7d89fda02724d33 (patch) | |
tree | 6c953c38ede5cb26e6b5a624ec9e2022ccf3d1e4 /range.c | |
parent | ef5af32799b04da61bbd1bdaf464012a755c4936 (diff) |
[Bug #20324] Uncomparable ranges are not overlapping
Diffstat (limited to 'range.c')
-rw-r--r-- | range.c | 12 |
1 files changed, 10 insertions, 2 deletions
@@ -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; |