@@ -14,7 +14,7 @@ use crate::vm::VirtualMachine;
1414use super :: objint:: { PyInt , PyIntRef } ;
1515use super :: objiter;
1616use 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