@@ -40,17 +40,18 @@ impl PyValue for PyDict {
40
40
// Python dict methods:
41
41
impl PyDictRef {
42
42
fn new (
43
- _class : PyClassRef , // TODO Support subclasses of int.
43
+ class : PyClassRef ,
44
44
dict_obj : OptionalArg < PyObjectRef > ,
45
45
kwargs : KwArgs ,
46
46
vm : & VirtualMachine ,
47
47
) -> PyResult < PyDictRef > {
48
- let dict = vm. ctx . new_dict ( ) ;
48
+ let mut dict = DictContentType :: default ( ) ;
49
+
49
50
if let OptionalArg :: Present ( dict_obj) = dict_obj {
50
51
let dicted: PyResult < PyDictRef > = dict_obj. clone ( ) . downcast ( ) ;
51
52
if let Ok ( dict_obj) = dicted {
52
53
for ( key, value) in dict_obj. get_key_value_pairs ( ) {
53
- dict. set_item ( key , value , vm ) ;
54
+ dict. insert ( vm , & key , value ) ? ;
54
55
}
55
56
} else {
56
57
let iter = objiter:: get_iter ( vm, & dict_obj) ?;
@@ -68,14 +69,17 @@ impl PyDictRef {
68
69
if objiter:: get_next_object ( vm, & elem_iter) ?. is_some ( ) {
69
70
return Err ( err ( vm) ) ;
70
71
}
71
- dict. set_item ( key , value , vm ) ;
72
+ dict. insert ( vm , & key , value ) ? ;
72
73
}
73
74
}
74
75
}
75
76
for ( key, value) in kwargs. into_iter ( ) {
76
- dict. set_item ( vm. new_str ( key) , value, vm) ;
77
+ dict. insert ( vm, & vm. new_str ( key) , value) ?;
78
+ }
79
+ PyDict {
80
+ entries : RefCell :: new ( dict) ,
77
81
}
78
- Ok ( dict )
82
+ . into_ref_with_type ( vm , class )
79
83
}
80
84
81
85
fn bool ( self , _vm : & VirtualMachine ) -> bool {
0 commit comments