Skip to content

Commit d42d422

Browse files
authored
Merge pull request #1505 from youknowone/defer-new-int-clone
Defer BigInt::clone() for new_int
2 parents 8df1560 + dc09fb7 commit d42d422

File tree

4 files changed

+20
-7
lines changed

4 files changed

+20
-7
lines changed

vm/src/obj/objenumerate.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ impl PyEnumerate {
5454
let next_obj = objiter::call_next(vm, iterator)?;
5555
let result = vm
5656
.ctx
57-
.new_tuple(vec![vm.ctx.new_int(counter.borrow().clone()), next_obj]);
57+
.new_tuple(vec![vm.ctx.new_bigint(&counter.borrow()), next_obj]);
5858

5959
AddAssign::add_assign(&mut counter.borrow_mut() as &mut BigInt, 1);
6060

vm/src/obj/objfloat.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -559,8 +559,8 @@ impl PyFloat {
559559
}
560560

561561
let ratio = Ratio::from_float(value).unwrap();
562-
let numer = vm.ctx.new_int(ratio.numer().clone());
563-
let denom = vm.ctx.new_int(ratio.denom().clone());
562+
let numer = vm.ctx.new_bigint(ratio.numer());
563+
let denom = vm.ctx.new_bigint(ratio.denom());
564564
Ok(vm.ctx.new_tuple(vec![numer, denom]))
565565
}
566566

vm/src/obj/objint.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,10 @@ fn inner_pow(int1: &PyInt, int2: &PyInt, vm: &VirtualMachine) -> PyResult {
124124
} else {
125125
Ok(if let Some(v2) = int2.value.to_u64() {
126126
vm.ctx.new_int(int1.value.pow(v2))
127-
} else if int1.value.is_one() || int1.value.is_zero() {
128-
vm.ctx.new_int(int1.value.clone())
127+
} else if int1.value.is_one() {
128+
vm.ctx.new_int(1)
129+
} else if int1.value.is_zero() {
130+
vm.ctx.new_int(0)
129131
} else if int1.value == BigInt::from(-1) {
130132
if int2.value.is_odd() {
131133
vm.ctx.new_int(-1)
@@ -672,7 +674,7 @@ impl PyInt {
672674
}
673675
#[pyproperty]
674676
fn real(&self, vm: &VirtualMachine) -> PyObjectRef {
675-
vm.ctx.new_int(self.value.clone())
677+
vm.ctx.new_bigint(&self.value)
676678
}
677679

678680
#[pyproperty]

vm/src/pyobject.rs

+12-1
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,17 @@ impl PyContext {
384384
PyObject::new(PyInt::new(i), self.int_type(), None)
385385
}
386386

387+
#[inline]
388+
pub fn new_bigint(&self, i: &BigInt) -> PyObjectRef {
389+
if let Some(i) = i.to_i32() {
390+
if i >= INT_CACHE_POOL_MIN && i <= INT_CACHE_POOL_MAX {
391+
let inner_idx = (i - INT_CACHE_POOL_MIN) as usize;
392+
return self.int_cache_pool[inner_idx].clone();
393+
}
394+
}
395+
PyObject::new(PyInt::new(i.clone()), self.int_type(), None)
396+
}
397+
387398
pub fn new_float(&self, value: f64) -> PyObjectRef {
388399
PyObject::new(PyFloat::from(value), self.float_type(), None)
389400
}
@@ -520,7 +531,7 @@ impl PyContext {
520531

521532
pub fn unwrap_constant(&self, value: &bytecode::Constant) -> PyObjectRef {
522533
match *value {
523-
bytecode::Constant::Integer { ref value } => self.new_int(value.clone()),
534+
bytecode::Constant::Integer { ref value } => self.new_bigint(value),
524535
bytecode::Constant::Float { ref value } => self.new_float(*value),
525536
bytecode::Constant::Complex { ref value } => self.new_complex(*value),
526537
bytecode::Constant::String { ref value } => self.new_str(value.clone()),

0 commit comments

Comments
 (0)