Skip to content

Commit a67c287

Browse files
committed
Use std::mem to swap elements
1 parent 970d17f commit a67c287

File tree

2 files changed

+10
-19
lines changed

2 files changed

+10
-19
lines changed

vm/src/obj/objlist.rs

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::fmt;
22
use std::mem::size_of;
3-
use std::ops::Range;
3+
use std::ops::{DerefMut, Range};
44
use std::sync::{RwLock, RwLockReadGuard, RwLockWriteGuard};
55

66
use crossbeam_utils::atomic::AtomicCell;
@@ -114,7 +114,7 @@ impl PyList {
114114
vm: &VirtualMachine,
115115
) -> PyResult<objbyteinner::PyByteInner> {
116116
let mut elements = Vec::<u8>::with_capacity(self.borrow_elements().len());
117-
for elem in self.borrow_elements().clone().iter() {
117+
for elem in self.borrow_elements().iter() {
118118
match PyIntRef::try_from_object(vm, elem.clone()) {
119119
Ok(result) => match result.as_bigint().to_u8() {
120120
Some(result) => elements.push(result),
@@ -498,10 +498,10 @@ impl PyList {
498498

499499
#[pymethod(name = "__imul__")]
500500
fn imul(zelf: PyRef<Self>, counter: isize) -> PyRef<Self> {
501-
let elements = zelf.borrow_elements_mut();
502-
let new_elements: Vec<PyObjectRef> =
501+
let mut elements = zelf.borrow_elements_mut();
502+
let mut new_elements: Vec<PyObjectRef> =
503503
sequence::seq_mul(&elements, counter).cloned().collect();
504-
PyList::_replace(elements, new_elements);
504+
std::mem::swap(elements.deref_mut(), &mut new_elements);
505505
zelf.clone()
506506
}
507507

@@ -777,26 +777,17 @@ impl PyList {
777777
// replace list contents with [] for duration of sort.
778778
// this prevents keyfunc from messing with the list and makes it easy to
779779
// check if it tries to append elements to it.
780-
let mut elements = PyList::_replace(self.borrow_elements_mut(), vec![]);
780+
let mut elements = std::mem::take(self.borrow_elements_mut().deref_mut());
781781
do_sort(vm, &mut elements, options.key, options.reverse)?;
782-
let temp_elements = PyList::_replace(self.borrow_elements_mut(), elements);
782+
std::mem::swap(self.borrow_elements_mut().deref_mut(), &mut elements);
783783

784-
if !temp_elements.is_empty() {
784+
if !elements.is_empty() {
785785
return Err(vm.new_value_error("list modified during sort".to_owned()));
786786
}
787787

788788
Ok(())
789789
}
790790

791-
fn _replace(
792-
mut elements: RwLockWriteGuard<'_, Vec<PyObjectRef>>,
793-
mut new: Vec<PyObjectRef>,
794-
) -> Vec<PyObjectRef> {
795-
let old = elements.drain(..).collect();
796-
elements.append(&mut new);
797-
old
798-
}
799-
800791
#[pyslot]
801792
fn tp_new(
802793
cls: PyClassRef,

vm/src/pyobject.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,8 +1222,8 @@ pub trait PyValue: fmt::Debug + Sized + 'static {
12221222

12231223
// Temporary trait to follow the progress of threading conversion
12241224
pub trait ThreadSafe: Send + Sync {}
1225-
// Temporary definitions to help with converting object that contain PyObjectRef to ThreadSafe.
1226-
// Should be removed before threading is allowed.
1225+
// Temporary hack to help with converting object that contain PyObjectRef to ThreadSafe.
1226+
// Should be removed before threading is allowed. Do not try this at home!!!
12271227
unsafe impl<T: ?Sized + PyObjectPayload> Send for PyObject<T> {}
12281228
unsafe impl<T: ?Sized + PyObjectPayload> Sync for PyObject<T> {}
12291229

0 commit comments

Comments
 (0)