Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions Lib/test/test_set.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 0 additions & 2 deletions Lib/test/test_weakset.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
26 changes: 15 additions & 11 deletions vm/src/builtins/set.rs
Original file line number Diff line number Diff line change
Expand Up @@ -383,16 +383,15 @@ impl PySetInner {
others: impl std::iter::Iterator<Item = ArgIterable>,
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(())
}
Expand All @@ -402,9 +401,14 @@ impl PySetInner {
others: impl std::iter::Iterator<Item = ArgIterable>,
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(())
Expand Down