@@ -453,6 +453,29 @@ fn set_update(vm: &mut VirtualMachine, args: PyFuncArgs) -> PyResult {
453
453
}
454
454
}
455
455
456
+ fn set_intersection_update ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
457
+ arg_check ! (
458
+ vm,
459
+ args,
460
+ required = [ ( zelf, Some ( vm. ctx. set_type( ) ) ) , ( iterable, None ) ]
461
+ ) ;
462
+
463
+ let mut mut_obj = zelf. borrow_mut ( ) ;
464
+
465
+ match mut_obj. payload {
466
+ PyObjectPayload :: Set { ref mut elements } => {
467
+ for element in elements. clone ( ) . iter ( ) {
468
+ let value = vm. call_method ( iterable, "__contains__" , vec ! [ element. 1 . clone( ) ] ) ?;
469
+ if !objbool:: get_value ( & value) {
470
+ elements. remove ( & element. 0 . clone ( ) ) ;
471
+ }
472
+ }
473
+ Ok ( vm. get_none ( ) )
474
+ }
475
+ _ => Err ( vm. new_type_error ( "" . to_string ( ) ) ) ,
476
+ }
477
+ }
478
+
456
479
fn frozenset_repr ( vm : & mut VirtualMachine , args : PyFuncArgs ) -> PyResult {
457
480
arg_check ! ( vm, args, required = [ ( o, Some ( vm. ctx. frozenset_type( ) ) ) ] ) ;
458
481
@@ -525,6 +548,11 @@ pub fn init(context: &PyContext) {
525
548
context. set_attr ( & set_type, "copy" , context. new_rustfunc ( set_copy) ) ;
526
549
context. set_attr ( & set_type, "pop" , context. new_rustfunc ( set_pop) ) ;
527
550
context. set_attr ( & set_type, "update" , context. new_rustfunc ( set_update) ) ;
551
+ context. set_attr (
552
+ & set_type,
553
+ "intersection_update" ,
554
+ context. new_rustfunc ( set_intersection_update) ,
555
+ ) ;
528
556
529
557
let frozenset_type = & context. frozenset_type ;
530
558
0 commit comments