@@ -2,6 +2,7 @@ use super::super::pyobject::{
22 PyContext , PyFuncArgs , PyObject , PyObjectKind , PyObjectRef , PyResult , TypeProtocol ,
33} ;
44use super :: super :: vm:: VirtualMachine ;
5+ use super :: objiter;
56use super :: objstr;
67use super :: objtype;
78use num_bigint:: ToBigInt ;
@@ -113,8 +114,43 @@ pub fn content_contains_key_str(elements: &DictContentType, key: &str) -> bool {
113114
114115// Python dict methods:
115116
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)
118154}
119155
120156fn dict_len ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
0 commit comments