@@ -375,10 +375,11 @@ impl PySetInner {
375
375
376
376
fn difference_update (
377
377
& self ,
378
- others : impl std:: iter:: Iterator < Item = ArgIterable > ,
378
+ others : impl std:: iter:: Iterator < Item = PyObjectRef > ,
379
379
vm : & VirtualMachine ,
380
380
) -> PyResult < ( ) > {
381
381
for iterable in others {
382
+ let iterable = ArgIterable :: < PyObjectRef > :: try_from_object ( vm, iterable) ?;
382
383
for item in iterable. iter ( vm) ? {
383
384
self . content . delete_if_exists ( vm, & * item?) ?;
384
385
}
@@ -388,11 +389,12 @@ impl PySetInner {
388
389
389
390
fn symmetric_difference_update (
390
391
& self ,
391
- others : impl std:: iter:: Iterator < Item = ArgIterable > ,
392
+ others : impl std:: iter:: Iterator < Item = PyObjectRef > ,
392
393
vm : & VirtualMachine ,
393
394
) -> PyResult < ( ) > {
394
395
for iterable in others {
395
396
// We want to remove duplicates in iterable
397
+ let iterable = ArgIterable :: < PyObjectRef > :: try_from_object ( vm, iterable) ?;
396
398
let iterable_set = Self :: from_iter ( iterable. iter ( vm) ?, vm) ?;
397
399
for item in iterable_set. elements ( ) {
398
400
self . content . delete_or_insert ( vm, & item, ( ) ) ?;
@@ -681,43 +683,66 @@ impl PySet {
681
683
}
682
684
683
685
#[ pymethod]
684
- fn difference_update ( & self , others : PosArgs < ArgIterable > , vm : & VirtualMachine ) -> PyResult < ( ) > {
685
- self . inner . difference_update ( others. into_iter ( ) , vm) ?;
686
+ fn difference_update ( zelf : PyRef < Self > , others : PosArgs < PyObjectRef > , vm : & VirtualMachine ) -> PyResult < ( ) > {
687
+ let arguments = others. into_vec ( ) ;
688
+ if arguments. len ( ) == 1 {
689
+ if let Some ( iterable) = arguments. first ( ) {
690
+ if zelf. is ( iterable) {
691
+ zelf. inner . clear ( ) ;
692
+ return Ok ( ( ) ) ;
693
+ }
694
+ }
695
+ } else if arguments. is_empty ( ) {
696
+ return Ok ( ( ) ) ;
697
+ }
698
+ zelf. inner . difference_update ( arguments. into_iter ( ) , vm) ?;
686
699
Ok ( ( ) )
687
700
}
688
701
689
702
#[ pymethod( magic) ]
690
703
fn isub ( zelf : PyRef < Self > , set : PyObjectRef , vm : & VirtualMachine ) -> PyResult < PyRef < Self > > {
704
+ if !set. class ( ) . is ( vm. ctx . types . set_type ) {
705
+ return Err ( vm. new_type_error ( "Type error" . to_owned ( ) ) ) ;
706
+ }
691
707
if zelf. is ( & set) {
692
708
zelf. inner . clear ( ) ;
693
709
return Ok ( zelf) ;
694
710
}
695
- let set = set. try_into_value :: < AnySet > ( vm) ?;
696
- zelf. inner
697
- . difference_update ( set. into_iterable_iter ( vm) ?, vm) ?;
711
+ zelf. inner . difference_update ( std:: iter:: once ( set) , vm) ?;
698
712
Ok ( zelf)
699
713
}
700
714
701
715
#[ pymethod]
702
716
fn symmetric_difference_update (
703
- & self ,
704
- others : PosArgs < ArgIterable > ,
717
+ zelf : PyRef < Self > ,
718
+ others : PosArgs < PyObjectRef > ,
705
719
vm : & VirtualMachine ,
706
720
) -> PyResult < ( ) > {
707
- self . inner
708
- . symmetric_difference_update ( others. into_iter ( ) , vm) ?;
721
+ let arguments = others. into_vec ( ) ;
722
+ if arguments. len ( ) == 1 {
723
+ if let Some ( iterable) = arguments. first ( ) {
724
+ if zelf. is ( iterable) {
725
+ zelf. inner . clear ( ) ;
726
+ return Ok ( ( ) ) ;
727
+ }
728
+ }
729
+ } else if arguments. is_empty ( ) {
730
+ return Ok ( ( ) ) ;
731
+ }
732
+ zelf. inner . symmetric_difference_update ( arguments. into_iter ( ) , vm) ?;
709
733
Ok ( ( ) )
710
734
}
711
735
712
736
#[ pymethod( magic) ]
713
737
fn ixor ( zelf : PyRef < Self > , set : PyObjectRef , vm : & VirtualMachine ) -> PyResult < PyRef < Self > > {
738
+ if !set. class ( ) . is ( vm. ctx . types . set_type ) {
739
+ return Err ( vm. new_type_error ( "Type error" . to_owned ( ) ) ) ;
740
+ }
714
741
if zelf. is ( & set) {
715
742
zelf. inner . clear ( ) ;
716
743
return Ok ( zelf) ;
717
744
}
718
- let set = set. try_into_value :: < AnySet > ( vm) ?;
719
- zelf. inner
720
- . symmetric_difference_update ( set. into_iterable_iter ( vm) ?, vm) ?;
745
+ zelf. inner . symmetric_difference_update ( std:: iter:: once ( set) , vm) ?;
721
746
Ok ( zelf)
722
747
}
723
748
0 commit comments