Skip to content

Commit 63f0dd5

Browse files
committed
apply mapping protocol in itemprotocol
1 parent faa0809 commit 63f0dd5

File tree

1 file changed

+13
-1
lines changed

1 file changed

+13
-1
lines changed

vm/src/pyobject.rs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use crate::builtins::bytes;
1212
use crate::builtins::code;
1313
use crate::builtins::code::PyCodeRef;
1414
use crate::builtins::complex::PyComplex;
15-
use crate::builtins::dict::{PyDict, PyDictRef};
15+
use crate::builtins::dict::{PyDict, PyDictRef, PyMapping};
1616
use crate::builtins::float::PyFloat;
1717
use crate::builtins::function::PyBoundMethod;
1818
use crate::builtins::getset::{IntoPyGetterFunc, IntoPySetterFunc, PyGetSet};
@@ -646,6 +646,12 @@ where
646646
T: IntoPyObject,
647647
{
648648
fn get_item(&self, key: T, vm: &VirtualMachine) -> PyResult {
649+
if let Ok(map) = PyMapping::try_from_borrowed_object(vm, self) {
650+
if let Some(getitem) = map.subscript {
651+
return getitem(self.clone(), key.into_pyobject(vm), vm);
652+
}
653+
}
654+
649655
match vm.get_special_method(self.clone(), "__getitem__")? {
650656
Ok(special_method) => return special_method.invoke((key,), vm),
651657
Err(obj) => {
@@ -663,6 +669,12 @@ where
663669
}
664670

665671
fn set_item(&self, key: T, value: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> {
672+
if let Ok(map) = PyMapping::try_from_borrowed_object(vm, self) {
673+
if let Some(setitem) = map.ass_subscript {
674+
return setitem(self.clone(), key.into_pyobject(vm), value, vm);
675+
}
676+
}
677+
666678
vm.get_special_method(self.clone(), "__setitem__")?
667679
.map_err(|obj| {
668680
vm.new_type_error(format!(

0 commit comments

Comments
 (0)