From e83b68b810d66ce4837cc3fbb1e3b06e1abb709d Mon Sep 17 00:00:00 2001 From: snowapril Date: Tue, 21 Sep 2021 00:14:49 +0900 Subject: [PATCH] apply mapping protocol in itemprotocol --- vm/src/pyobject.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/vm/src/pyobject.rs b/vm/src/pyobject.rs index 514a88823..deb43ce52 100644 --- a/vm/src/pyobject.rs +++ b/vm/src/pyobject.rs @@ -10,6 +10,7 @@ use crate::{ builtinfunc::PyNativeFuncDef, bytearray, bytes, code::{self, PyCode}, + dict::PyMapping, getset::{IntoPyGetterFunc, IntoPySetterFunc, PyGetSet}, namespace::PyNamespace, object, pystr, @@ -639,6 +640,12 @@ where T: IntoPyObject, { fn get_item(&self, key: T, vm: &VirtualMachine) -> PyResult { + if let Ok(map) = PyMapping::try_from_borrowed_object(vm, self) { + if let Some(getitem) = map.subscript { + return getitem(self.clone(), key.into_pyobject(vm), vm); + } + } + match vm.get_special_method(self.clone(), "__getitem__")? { Ok(special_method) => return special_method.invoke((key,), vm), Err(obj) => { @@ -656,6 +663,12 @@ where } fn set_item(&self, key: T, value: PyObjectRef, vm: &VirtualMachine) -> PyResult<()> { + if let Ok(map) = PyMapping::try_from_borrowed_object(vm, self) { + if let Some(setitem) = map.ass_subscript { + return setitem(self.clone(), key.into_pyobject(vm), value, vm); + } + } + vm.get_special_method(self.clone(), "__setitem__")? .map_err(|obj| { vm.new_type_error(format!(