Skip to content

Commit f43ae44

Browse files
committed
Change return type of length to BigInt
Change the return type of length to BigInt since most of the length's values are used as_bigint
1 parent 145ad87 commit f43ae44

2 files changed

Lines changed: 25 additions & 32 deletions

File tree

vm/src/obj/objrange.rs

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use super::objint::{PyInt, PyIntRef};
1515
use super::objiter;
1616
use super::objslice::{PySlice, PySliceRef};
1717
use 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)]

vm/src/obj/objtuple.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ impl PyTuple {
179179
}
180180

181181
#[pymethod(name = "__hash__")]
182-
pub fn hash(&self, vm: &VirtualMachine) -> PyResult<pyhash::PyHash> {
182+
fn hash(&self, vm: &VirtualMachine) -> PyResult<pyhash::PyHash> {
183183
pyhash::hash_iter(self.elements.iter(), vm)
184184
}
185185

0 commit comments

Comments
 (0)