From 99908e6d3e6a642445f8b6b4a8e7ceebf3dabf64 Mon Sep 17 00:00:00 2001 From: Connor Troy Date: Mon, 6 Sep 2021 00:14:26 -0600 Subject: [PATCH 1/4] Add deque imul method --- vm/src/stdlib/collections.rs | 39 +++++++++++++++++++++++++++++++----- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index a4446ed2c7..e9b4b0c372 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -59,9 +59,9 @@ mod _collections { } } - struct SimpleSeqDeque<'a>(PyRwLockReadGuard<'a, VecDeque>); + struct SimpleSeqDeque(VecDeque); - impl sequence::SimpleSeq for SimpleSeqDeque<'_> { + impl sequence::SimpleSeq for SimpleSeqDeque { fn len(&self) -> usize { self.0.len() } @@ -71,9 +71,21 @@ mod _collections { } } - impl<'a> From>> for SimpleSeqDeque<'a> { - fn from(from: PyRwLockReadGuard<'a, VecDeque>) -> Self { - Self(from) + impl From> for SimpleSeqDeque { + fn from(deque: VecDeque) -> Self { + Self(deque) + } + } + + impl From>> for SimpleSeqDeque { + fn from(deque: PyRwLockReadGuard<'_, VecDeque>) -> Self { + Self(deque.clone()) + } + } + + impl From>> for SimpleSeqDeque { + fn from(deque: PyRwLockWriteGuard<'_, VecDeque>) -> Self { + Self(deque.clone()) } } @@ -471,6 +483,23 @@ mod _collections { }) } + #[pymethod(magic)] + fn imul(zelf: PyRef, value: isize, vm: &VirtualMachine) -> PyResult> { + let mut deque = zelf.borrow_deque_mut(); + let seq: SimpleSeqDeque = deque.clone().into(); + let mul = sequence::seq_mul(vm, &seq, value)?; + + let skipped = zelf + .maxlen + .and_then(|maxlen| mul.len().checked_sub(maxlen)) + .unwrap_or(0); + + let mut new_deque: VecDeque = mul.skip(skipped).cloned().collect(); + std::mem::swap(&mut *deque, &mut new_deque); + drop(deque); + Ok(zelf) + } + #[pymethod(magic)] fn len(&self) -> usize { self.borrow_deque().len() From d2e4242fdc718400aa97641154a10e4a5d3995e3 Mon Sep 17 00:00:00 2001 From: Connor Troy Date: Mon, 6 Sep 2021 03:09:03 -0600 Subject: [PATCH 2/4] Use borrowed SimpleSeqDeque --- vm/src/stdlib/collections.rs | 39 +++++++++++++----------------------- 1 file changed, 14 insertions(+), 25 deletions(-) diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index e9b4b0c372..7c31d52446 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -59,9 +59,9 @@ mod _collections { } } - struct SimpleSeqDeque(VecDeque); + struct SimpleSeqDeque<'a>(PyRwLockReadGuard<'a, VecDeque>); - impl sequence::SimpleSeq for SimpleSeqDeque { + impl sequence::SimpleSeq for SimpleSeqDeque<'_> { fn len(&self) -> usize { self.0.len() } @@ -71,24 +71,12 @@ mod _collections { } } - impl From> for SimpleSeqDeque { - fn from(deque: VecDeque) -> Self { + impl<'a> From>> for SimpleSeqDeque<'a> { + fn from(deque: PyRwLockReadGuard<'a, VecDeque>) -> Self { Self(deque) } } - impl From>> for SimpleSeqDeque { - fn from(deque: PyRwLockReadGuard<'_, VecDeque>) -> Self { - Self(deque.clone()) - } - } - - impl From>> for SimpleSeqDeque { - fn from(deque: PyRwLockWriteGuard<'_, VecDeque>) -> Self { - Self(deque.clone()) - } - } - #[pyimpl(flags(BASETYPE), with(Comparable, Hashable, Iterable))] impl PyDeque { #[pyslot] @@ -485,16 +473,17 @@ mod _collections { #[pymethod(magic)] fn imul(zelf: PyRef, value: isize, vm: &VirtualMachine) -> PyResult> { + let mut new_deque: VecDeque = { + let deque: SimpleSeqDeque = zelf.borrow_deque().into(); + let mul = sequence::seq_mul(vm, &deque, value)?; + let skipped = zelf + .maxlen + .and_then(|maxlen| mul.len().checked_sub(maxlen)) + .unwrap_or(0); + + mul.skip(skipped).cloned().collect() + }; let mut deque = zelf.borrow_deque_mut(); - let seq: SimpleSeqDeque = deque.clone().into(); - let mul = sequence::seq_mul(vm, &seq, value)?; - - let skipped = zelf - .maxlen - .and_then(|maxlen| mul.len().checked_sub(maxlen)) - .unwrap_or(0); - - let mut new_deque: VecDeque = mul.skip(skipped).cloned().collect(); std::mem::swap(&mut *deque, &mut new_deque); drop(deque); Ok(zelf) From 21aa376b2de030280dc56b94a5536640259f4935 Mon Sep 17 00:00:00 2001 From: Connor Troy Date: Mon, 6 Sep 2021 03:17:16 -0600 Subject: [PATCH 3/4] Remove imul deque drop --- vm/src/stdlib/collections.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index 7c31d52446..4f9754180a 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -483,9 +483,8 @@ mod _collections { mul.skip(skipped).cloned().collect() }; - let mut deque = zelf.borrow_deque_mut(); - std::mem::swap(&mut *deque, &mut new_deque); - drop(deque); + + std::mem::swap(&mut *zelf.borrow_deque_mut(), &mut new_deque); Ok(zelf) } From e5383c68d270b87894039f278522816cdd414b74 Mon Sep 17 00:00:00 2001 From: Connor Troy Date: Mon, 6 Sep 2021 04:06:18 -0600 Subject: [PATCH 4/4] Use mul for imul --- vm/src/stdlib/collections.rs | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index 4f9754180a..7f5d8c3ad5 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -72,8 +72,8 @@ mod _collections { } impl<'a> From>> for SimpleSeqDeque<'a> { - fn from(deque: PyRwLockReadGuard<'a, VecDeque>) -> Self { - Self(deque) + fn from(from: PyRwLockReadGuard<'a, VecDeque>) -> Self { + Self(from) } } @@ -473,18 +473,11 @@ mod _collections { #[pymethod(magic)] fn imul(zelf: PyRef, value: isize, vm: &VirtualMachine) -> PyResult> { - let mut new_deque: VecDeque = { - let deque: SimpleSeqDeque = zelf.borrow_deque().into(); - let mul = sequence::seq_mul(vm, &deque, value)?; - let skipped = zelf - .maxlen - .and_then(|maxlen| mul.len().checked_sub(maxlen)) - .unwrap_or(0); - - mul.skip(skipped).cloned().collect() - }; - - std::mem::swap(&mut *zelf.borrow_deque_mut(), &mut new_deque); + let mul_deque = zelf.mul(value, vm)?; + std::mem::swap( + &mut *zelf.borrow_deque_mut(), + &mut *mul_deque.borrow_deque_mut(), + ); Ok(zelf) }