Skip to content

Commit 7422d27

Browse files
authored
Merge pull request RustPython#422 from HomerMcMillan/range-reversed
Fix range reversed RustPython#421
2 parents d8afc6a + 0611e76 commit 7422d27

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

tests/snippets/builtin_range.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,3 +61,4 @@ def assert_raises(expr, exc_type):
6161
# __reversed__
6262
assert list(reversed(range(5))) == [4, 3, 2, 1, 0]
6363
assert list(reversed(range(5, 0, -1))) == [1, 2, 3, 4, 5]
64+
assert list(reversed(range(1,10,5))) == [6, 1]

vm/src/obj/objrange.rs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,23 @@ impl RangeType {
9595

9696
#[inline]
9797
pub fn reversed(&self) -> Self {
98+
// compute the last element that is actually contained within the range
99+
// this is the new start
100+
let remainder = ((&self.end - &self.start) % &self.step).abs();
101+
let start = if remainder.is_zero() {
102+
&self.end - &self.step
103+
} else {
104+
&self.end - &remainder
105+
};
106+
98107
match self.step.sign() {
99108
Sign::Plus => RangeType {
100-
start: &self.end - 1,
109+
start,
101110
end: &self.start - 1,
102111
step: -&self.step,
103112
},
104113
Sign::Minus => RangeType {
105-
start: &self.end + 1,
114+
start,
106115
end: &self.start + 1,
107116
step: -&self.step,
108117
},

0 commit comments

Comments
 (0)