Skip to content

Commit 1c1ee5b

Browse files
committed
Add setter for maxlen
1 parent 0ca6d24 commit 1c1ee5b

File tree

1 file changed

+13
-14
lines changed

1 file changed

+13
-14
lines changed

vm/src/stdlib/collections.rs

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ use crate::pyobject::{IdProtocol, PyClassImpl, PyIterable, PyObjectRef, PyRef, P
44
use crate::vm::ReprGuard;
55
use crate::VirtualMachine;
66
use itertools::Itertools;
7-
use std::cell::RefCell;
7+
use std::cell::{Cell, RefCell};
88
use std::collections::VecDeque;
99

1010
#[pyclass(name = "deque")]
1111
#[derive(Debug, Clone)]
1212
struct PyDeque {
1313
deque: RefCell<VecDeque<PyObjectRef>>,
14-
maxlen: Option<usize>,
14+
maxlen: Cell<Option<usize>>,
1515
}
1616

1717
impl PyValue for PyDeque {
@@ -20,7 +20,6 @@ impl PyValue for PyDeque {
2020
}
2121
}
2222

23-
2423
#[pyimpl]
2524
impl PyDeque {
2625
#[pymethod(name = "__new__")]
@@ -37,30 +36,26 @@ impl PyDeque {
3736
};
3837
PyDeque {
3938
deque: RefCell::new(deque),
40-
maxlen: maxlen.into_option().and_then(|x| x),
39+
maxlen: maxlen.into_option().and_then(|x| x).into(),
4140
}
4241
.into_ref_with_type(vm, cls)
4342
}
4443

4544
#[pymethod]
4645
fn append(&self, obj: PyObjectRef, _vm: &VirtualMachine) {
4746
let mut deque = self.deque.borrow_mut();
48-
if let Some(maxlen) = self.maxlen {
49-
if deque.len() == maxlen {
47+
if self.maxlen.get() == Some(deque.len()) {
5048
deque.pop_front();
5149
}
52-
}
5350
deque.push_back(obj);
5451
}
5552

5653
#[pymethod]
5754
fn appendleft(&self, obj: PyObjectRef, _vm: &VirtualMachine) {
5855
let mut deque = self.deque.borrow_mut();
59-
if let Some(maxlen) = self.maxlen {
60-
if deque.len() == maxlen {
56+
if self.maxlen.get() == Some(deque.len()) {
6157
deque.pop_back();
6258
}
63-
}
6459
deque.push_front(obj);
6560
}
6661

@@ -129,11 +124,9 @@ impl PyDeque {
129124
fn insert(&self, idx: i32, obj: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
130125
let mut deque = self.deque.borrow_mut();
131126

132-
if let Some(maxlen) = self.maxlen {
133-
if deque.len() == maxlen {
127+
if self.maxlen.get() == Some(deque.len()) {
134128
return Err(vm.new_index_error("deque already at its maximum size".to_string()));
135129
}
136-
}
137130

138131
let idx = if idx < 0 {
139132
if -idx as usize > deque.len() {
@@ -210,7 +203,12 @@ impl PyDeque {
210203

211204
#[pyproperty]
212205
fn maxlen(&self, _vm: &VirtualMachine) -> Option<usize> {
213-
self.maxlen
206+
self.maxlen.get()
207+
}
208+
#[pyproperty(setter)]
209+
fn set_maxlen(&self, maxlen: Option<usize>, vm: &VirtualMachine) -> PyResult {
210+
self.maxlen.set(maxlen);
211+
Ok(vm.get_none())
214212
}
215213

216214
#[pymethod(name = "__repr__")]
@@ -224,6 +222,7 @@ impl PyDeque {
224222
.collect::<Result<Vec<_>, _>>()?;
225223
let maxlen = zelf
226224
.maxlen
225+
.get()
227226
.map(|maxlen| format!(", maxlen={}", maxlen))
228227
.unwrap_or_default();
229228
format!("deque([{}]{})", elements.into_iter().format(", "), maxlen)

0 commit comments

Comments
 (0)