diff --git a/Lib/test/test_dict.py b/Lib/test/test_dict.py index 89314c94e..5ceae642a 100644 --- a/Lib/test/test_dict.py +++ b/Lib/test/test_dict.py @@ -212,8 +212,6 @@ class DictTest(unittest.TestCase): self.assertRaises(ValueError, {}.update, [(1, 2, 3)]) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_fromkeys(self): self.assertEqual(dict.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) d = {} diff --git a/vm/src/builtins/dict.rs b/vm/src/builtins/dict.rs index 5e6fed876..1b600005a 100644 --- a/vm/src/builtins/dict.rs +++ b/vm/src/builtins/dict.rs @@ -1,6 +1,6 @@ use super::{ set::PySetInner, IterStatus, PositionIterInternal, PyBaseExceptionRef, PyGenericAlias, PySet, - PyStrRef, PyTupleRef, PyTypeRef, + PyStrRef, PyTupleRef, PyType, PyTypeRef, }; use crate::{ builtins::{iter::builtins_iter, PyTuple}, @@ -9,8 +9,8 @@ use crate::{ function::{ArgIterable, FuncArgs, IntoPyObject, KwArgs, OptionalArg}, protocol::{PyIterIter, PyIterReturn, PyMappingMethods, PySequenceMethods}, types::{ - AsMapping, AsSequence, Comparable, Constructor, Hashable, IterNext, IterNextIterable, - Iterable, PyComparisonOp, Unconstructible, Unhashable, + AsMapping, AsSequence, Callable, Comparable, Constructor, Hashable, IterNext, + IterNextIterable, Iterable, PyComparisonOp, Unconstructible, Unhashable, }, vm::{ReprGuard, VirtualMachine}, IdProtocol, @@ -150,14 +150,23 @@ impl PyDict { iterable: ArgIterable, value: OptionalArg, vm: &VirtualMachine, - ) -> PyResult> { - let dict = DictContentType::default(); + ) -> PyResult { let value = value.unwrap_or_none(vm); - for elem in iterable.iter(vm)? { - let elem = elem?; - dict.insert(vm, elem, value.clone())?; + let d = PyType::call(&class, ().into(), vm)?; + match d.downcast_exact::(vm) { + Ok(pydict) => { + for key in iterable.iter(vm)? { + pydict.setitem(key?, value.clone(), vm)?; + } + Ok(pydict.into_pyobject(vm)) + } + Err(pyobj) => { + for key in iterable.iter(vm)? { + pyobj.set_item(key?, value.clone(), vm)?; + } + Ok(pyobj) + } } - PyDict { entries: dict }.into_ref_with_type(vm, class) } #[pymethod(magic)]