From 98a075fcd276328c72dcb503ec4890665d0bc0ab Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 11 Aug 2021 13:05:14 +0300 Subject: [PATCH 1/4] Adds `__rmul__` to `collections.deque`, refs #2834 --- Lib/test/test_deque.py | 6 ++---- vm/src/stdlib/collections.rs | 1 + 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py index 77a2c9e707..3d2080fafd 100644 --- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@ -388,8 +388,6 @@ def test_imul(self): self.assertEqual(d, deque(('abcdef' * n)[-500:])) self.assertEqual(d.maxlen, 500) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_mul(self): d = deque('abc') self.assertEqual(d * -5, deque()) @@ -1003,11 +1001,11 @@ def test_subscript(self): def test_free_after_iterating(self): # For now, bypass tests that require slicing self.skipTest("Exhausted deque iterator doesn't free a deque") - + @unittest.skip("TODO: RUSTPYTHON TypeError: unexpected payload for __eq__") def test_pickle(self): pass - + def test_iadd(self): pass diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index df6530bc1a..9270b010f2 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -303,6 +303,7 @@ mod _collections { } #[pymethod(magic)] + #[pymethod(name = "__rmul__")] fn mul(&self, n: isize) -> Self { let deque: SimpleSeqDeque = self.borrow_deque().into(); let mul = sequence::seq_mul(&deque, n); From 7b180a7861695915cd54e67314e238c3dc5be427 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 11 Aug 2021 13:52:11 +0300 Subject: [PATCH 2/4] Fixes tests and overflow error --- Lib/test/test_deque.py | 2 -- vm/src/stdlib/collections.rs | 8 ++++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_deque.py b/Lib/test/test_deque.py index 3d2080fafd..b87e4f716f 100644 --- a/Lib/test/test_deque.py +++ b/Lib/test/test_deque.py @@ -355,8 +355,6 @@ def test_insert_bug_26194(self): else: self.assertEqual(d[i-1], 'Z') - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_imul(self): for n in (-10, -1, 0, 1, 2, 10, 1000): d = deque() diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index 9270b010f2..85d666c827 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -307,10 +307,10 @@ mod _collections { fn mul(&self, n: isize) -> Self { let deque: SimpleSeqDeque = self.borrow_deque().into(); let mul = sequence::seq_mul(&deque, n); - let skipped = if let Some(maxlen) = self.maxlen.load() { - mul.len() - maxlen - } else { - 0 + let mul_len = mul.len(); + let skipped = match self.maxlen.load() { + Some(maxlen) if mul_len > maxlen => mul_len - maxlen, + _ => 0, }; let deque = mul.skip(skipped).cloned().collect(); PyDeque { From 53cec4f8317b4e59b33b4989707635a2f052ec9b Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 11 Aug 2021 14:59:13 +0300 Subject: [PATCH 3/4] Refactor --- vm/src/stdlib/collections.rs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index 85d666c827..79d0c32b0f 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -307,11 +307,11 @@ mod _collections { fn mul(&self, n: isize) -> Self { let deque: SimpleSeqDeque = self.borrow_deque().into(); let mul = sequence::seq_mul(&deque, n); - let mul_len = mul.len(); - let skipped = match self.maxlen.load() { - Some(maxlen) if mul_len > maxlen => mul_len - maxlen, - _ => 0, - }; + let skipped = self + .maxlen + .load() + .map(|maxlen| mul.len().wrapping_sub(maxlen)) + .unwrap_or(0); let deque = mul.skip(skipped).cloned().collect(); PyDeque { deque: PyRwLock::new(deque), From 62972d6dfa259e7b8e35f205c29a4ccac3cd5de8 Mon Sep 17 00:00:00 2001 From: sobolevn Date: Wed, 11 Aug 2021 16:28:40 +0300 Subject: [PATCH 4/4] Refactor --- vm/src/stdlib/collections.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/vm/src/stdlib/collections.rs b/vm/src/stdlib/collections.rs index 79d0c32b0f..d3f8778bd3 100644 --- a/vm/src/stdlib/collections.rs +++ b/vm/src/stdlib/collections.rs @@ -310,8 +310,9 @@ mod _collections { let skipped = self .maxlen .load() - .map(|maxlen| mul.len().wrapping_sub(maxlen)) + .and_then(|maxlen| mul.len().checked_sub(maxlen)) .unwrap_or(0); + let deque = mul.skip(skipped).cloned().collect(); PyDeque { deque: PyRwLock::new(deque),