diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py index 4284393ca5..060dbfa14a 100644 --- a/Lib/test/test_set.py +++ b/Lib/test/test_set.py @@ -582,8 +582,6 @@ def test_ixor(self): else: self.assertNotIn(c, self.s) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_inplace_on_self(self): t = self.s.copy() t |= t diff --git a/Lib/test/test_weakset.py b/Lib/test/test_weakset.py index b93ecfdb79..324cc5f445 100644 --- a/Lib/test/test_weakset.py +++ b/Lib/test/test_weakset.py @@ -324,8 +324,6 @@ def test_ixor(self): else: self.assertNotIn(c, self.s) - # TODO: RUSTPYTHON - @unittest.expectedFailure def test_inplace_on_self(self): t = self.s.copy() t |= t diff --git a/vm/src/builtins/set.rs b/vm/src/builtins/set.rs index 7a53093c79..a915285741 100644 --- a/vm/src/builtins/set.rs +++ b/vm/src/builtins/set.rs @@ -384,16 +384,18 @@ impl PySetInner { others: impl std::iter::Iterator, vm: &VirtualMachine, ) -> PyResult<()> { - let mut temp_inner = self.copy(); - self.clear(); for iterable in others { + let temp_inner = PySetInner::default(); for item in iterable.iter(vm)? { let obj = item?; - if temp_inner.contains(&obj, vm)? { - self.add(obj, vm)?; + if self.contains(&obj, vm)? { + temp_inner.add(obj, vm)?; } } - temp_inner = self.copy() + self.clear(); + for item in temp_inner.elements() { + self.add(item, vm)?; + } } Ok(()) } @@ -403,11 +405,16 @@ impl PySetInner { others: impl std::iter::Iterator, vm: &VirtualMachine, ) -> PyResult<()> { + let temp_inner = self.copy(); for iterable in others { for item in iterable.iter(vm)? { - self.content.delete_if_exists(vm, &*item?)?; + temp_inner.content.delete_if_exists(vm, &*item?)?; } } + self.clear(); + for item in temp_inner.elements() { + self.add(item, vm)?; + } Ok(()) }