From 475476df71f856f1e963837db41be7920a07463c Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Tue, 5 Mar 2019 22:41:42 +0200 Subject: [PATCH] Add dict.items --- tests/snippets/dict.py | 10 ++++++++-- vm/src/obj/objdict.rs | 24 ++++++++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/tests/snippets/dict.py b/tests/snippets/dict.py index a451c4f39..3e20d0a3a 100644 --- a/tests/snippets/dict.py +++ b/tests/snippets/dict.py @@ -20,6 +20,12 @@ assert len(a) == 0 a = {'a': 5, 'b': 6} res = set() -for num in a.values(): - res.add(num) +for value in a.values(): + res.add(value) assert res == set([5,6]) + +count = 0 +for (key, value) in a.items(): + assert a[key] == value + count += 1 +assert count == len(a) diff --git a/vm/src/obj/objdict.rs b/vm/src/obj/objdict.rs index b735cc198..91b480678 100644 --- a/vm/src/obj/objdict.rs +++ b/vm/src/obj/objdict.rs @@ -273,8 +273,7 @@ fn dict_values(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { let values = get_elements(dict) .values() - .map(|(_k, v)| v) - .cloned() + .map(|(_k, v)| v.clone()) .collect(); let values_list = vm.ctx.new_list(values); @@ -289,6 +288,26 @@ fn dict_values(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { Ok(iter_obj) } +fn dict_items(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { + arg_check!(vm, args, required = [(dict, Some(vm.ctx.dict_type()))]); + + let items = get_elements(dict) + .values() + .map(|(k, v)| vm.ctx.new_tuple(vec![k.clone(), v.clone()])) + .collect(); + let items_list = vm.ctx.new_list(items); + + let iter_obj = PyObject::new( + PyObjectPayload::Iterator { + position: Cell::new(0), + iterated_obj: items_list, + }, + vm.ctx.iter_type(), + ); + + Ok(iter_obj) +} + fn dict_setitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { arg_check!( vm, @@ -367,4 +386,5 @@ pub fn init(context: &PyContext) { ); context.set_attr(&dict_type, "clear", context.new_rustfunc(dict_clear)); context.set_attr(&dict_type, "values", context.new_rustfunc(dict_values)); + context.set_attr(&dict_type, "items", context.new_rustfunc(dict_items)); }