@@ -24,6 +24,7 @@ use crate::{
2424 vm:: VirtualMachine ,
2525} ;
2626use alloc:: fmt;
27+ use core:: borrow:: Borrow ;
2728use core:: ops:: Deref ;
2829use rustpython_common:: {
2930 atomic:: { Ordering , PyAtomic , Radium } ,
@@ -719,8 +720,10 @@ impl PySet {
719720 }
720721
721722 fn __iand__ ( zelf : PyRef < Self > , set : AnySet , vm : & VirtualMachine ) -> PyResult < PyRef < Self > > {
722- zelf. inner
723- . intersection_update ( core:: iter:: once ( set. into_iterable ( vm) ?) , vm) ?;
723+ if !set. is ( zelf. as_object ( ) ) {
724+ zelf. inner
725+ . intersection_update ( core:: iter:: once ( set. into_iterable ( vm) ?) , vm) ?;
726+ }
724727 Ok ( zelf)
725728 }
726729
@@ -731,8 +734,12 @@ impl PySet {
731734 }
732735
733736 fn __isub__ ( zelf : PyRef < Self > , set : AnySet , vm : & VirtualMachine ) -> PyResult < PyRef < Self > > {
734- zelf. inner
735- . difference_update ( set. into_iterable_iter ( vm) ?, vm) ?;
737+ if set. is ( zelf. as_object ( ) ) {
738+ zelf. inner . clear ( ) ;
739+ } else {
740+ zelf. inner
741+ . difference_update ( set. into_iterable_iter ( vm) ?, vm) ?;
742+ }
736743 Ok ( zelf)
737744 }
738745
@@ -748,8 +755,12 @@ impl PySet {
748755 }
749756
750757 fn __ixor__ ( zelf : PyRef < Self > , set : AnySet , vm : & VirtualMachine ) -> PyResult < PyRef < Self > > {
751- zelf. inner
752- . symmetric_difference_update ( set. into_iterable_iter ( vm) ?, vm) ?;
758+ if set. is ( zelf. as_object ( ) ) {
759+ zelf. inner . clear ( ) ;
760+ } else {
761+ zelf. inner
762+ . symmetric_difference_update ( set. into_iterable_iter ( vm) ?, vm) ?;
763+ }
753764 Ok ( zelf)
754765 }
755766
@@ -1297,6 +1308,13 @@ struct AnySet {
12971308 object : PyObjectRef ,
12981309}
12991310
1311+ impl Borrow < PyObject > for AnySet {
1312+ #[ inline( always) ]
1313+ fn borrow ( & self ) -> & PyObject {
1314+ & self . object
1315+ }
1316+ }
1317+
13001318impl AnySet {
13011319 /// Check if object is a set or frozenset (including subclasses)
13021320 /// Equivalent to CPython's PyAnySet_Check
0 commit comments