From 37118c7d750967051d8c75a1887a49a456070e21 Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Tue, 5 Mar 2019 22:34:45 +0200 Subject: [PATCH 1/3] Add dict.values --- tests/snippets/dict.py | 6 ++++++ vm/src/obj/objdict.rs | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/tests/snippets/dict.py b/tests/snippets/dict.py index 1e4acc3e3d..a451c4f39b 100644 --- a/tests/snippets/dict.py +++ b/tests/snippets/dict.py @@ -17,3 +17,9 @@ def dict_eq(d1, d2): a.clear() assert len(a) == 0 + +a = {'a': 5, 'b': 6} +res = set() +for num in a.values(): + res.add(num) +assert res == set([5,6]) diff --git a/vm/src/obj/objdict.rs b/vm/src/obj/objdict.rs index 03a307b4c3..b735cc198e 100644 --- a/vm/src/obj/objdict.rs +++ b/vm/src/obj/objdict.rs @@ -268,6 +268,27 @@ fn dict_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { Ok(iter_obj) } +fn dict_values(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { + arg_check!(vm, args, required = [(dict, Some(vm.ctx.dict_type()))]); + + let values = get_elements(dict) + .values() + .map(|(_k, v)| v) + .cloned() + .collect(); + let values_list = vm.ctx.new_list(values); + + let iter_obj = PyObject::new( + PyObjectPayload::Iterator { + position: Cell::new(0), + iterated_obj: values_list, + }, + vm.ctx.iter_type(), + ); + + Ok(iter_obj) +} + fn dict_setitem(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { arg_check!( vm, @@ -345,4 +366,5 @@ pub fn init(context: &PyContext) { context.new_rustfunc(dict_setitem), ); context.set_attr(&dict_type, "clear", context.new_rustfunc(dict_clear)); + context.set_attr(&dict_type, "values", context.new_rustfunc(dict_values)); } From 475476df71f856f1e963837db41be7920a07463c Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Tue, 5 Mar 2019 22:41:42 +0200 Subject: [PATCH 2/3] 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 a451c4f39b..3e20d0a3a1 100644 --- a/tests/snippets/dict.py +++ b/tests/snippets/dict.py @@ -20,6 +20,12 @@ def dict_eq(d1, d2): 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 b735cc198e..91b4806788 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)); } From 24dcc06c245ab0e582f6151aecbe7a2fb1335496 Mon Sep 17 00:00:00 2001 From: Aviv Palivoda Date: Tue, 5 Mar 2019 22:46:13 +0200 Subject: [PATCH 3/3] add dict.keys --- tests/snippets/dict.py | 5 +++++ vm/src/obj/objdict.rs | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/tests/snippets/dict.py b/tests/snippets/dict.py index 3e20d0a3a1..170a6492dc 100644 --- a/tests/snippets/dict.py +++ b/tests/snippets/dict.py @@ -29,3 +29,8 @@ def dict_eq(d1, d2): assert a[key] == value count += 1 assert count == len(a) + +res = set() +for key in a.keys(): + res.add(key) +assert res == set(['a','b']) diff --git a/vm/src/obj/objdict.rs b/vm/src/obj/objdict.rs index 91b4806788..189684eb05 100644 --- a/vm/src/obj/objdict.rs +++ b/vm/src/obj/objdict.rs @@ -252,8 +252,8 @@ fn dict_iter(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult { arg_check!(vm, args, required = [(dict, Some(vm.ctx.dict_type()))]); let keys = get_elements(dict) - .keys() - .map(|k| vm.ctx.new_str(k.to_string())) + .values() + .map(|(k, _v)| k.clone()) .collect(); let key_list = vm.ctx.new_list(keys); @@ -387,4 +387,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)); + context.set_attr(&dict_type, "keys", context.new_rustfunc(dict_iter)); }