Merge pull request #2969 from eldpswp99/add-mutation-check-logic-in-dict-update

Add mutation check in dict.merge.
This commit is contained in:
Jim Fasarakis-Hilliard
2021-08-26 16:15:28 +03:00
committed by GitHub
2 changed files with 5 additions and 3 deletions

View File

@@ -1226,8 +1226,6 @@ class DictTest(unittest.TestCase):
d.popitem()
self.check_reentrant_insertion(mutate)
# TODO: RUSTPYTHON
@unittest.expectedFailure
def test_merge_and_mutate(self):
class X:
def __hash__(self):

View File

@@ -77,9 +77,13 @@ impl PyDict {
if let OptionalArg::Present(dict_obj) = dict_obj {
let dicted: Result<PyDictRef, _> = dict_obj.clone().downcast_exact(vm);
if let Ok(dict_obj) = dicted {
for (key, value) in dict_obj {
let dict_size = &dict_obj.size();
for (key, value) in &dict_obj {
dict.insert(vm, key, value)?;
}
if dict_obj.entries.has_changed_size(dict_size) {
return Err(vm.new_runtime_error("dict mutated during update".to_owned()));
}
} else if let Some(keys) = vm.get_method(dict_obj.clone(), "keys") {
let keys = iterator::get_iter(vm, vm.invoke(&keys?, ())?)?;
while let Some(key) = iterator::get_next_object(vm, &keys)? {