@@ -2,6 +2,7 @@ use super::super::pyobject::{
2
2
PyContext , PyFuncArgs , PyObject , PyObjectKind , PyObjectRef , PyResult , TypeProtocol ,
3
3
} ;
4
4
use super :: super :: vm:: VirtualMachine ;
5
+ use super :: objiter;
5
6
use super :: objstr;
6
7
use super :: objtype;
7
8
use num_bigint:: ToBigInt ;
@@ -113,8 +114,43 @@ pub fn content_contains_key_str(elements: &DictContentType, key: &str) -> bool {
113
114
114
115
// Python dict methods:
115
116
116
- fn dict_new ( _vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
117
- Ok ( new ( args. args [ 0 ] . clone ( ) ) )
117
+ fn dict_new ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
118
+ arg_check ! (
119
+ vm,
120
+ args,
121
+ required = [ ( _ty, Some ( vm. ctx. type_type( ) ) ) ] ,
122
+ optional = [ ( dict_obj, None ) ]
123
+ ) ;
124
+ let dict = vm. ctx . new_dict ( ) ;
125
+ if let Some ( dict_obj) = dict_obj {
126
+ if objtype:: isinstance ( & dict_obj, & vm. ctx . dict_type ( ) ) {
127
+ for ( needle, value) in get_key_value_pairs ( & dict_obj) {
128
+ set_item ( & dict, & needle, & value) ;
129
+ }
130
+ } else {
131
+ let iter = objiter:: get_iter ( vm, dict_obj) ?;
132
+ loop {
133
+ fn err ( vm : & mut VirtualMachine ) -> PyObjectRef {
134
+ vm. new_type_error ( "Iterator must have exactly two elements" . to_string ( ) )
135
+ }
136
+ let element = match objiter:: get_next_object ( vm, & iter) ? {
137
+ Some ( obj) => obj,
138
+ None => break ,
139
+ } ;
140
+ let elem_iter = objiter:: get_iter ( vm, & element) ?;
141
+ let needle = objiter:: get_next_object ( vm, & elem_iter) ?. ok_or_else ( || err ( vm) ) ?;
142
+ let value = objiter:: get_next_object ( vm, & elem_iter) ?. ok_or_else ( || err ( vm) ) ?;
143
+ if let Some ( _) = objiter:: get_next_object ( vm, & elem_iter) ? {
144
+ return Err ( err ( vm) ) ;
145
+ }
146
+ set_item ( & dict, & needle, & value) ;
147
+ }
148
+ }
149
+ }
150
+ for ( needle, value) in args. kwargs {
151
+ set_item ( & dict, & vm. new_str ( needle) , & value) ;
152
+ }
153
+ Ok ( dict)
118
154
}
119
155
120
156
fn dict_len ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
0 commit comments