@@ -13,7 +13,6 @@ use crate::dictdatatype;
1313use super :: objiter;
1414use super :: objlist:: PyListIterator ;
1515use super :: objstr;
16- use super :: objtype;
1716use crate :: obj:: objtype:: PyClassRef ;
1817
1918pub type DictContentType = dictdatatype:: Dict ;
@@ -38,14 +37,6 @@ impl PyValue for PyDict {
3837 }
3938}
4039
41- pub fn get_key_value_pairs ( dict : & PyObjectRef ) -> Vec < ( PyObjectRef , PyObjectRef ) > {
42- dict. payload :: < PyDict > ( )
43- . unwrap ( )
44- . entries
45- . borrow ( )
46- . get_items ( )
47- }
48-
4940// Python dict methods:
5041impl PyDictRef {
5142 fn new (
@@ -56,9 +47,10 @@ impl PyDictRef {
5647 ) -> PyResult < PyDictRef > {
5748 let dict = vm. ctx . new_dict ( ) ;
5849 if let OptionalArg :: Present ( dict_obj) = dict_obj {
59- if objtype:: isinstance ( & dict_obj, & vm. ctx . dict_type ( ) ) {
60- for ( needle, value) in get_key_value_pairs ( & dict_obj) {
61- dict. set_item ( needle, value, vm) ;
50+ let dicted: PyResult < PyDictRef > = dict_obj. clone ( ) . downcast ( ) ;
51+ if let Ok ( dict_obj) = dicted {
52+ for ( key, value) in dict_obj. get_key_value_pairs ( ) {
53+ dict. set_item ( key, value, vm) ;
6254 }
6355 } else {
6456 let iter = objiter:: get_iter ( vm, & dict_obj) ?;
@@ -71,18 +63,17 @@ impl PyDictRef {
7163 None => break ,
7264 } ;
7365 let elem_iter = objiter:: get_iter ( vm, & element) ?;
74- let needle =
75- objiter:: get_next_object ( vm, & elem_iter) ?. ok_or_else ( || err ( vm) ) ?;
66+ let key = objiter:: get_next_object ( vm, & elem_iter) ?. ok_or_else ( || err ( vm) ) ?;
7667 let value = objiter:: get_next_object ( vm, & elem_iter) ?. ok_or_else ( || err ( vm) ) ?;
7768 if objiter:: get_next_object ( vm, & elem_iter) ?. is_some ( ) {
7869 return Err ( err ( vm) ) ;
7970 }
80- dict. set_item ( needle , value, vm) ;
71+ dict. set_item ( key , value, vm) ;
8172 }
8273 }
8374 }
84- for ( needle , value) in kwargs. into_iter ( ) {
85- dict. set_item ( vm. new_str ( needle ) , value, vm) ;
75+ for ( key , value) in kwargs. into_iter ( ) {
76+ dict. set_item ( vm. new_str ( key ) , value, vm) ;
8677 }
8778 Ok ( dict)
8879 }
@@ -97,9 +88,8 @@ impl PyDictRef {
9788
9889 fn repr ( self , vm : & VirtualMachine ) -> PyResult {
9990 let s = if let Some ( _guard) = ReprGuard :: enter ( self . as_object ( ) ) {
100- let elements = get_key_value_pairs ( self . as_object ( ) ) ;
10191 let mut str_parts = vec ! [ ] ;
102- for ( key, value) in elements {
92+ for ( key, value) in self . get_key_value_pairs ( ) {
10393 let key_repr = vm. to_repr ( & key) ?;
10494 let value_repr = vm. to_repr ( & value) ?;
10595 str_parts. push ( format ! ( "{}: {}" , key_repr. value, value_repr. value) ) ;
@@ -176,8 +166,12 @@ impl PyDictRef {
176166 }
177167 }
178168
179- fn setitem ( self , needle : PyObjectRef , value : PyObjectRef , vm : & VirtualMachine ) {
180- self . set_item ( needle, value, vm)
169+ pub fn get_key_value_pairs ( & self ) -> Vec < ( PyObjectRef , PyObjectRef ) > {
170+ self . entries . borrow ( ) . get_items ( )
171+ }
172+
173+ fn setitem ( self , key : PyObjectRef , value : PyObjectRef , vm : & VirtualMachine ) {
174+ self . set_item ( key, value, vm)
181175 }
182176
183177 fn getitem ( self , key : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
@@ -212,23 +206,19 @@ impl PyDictRef {
212206 fn hash ( self , vm : & VirtualMachine ) -> PyResult {
213207 Err ( vm. new_type_error ( "unhashable type" . to_string ( ) ) )
214208 }
215- }
216209
217- impl DictProtocol for PyDictRef {
218- fn contains_key < T : IntoPyObject > ( & self , key : T , vm : & VirtualMachine ) -> bool {
210+ pub fn contains_key < T : IntoPyObject > ( & self , key : T , vm : & VirtualMachine ) -> bool {
219211 let key = key. into_pyobject ( vm) . unwrap ( ) ;
220212 self . entries . borrow ( ) . contains ( vm, & key) . unwrap ( )
221213 }
214+ }
222215
216+ impl DictProtocol for PyDictRef {
223217 fn get_item < T : IntoPyObject > ( & self , key : T , vm : & VirtualMachine ) -> Option < PyObjectRef > {
224218 let key = key. into_pyobject ( vm) . unwrap ( ) ;
225219 self . entries . borrow ( ) . get ( vm, & key) . ok ( )
226220 }
227221
228- fn get_key_value_pairs ( & self ) -> Vec < ( PyObjectRef , PyObjectRef ) > {
229- get_key_value_pairs ( self . as_object ( ) )
230- }
231-
232222 // Item set/get:
233223 fn set_item < T : IntoPyObject > ( & self , key : T , value : PyObjectRef , vm : & VirtualMachine ) {
234224 let key = key. into_pyobject ( vm) . unwrap ( ) ;
0 commit comments