@@ -15,7 +15,6 @@ use super::objint::{PyInt, PyIntRef};
1515use super :: objiter;
1616use super :: objslice:: { PySlice , PySliceRef } ;
1717use super :: objtype:: { self , PyClassRef } ;
18- use crate :: obj:: objtuple:: PyTuple ;
1918
2019/// range(stop) -> range object
2120/// range(start, stop[, step]) -> range object
@@ -77,18 +76,13 @@ impl PyRange {
7776 #[ inline]
7877 pub fn get ( & self , index : & BigInt ) -> Option < BigInt > {
7978 let start = self . start . as_bigint ( ) ;
80- let stop = self . stop . as_bigint ( ) ;
8179 let step = self . step . as_bigint ( ) ;
8280 let index = index. clone ( ) ;
8381 if self . is_empty ( ) {
8482 return None ;
8583 }
8684
87- let length: BigInt = if start < stop {
88- ( stop - start - 1 ) / step + 1
89- } else {
90- ( start - stop - 1 ) / ( -step) + 1
91- } ;
85+ let length = self . length ( ) ;
9286
9387 let index = if index. is_negative ( ) {
9488 let new_index: BigInt = & length + & index;
@@ -108,15 +102,15 @@ impl PyRange {
108102 }
109103
110104 #[ inline]
111- fn length ( & self ) -> PyInt {
105+ fn length ( & self ) -> BigInt {
112106 let start = self . start . as_bigint ( ) ;
113107 let stop = self . stop . as_bigint ( ) ;
114108 let step = self . step . as_bigint ( ) ;
115109
116110 match step. sign ( ) {
117- Sign :: Plus if start < stop => PyInt :: new ( ( stop - start - 1usize ) / step + 1 ) ,
118- Sign :: Minus if start > stop => PyInt :: new ( ( start - stop - 1usize ) / ( -step) + 1 ) ,
119- Sign :: Plus | Sign :: Minus => PyInt :: new ( 0 ) ,
111+ Sign :: Plus if start < stop => ( stop - start - 1usize ) / step + 1 ,
112+ Sign :: Minus if start > stop => ( start - stop - 1usize ) / ( -step) + 1 ,
113+ Sign :: Plus | Sign :: Minus => BigInt :: zero ( ) ,
120114 Sign :: NoSign => unreachable ! ( ) ,
121115 }
122116 }
@@ -216,7 +210,7 @@ impl PyRange {
216210
217211 #[ pymethod( name = "__len__" ) ]
218212 fn len ( & self , _vm : & VirtualMachine ) -> PyInt {
219- self . length ( )
213+ PyInt :: new ( self . length ( ) )
220214 }
221215
222216 #[ pymethod( name = "__repr__" ) ]
@@ -250,11 +244,11 @@ impl PyRange {
250244 if objtype:: isinstance ( & rhs, & vm. ctx . range_type ( ) ) {
251245 let rhs = get_value ( & rhs) ;
252246
253- if self . length ( ) . as_bigint ( ) != rhs. length ( ) . as_bigint ( ) {
247+ if self . length ( ) != rhs. length ( ) {
254248 return false ;
255249 }
256250
257- if self . length ( ) . as_bigint ( ) . is_zero ( ) {
251+ if self . length ( ) . is_zero ( ) {
258252 return true ;
259253 }
260254
@@ -323,8 +317,7 @@ impl PyRange {
323317 RangeIndex :: Slice ( slice) => {
324318 let range_start = self . start . as_bigint ( ) ;
325319 let range_step = self . step . as_bigint ( ) ;
326- let _tmp_len = self . length ( ) ;
327- let range_length = _tmp_len. as_bigint ( ) ;
320+ let range_length = & self . length ( ) ;
328321
329322 let substep = if let Some ( slice_step) = slice. step_index ( vm) ? {
330323 if slice_step. is_zero ( ) {
@@ -407,22 +400,22 @@ impl PyRange {
407400 #[ pymethod( name = "__hash__" ) ]
408401 fn hash ( zelf : PyRef < Self > , vm : & VirtualMachine ) -> PyResult < pyhash:: PyHash > {
409402 let length = zelf. length ( ) ;
410- let len = length. as_bigint ( ) . clone ( ) ;
411- let a = length. into_ref ( vm) . into_object ( ) ;
412- let mut b = vm. get_none ( ) ;
413- let mut c = vm. get_none ( ) ;
414- if !len. is_zero ( ) {
415- b = zelf. start . clone ( ) . into_object ( ) ;
416- if !len. is_one ( ) {
417- c = zelf. step ( vm) . into_object ( ) ;
418- }
403+ let elements = if length. is_zero ( ) {
404+ vec ! [ vm. ctx. new_int( length) , vm. get_none( ) , vm. get_none( ) ]
405+ } else if length. is_one ( ) {
406+ vec ! [
407+ vm. ctx. new_int( length) ,
408+ zelf. start( vm) . into_object( ) ,
409+ vm. get_none( ) ,
410+ ]
411+ } else {
412+ vec ! [
413+ vm. ctx. new_int( length) ,
414+ zelf. start( vm) . into_object( ) ,
415+ zelf. step( vm) . into_object( ) ,
416+ ]
419417 } ;
420- let tuple = vm
421- . ctx
422- . new_tuple ( vec ! [ a, b, c] )
423- . downcast :: < PyTuple > ( )
424- . unwrap ( ) ;
425- tuple. hash ( vm)
418+ pyhash:: hash_iter ( elements. iter ( ) , vm)
426419 }
427420
428421 #[ pyslot( new) ]
0 commit comments