Skip to content

Commit d3120a2

Browse files
committed
[GR-19220] Fix Range#cover? on begin-less ranges and non-integer values (#3810)
PullRequest: truffleruby/4496
2 parents f32117b + 57cc1d2 commit d3120a2

File tree

3 files changed

+17
-3
lines changed

3 files changed

+17
-3
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ New features:
55

66
Bug fixes:
77

8+
* Fix `Range#cover?` on begin-less ranges and non-integer values (@nirvdrum, @rwstauner).
89

910
Compatibility:
1011

spec/ruby/core/range/shared/cover_and_include.rb

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,26 @@
2020
end
2121

2222
it "returns true if other is an element of self for endless ranges" do
23-
eval("(1..)").send(@method, 2.4).should == true
24-
eval("(0.5...)").send(@method, 2.4).should == true
23+
(1..).send(@method, 2.4).should == true
24+
(0.5...).send(@method, 2.4).should == true
2525
end
2626

2727
it "returns true if other is an element of self for beginless ranges" do
2828
(..10).send(@method, 2.4).should == true
2929
(...10.5).send(@method, 2.4).should == true
3030
end
3131

32+
it "returns false if values are not comparable" do
33+
(1..10).send(@method, nil).should == false
34+
(1...10).send(@method, nil).should == false
35+
36+
(..10).send(@method, nil).should == false
37+
(...10).send(@method, nil).should == false
38+
39+
(1..).send(@method, nil).should == false
40+
(1...).send(@method, nil).should == false
41+
end
42+
3243
it "compares values using <=>" do
3344
rng = (1..5)
3445
m = mock("int")

src/main/ruby/truffleruby/core/truffle/range_operations.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,13 +122,15 @@ def self.cover?(range, value)
122122
if !Primitive.nil?(range.begin)
123123
# MRI uses <=> to compare, so must we.
124124
cmp = (range.begin <=> value)
125-
return false unless cmp
125+
return false if Primitive.nil?(cmp)
126126
return false if Comparable.compare_int(cmp) > 0
127127
end
128128

129129
# Check upper bound.
130130
if !Primitive.nil?(range.end)
131131
cmp = (value <=> range.end)
132+
return false if Primitive.nil?(cmp)
133+
132134
if range.exclude_end?
133135
return false if Comparable.compare_int(cmp) >= 0
134136
else

0 commit comments

Comments
 (0)