Skip to content

Commit 1e8ade7

Browse files
committed
Fixed __eq__ and add __ne__ of range
change return type of __eq__ to PyResult and add __ne__ Issue #1442
1 parent dccc22d commit 1e8ade7

2 files changed

Lines changed: 39 additions & 20 deletions

File tree

tests/snippets/builtin_range.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,12 @@
5858
assert range(0, 10, 3) == range(0, 12, 3)
5959
assert range(20, 10, 3) == range(20, 12, 3)
6060

61+
assert range(10).__eq__(range(0, 10, 1)) is True
62+
assert range(10).__ne__(range(0, 10, 1)) is False
63+
assert range(10).__eq__(range(0, 11, 1)) is False
64+
assert range(10).__ne__(range(0, 11, 1)) is True
65+
assert range(0, 10, 3).__eq__(range(0, 11, 3)) is True
66+
assert range(0, 10, 3).__ne__(range(0, 11, 3)) is False
6167
#__lt__
6268
assert range(1, 2, 3).__lt__(range(1, 2, 3)) == NotImplemented
6369
assert range(1, 2, 1).__lt__(range(1, 2)) == NotImplemented

vm/src/obj/objrange.rs

Lines changed: 33 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::vm::VirtualMachine;
1414
use super::objint::{PyInt, PyIntRef};
1515
use super::objiter;
1616
use super::objslice::{PySlice, PySliceRef};
17-
use super::objtype::{self, PyClassRef};
17+
use super::objtype::PyClassRef;
1818

1919
/// range(stop) -> range object
2020
/// range(start, stop[, step]) -> range object
@@ -239,30 +239,43 @@ impl PyRange {
239239
}
240240
}
241241

242-
#[pymethod(name = "__eq__")]
243-
fn eq(&self, rhs: PyObjectRef, vm: &VirtualMachine) -> bool {
244-
if objtype::isinstance(&rhs, &vm.ctx.range_type()) {
245-
let rhs = get_value(&rhs);
242+
fn inner_eq(&self, rhs: &PyRange) -> bool {
243+
if self.length() != rhs.length() {
244+
return false;
245+
}
246246

247-
if self.length() != rhs.length() {
248-
return false;
249-
}
247+
if self.length().is_zero() {
248+
return true;
249+
}
250250

251-
if self.length().is_zero() {
252-
return true;
253-
}
251+
if self.start.as_bigint() != rhs.start.as_bigint() {
252+
return false;
253+
}
254+
let step = self.step.as_bigint();
255+
if step.is_one() || step == rhs.step.as_bigint() {
256+
return true;
257+
}
254258

255-
if self.start.as_bigint() != rhs.start.as_bigint() {
256-
return false;
257-
}
258-
let step = self.step.as_bigint();
259-
if step.is_one() || step == rhs.step.as_bigint() {
260-
return true;
261-
}
259+
false
260+
}
262261

263-
false
262+
#[pymethod(name = "__eq__")]
263+
fn eq(&self, rhs: PyObjectRef, vm: &VirtualMachine) -> PyResult {
264+
if let Some(rhs) = rhs.payload::<PyRange>() {
265+
let eq = self.inner_eq(rhs);
266+
Ok(vm.ctx.new_bool(eq))
264267
} else {
265-
false
268+
Ok(vm.ctx.not_implemented())
269+
}
270+
}
271+
272+
#[pymethod(name = "__ne__")]
273+
fn ne(&self, rhs: PyObjectRef, vm: &VirtualMachine) -> PyResult {
274+
if let Some(rhs) = rhs.payload::<PyRange>() {
275+
let eq = self.inner_eq(rhs);
276+
Ok(vm.ctx.new_bool(!eq))
277+
} else {
278+
Ok(vm.ctx.not_implemented())
266279
}
267280
}
268281

0 commit comments

Comments
 (0)