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 566d742a0a..cd8db1a19d 100644 --- a/Lib/test/test_weakset.py +++ b/Lib/test/test_weakset.py @@ -317,8 +317,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 c2ba6781f7..f7886d2eec 100644 --- a/vm/src/builtins/set.rs +++ b/vm/src/builtins/set.rs @@ -383,16 +383,15 @@ impl PySetInner { others: impl std::iter::Iterator, vm: &VirtualMachine, ) -> PyResult<()> { - let mut temp_inner = self.copy(); - self.clear(); - for iterable in others { - for item in iterable.iter(vm)? { - let obj = item?; - if temp_inner.contains(&obj, vm)? { - self.add(obj, vm)?; + // For each set in other + // remove all elements from LHS (self) that are not in set + for other_set_iter in others { + let other_set = Self::from_iter(other_set_iter.iter(vm)?, vm)?; + for item in self.elements().into_iter() { + if !other_set.contains(&item, vm)? { + self.remove(item, vm)?; } } - temp_inner = self.copy() } Ok(()) } @@ -402,9 +401,14 @@ impl PySetInner { others: impl std::iter::Iterator, vm: &VirtualMachine, ) -> PyResult<()> { - for iterable in others { - for item in iterable.iter(vm)? { - self.content.delete_if_exists(vm, &*item?)?; + // For each set in other + // remove all elements from LHS (self) that are also in set + for other_set_iter in others { + let other_set = Self::from_iter(other_set_iter.iter(vm)?, vm)?; + for item in self.elements().into_iter() { + if other_set.contains(&item, vm)? { + self.remove(item, vm)?; + } } } Ok(())