Skip to content

Commit 375c86b

Browse files
committed
support delitem in ass_subscript
1 parent cc25337 commit 375c86b

File tree

11 files changed

+48
-21
lines changed

11 files changed

+48
-21
lines changed

vm/src/builtins/bytearray.rs

+9-4
Original file line numberDiff line numberDiff line change
@@ -209,9 +209,9 @@ impl PyByteArray {
209209
}
210210

211211
#[pymethod(magic)]
212-
pub fn delitem(&self, needle: SequenceIndex, vm: &VirtualMachine) -> PyResult<()> {
212+
pub fn delitem(&self, needle: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
213213
let elements = &mut self.try_resizable(vm)?.elements;
214-
match needle {
214+
match SequenceIndex::try_from_object_for(vm, needle, Self::NAME)? {
215215
SequenceIndex::Int(int) => {
216216
if let Some(idx) = elements.wrap_index(int) {
217217
elements.remove(idx);
@@ -743,10 +743,15 @@ impl AsMapping for PyByteArray {
743743
fn ass_subscript(
744744
zelf: PyObjectRef,
745745
needle: PyObjectRef,
746-
value: PyObjectRef,
746+
value: Option<PyObjectRef>,
747747
vm: &VirtualMachine,
748748
) -> PyResult<()> {
749-
Self::downcast(zelf, vm).map(|zelf| Self::setitem(zelf, needle, value, vm))?
749+
match value {
750+
Some(value) => {
751+
Self::downcast(zelf, vm).map(|zelf| Self::setitem(zelf, needle, value, vm))
752+
}
753+
None => Self::downcast_ref(&zelf, vm).map(|zelf| zelf.delitem(needle, vm)),
754+
}?
750755
}
751756
}
752757

vm/src/builtins/bytes.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -569,7 +569,7 @@ impl AsMapping for PyBytes {
569569
fn ass_subscript(
570570
zelf: PyObjectRef,
571571
_needle: PyObjectRef,
572-
_value: PyObjectRef,
572+
_value: Option<PyObjectRef>,
573573
_vm: &VirtualMachine,
574574
) -> PyResult<()> {
575575
unreachable!("ass_subscript not implemented for {}", zelf.class())

vm/src/builtins/dict.rs

+6-3
Original file line numberDiff line numberDiff line change
@@ -421,10 +421,13 @@ impl AsMapping for PyDict {
421421
fn ass_subscript(
422422
zelf: PyObjectRef,
423423
needle: PyObjectRef,
424-
value: PyObjectRef,
424+
value: Option<PyObjectRef>,
425425
vm: &VirtualMachine,
426426
) -> PyResult<()> {
427-
Self::downcast_ref(&zelf, vm).map(|zelf| zelf.setitem(needle, value, vm))?
427+
Self::downcast_ref(&zelf, vm).map(|zelf| match value {
428+
Some(value) => zelf.setitem(needle, value, vm),
429+
None => zelf.delitem(needle, vm),
430+
})?
428431
}
429432
}
430433

@@ -921,7 +924,7 @@ pub struct PyMapping {
921924
pub length: Option<fn(PyObjectRef, &VirtualMachine) -> PyResult<usize>>,
922925
pub subscript: Option<fn(PyObjectRef, PyObjectRef, &VirtualMachine) -> PyResult>,
923926
pub ass_subscript:
924-
Option<fn(PyObjectRef, PyObjectRef, PyObjectRef, &VirtualMachine) -> PyResult<()>>,
927+
Option<fn(PyObjectRef, PyObjectRef, Option<PyObjectRef>, &VirtualMachine) -> PyResult<()>>,
925928
}
926929

927930
impl PyMapping {}

vm/src/builtins/list.rs

+7-4
Original file line numberDiff line numberDiff line change
@@ -359,8 +359,8 @@ impl PyList {
359359
}
360360

361361
#[pymethod(magic)]
362-
fn delitem(&self, subscript: SequenceIndex, vm: &VirtualMachine) -> PyResult<()> {
363-
match subscript {
362+
fn delitem(&self, subscript: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
363+
match SequenceIndex::try_from_object_for(vm, subscript, Self::NAME)? {
364364
SequenceIndex::Int(index) => self.delindex(index, vm),
365365
SequenceIndex::Slice(slice) => self.delslice(slice, vm),
366366
}
@@ -445,10 +445,13 @@ impl AsMapping for PyList {
445445
fn ass_subscript(
446446
zelf: PyObjectRef,
447447
needle: PyObjectRef,
448-
value: PyObjectRef,
448+
value: Option<PyObjectRef>,
449449
vm: &VirtualMachine,
450450
) -> PyResult<()> {
451-
Self::downcast_ref(&zelf, vm).map(|zelf| zelf.setitem(needle, value, vm))?
451+
Self::downcast_ref(&zelf, vm).map(|zelf| match value {
452+
Some(value) => zelf.setitem(needle, value, vm),
453+
None => zelf.delitem(needle, vm),
454+
})?
452455
}
453456
}
454457

vm/src/builtins/mappingproxy.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ impl AsMapping for PyMappingProxy {
155155
fn ass_subscript(
156156
zelf: PyObjectRef,
157157
_needle: PyObjectRef,
158-
_value: PyObjectRef,
158+
_value: Option<PyObjectRef>,
159159
_vm: &VirtualMachine,
160160
) -> PyResult<()> {
161161
unreachable!("ass_subscript not implemented for {}", zelf.class())

vm/src/builtins/memory.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -760,10 +760,15 @@ impl AsMapping for PyMemoryView {
760760
fn ass_subscript(
761761
zelf: PyObjectRef,
762762
needle: PyObjectRef,
763-
value: PyObjectRef,
763+
value: Option<PyObjectRef>,
764764
vm: &VirtualMachine,
765765
) -> PyResult<()> {
766-
Self::downcast(zelf, vm).map(|zelf| Self::setitem(zelf, needle, value, vm))?
766+
match value {
767+
Some(value) => {
768+
Self::downcast(zelf, vm).map(|zelf| Self::setitem(zelf, needle, value, vm))?
769+
}
770+
None => Err(vm.new_type_error("cannot delete memory".to_owned())),
771+
}
767772
}
768773
}
769774

vm/src/builtins/range.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -401,7 +401,7 @@ impl AsMapping for PyRange {
401401
fn ass_subscript(
402402
zelf: PyObjectRef,
403403
_needle: PyObjectRef,
404-
_value: PyObjectRef,
404+
_value: Option<PyObjectRef>,
405405
_vm: &VirtualMachine,
406406
) -> PyResult<()> {
407407
unreachable!("ass_subscript not implemented for {}", zelf.class())

vm/src/builtins/tuple.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ impl AsMapping for PyTuple {
315315
fn ass_subscript(
316316
zelf: PyObjectRef,
317317
_needle: PyObjectRef,
318-
_value: PyObjectRef,
318+
_value: Option<PyObjectRef>,
319319
_vm: &VirtualMachine,
320320
) -> PyResult<()> {
321321
unreachable!("ass_subscript not implemented for {}", zelf.class())

vm/src/pyobject.rs

+7-1
Original file line numberDiff line numberDiff line change
@@ -671,7 +671,7 @@ where
671671
fn set_item(&self, key: T, value: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
672672
if let Ok(map) = PyMapping::try_from_borrowed_object(vm, self) {
673673
if let Some(setitem) = map.ass_subscript {
674-
return setitem(self.clone(), key.into_pyobject(vm), value, vm);
674+
return setitem(self.clone(), key.into_pyobject(vm), Some(value), vm);
675675
}
676676
}
677677

@@ -687,6 +687,12 @@ where
687687
}
688688

689689
fn del_item(&self, key: T, vm: &VirtualMachine) -> PyResult<()> {
690+
if let Ok(map) = PyMapping::try_from_borrowed_object(vm, self) {
691+
if let Some(setitem) = map.ass_subscript {
692+
return setitem(self.clone(), key.into_pyobject(vm), None, vm);
693+
}
694+
}
695+
690696
vm.get_special_method(self.clone(), "__delitem__")?
691697
.map_err(|obj| {
692698
vm.new_type_error(format!(

vm/src/slots.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -570,7 +570,7 @@ pub trait AsMapping: PyValue {
570570
fn ass_subscript(
571571
zelf: PyObjectRef,
572572
needle: PyObjectRef,
573-
value: PyObjectRef,
573+
value: Option<PyObjectRef>,
574574
vm: &VirtualMachine,
575575
) -> PyResult<()>;
576576
}

vm/src/stdlib/array.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -1181,10 +1181,15 @@ mod array {
11811181
fn ass_subscript(
11821182
zelf: PyObjectRef,
11831183
needle: PyObjectRef,
1184-
value: PyObjectRef,
1184+
value: Option<PyObjectRef>,
11851185
vm: &VirtualMachine,
11861186
) -> PyResult<()> {
1187-
Self::downcast(zelf, vm).map(|zelf| Self::setitem(zelf, needle, value, vm))?
1187+
match value {
1188+
Some(value) => {
1189+
Self::downcast(zelf, vm).map(|zelf| Self::setitem(zelf, needle, value, vm))?
1190+
}
1191+
None => Self::downcast(zelf, vm).map(|zelf| Self::delitem(zelf, needle, vm))?,
1192+
}
11881193
}
11891194
}
11901195

0 commit comments

Comments
 (0)