@@ -243,8 +243,8 @@ fn dict_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
243
243
arg_check ! ( vm, args, required = [ ( dict, Some ( vm. ctx. dict_type( ) ) ) ] ) ;
244
244
245
245
let keys = get_elements ( dict)
246
- . keys ( )
247
- . map ( |k| vm . ctx . new_str ( k . to_string ( ) ) )
246
+ . values ( )
247
+ . map ( |( k , _v ) | k . clone ( ) )
248
248
. collect ( ) ;
249
249
let key_list = vm. ctx . new_list ( keys) ;
250
250
@@ -259,6 +259,46 @@ fn dict_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
259
259
Ok ( iter_obj)
260
260
}
261
261
262
+ fn dict_values ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
263
+ arg_check ! ( vm, args, required = [ ( dict, Some ( vm. ctx. dict_type( ) ) ) ] ) ;
264
+
265
+ let values = get_elements ( dict)
266
+ . values ( )
267
+ . map ( |( _k, v) | v. clone ( ) )
268
+ . collect ( ) ;
269
+ let values_list = vm. ctx . new_list ( values) ;
270
+
271
+ let iter_obj = PyObject :: new (
272
+ PyObjectPayload :: Iterator {
273
+ position : Cell :: new ( 0 ) ,
274
+ iterated_obj : values_list,
275
+ } ,
276
+ vm. ctx . iter_type ( ) ,
277
+ ) ;
278
+
279
+ Ok ( iter_obj)
280
+ }
281
+
282
+ fn dict_items ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
283
+ arg_check ! ( vm, args, required = [ ( dict, Some ( vm. ctx. dict_type( ) ) ) ] ) ;
284
+
285
+ let items = get_elements ( dict)
286
+ . values ( )
287
+ . map ( |( k, v) | vm. ctx . new_tuple ( vec ! [ k. clone( ) , v. clone( ) ] ) )
288
+ . collect ( ) ;
289
+ let items_list = vm. ctx . new_list ( items) ;
290
+
291
+ let iter_obj = PyObject :: new (
292
+ PyObjectPayload :: Iterator {
293
+ position : Cell :: new ( 0 ) ,
294
+ iterated_obj : items_list,
295
+ } ,
296
+ vm. ctx . iter_type ( ) ,
297
+ ) ;
298
+
299
+ Ok ( iter_obj)
300
+ }
301
+
262
302
fn dict_setitem ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
263
303
arg_check ! (
264
304
vm,
@@ -336,4 +376,7 @@ pub fn init(context: &PyContext) {
336
376
context. new_rustfunc ( dict_setitem) ,
337
377
) ;
338
378
context. set_attr ( & dict_type, "clear" , context. new_rustfunc ( dict_clear) ) ;
379
+ context. set_attr ( & dict_type, "values" , context. new_rustfunc ( dict_values) ) ;
380
+ context. set_attr ( & dict_type, "items" , context. new_rustfunc ( dict_items) ) ;
381
+ context. set_attr ( & dict_type, "keys" , context. new_rustfunc ( dict_iter) ) ;
339
382
}
0 commit comments