@@ -273,8 +273,7 @@ fn dict_values(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
273
273
274
274
let values = get_elements ( dict)
275
275
. values ( )
276
- . map ( |( _k, v) | v)
277
- . cloned ( )
276
+ . map ( |( _k, v) | v. clone ( ) )
278
277
. collect ( ) ;
279
278
let values_list = vm. ctx . new_list ( values) ;
280
279
@@ -289,6 +288,26 @@ fn dict_values(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
289
288
Ok ( iter_obj)
290
289
}
291
290
291
+ fn dict_items ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
292
+ arg_check ! ( vm, args, required = [ ( dict, Some ( vm. ctx. dict_type( ) ) ) ] ) ;
293
+
294
+ let items = get_elements ( dict)
295
+ . values ( )
296
+ . map ( |( k, v) | vm. ctx . new_tuple ( vec ! [ k. clone( ) , v. clone( ) ] ) )
297
+ . collect ( ) ;
298
+ let items_list = vm. ctx . new_list ( items) ;
299
+
300
+ let iter_obj = PyObject :: new (
301
+ PyObjectPayload :: Iterator {
302
+ position : Cell :: new ( 0 ) ,
303
+ iterated_obj : items_list,
304
+ } ,
305
+ vm. ctx . iter_type ( ) ,
306
+ ) ;
307
+
308
+ Ok ( iter_obj)
309
+ }
310
+
292
311
fn dict_setitem ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
293
312
arg_check ! (
294
313
vm,
@@ -367,4 +386,5 @@ pub fn init(context: &PyContext) {
367
386
) ;
368
387
context. set_attr ( & dict_type, "clear" , context. new_rustfunc ( dict_clear) ) ;
369
388
context. set_attr ( & dict_type, "values" , context. new_rustfunc ( dict_values) ) ;
389
+ context. set_attr ( & dict_type, "items" , context. new_rustfunc ( dict_items) ) ;
370
390
}
0 commit comments