@@ -492,6 +492,35 @@ fn set_combine_update_inner(
492492 }
493493}
494494
495+ fn set_symmetric_difference_update ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
496+ arg_check ! (
497+ vm,
498+ args,
499+ required = [ ( zelf, Some ( vm. ctx. set_type( ) ) ) , ( iterable, None ) ]
500+ ) ;
501+
502+ let mut mut_obj = zelf. borrow_mut ( ) ;
503+
504+ match mut_obj. payload {
505+ PyObjectPayload :: Set { ref mut elements } => {
506+ let elements_original = elements. clone ( ) ;
507+ let iterator = objiter:: get_iter ( vm, iterable) ?;
508+ while let Ok ( v) = vm. call_method ( & iterator, "__next__" , vec ! [ ] ) {
509+ insert_into_set ( vm, elements, & v) ?;
510+ }
511+ for element in elements_original. iter ( ) {
512+ let value = vm. call_method ( iterable, "__contains__" , vec ! [ element. 1 . clone( ) ] ) ?;
513+ if objbool:: get_value ( & value) {
514+ elements. remove ( & element. 0 . clone ( ) ) ;
515+ }
516+ }
517+
518+ Ok ( vm. get_none ( ) )
519+ }
520+ _ => Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
521+ }
522+ }
523+
495524fn frozenset_repr ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
496525 arg_check ! ( vm, args, required = [ ( o, Some ( vm. ctx. frozenset_type( ) ) ) ] ) ;
497526
@@ -574,6 +603,11 @@ pub fn init(context: &PyContext) {
574603 "difference_update" ,
575604 context. new_rustfunc ( set_difference_update) ,
576605 ) ;
606+ context. set_attr (
607+ & set_type,
608+ "symmetric_difference_update" ,
609+ context. new_rustfunc ( set_symmetric_difference_update) ,
610+ ) ;
577611
578612 let frozenset_type = & context. frozenset_type ;
579613
0 commit comments