@@ -12,7 +12,7 @@ use crate::builtins::bytes;
12
12
use crate :: builtins:: code;
13
13
use crate :: builtins:: code:: PyCodeRef ;
14
14
use crate :: builtins:: complex:: PyComplex ;
15
- use crate :: builtins:: dict:: { PyDict , PyDictRef } ;
15
+ use crate :: builtins:: dict:: { PyDict , PyDictRef , PyMapping } ;
16
16
use crate :: builtins:: float:: PyFloat ;
17
17
use crate :: builtins:: function:: PyBoundMethod ;
18
18
use crate :: builtins:: getset:: { IntoPyGetterFunc , IntoPySetterFunc , PyGetSet } ;
@@ -646,6 +646,12 @@ where
646
646
T : IntoPyObject ,
647
647
{
648
648
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
+
649
655
match vm. get_special_method ( self . clone ( ) , "__getitem__" ) ? {
650
656
Ok ( special_method) => return special_method. invoke ( ( key, ) , vm) ,
651
657
Err ( obj) => {
@@ -663,6 +669,12 @@ where
663
669
}
664
670
665
671
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
+
666
678
vm. get_special_method ( self . clone ( ) , "__setitem__" ) ?
667
679
. map_err ( |obj| {
668
680
vm. new_type_error ( format ! (
0 commit comments