@@ -303,6 +303,16 @@ impl PySetInner {
303303 }
304304}
305305
306+ macro_rules! try_set_inner {
307+ ( $vm: expr, $other: expr, $op: expr) => {
308+ match_class!( $other,
309+ set @ PySet => $op( & * set. inner. borrow( ) ) ,
310+ frozen @ PyFrozenSet => $op( & frozen. inner) ,
311+ other => Err ( $vm. new_type_error( format!( "{} is not a subtype of set or frozenset" , other. class( ) ) ) ) ,
312+ ) ;
313+ } ;
314+ }
315+
306316#[ pyimpl]
307317impl PySet {
308318 #[ pymethod( name = "__new__" ) ]
@@ -336,47 +346,27 @@ impl PySet {
336346
337347 #[ pymethod( name = "__eq__" ) ]
338348 fn eq ( & self , other : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
339- match_class ! ( other,
340- set @ PySet => self . inner. borrow( ) . eq( & set. inner. borrow( ) , vm) ,
341- frozen @ PyFrozenSet => self . inner. borrow( ) . eq( & frozen. inner, vm) ,
342- other => { return Err ( vm. new_type_error( format!( "{} is not a subtype of set or frozenset" , other. class( ) ) ) ) ; } ,
343- )
349+ try_set_inner ! ( vm, other, |other| self . inner. borrow( ) . eq( other, vm) )
344350 }
345351
346352 #[ pymethod( name = "__ge__" ) ]
347353 fn ge ( & self , other : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
348- match_class ! ( other,
349- set @ PySet => self . inner. borrow( ) . ge( & set. inner. borrow( ) , vm) ,
350- frozen @ PyFrozenSet => self . inner. borrow( ) . ge( & frozen. inner, vm) ,
351- other => { return Err ( vm. new_type_error( format!( "{} is not a subtype of set or frozenset" , other. class( ) ) ) ) ; } ,
352- )
354+ try_set_inner ! ( vm, other, |other| self . inner. borrow( ) . ge( other, vm) )
353355 }
354356
355357 #[ pymethod( name = "__gt__" ) ]
356358 fn gt ( & self , other : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
357- match_class ! ( other,
358- set @ PySet => self . inner. borrow( ) . gt( & set. inner. borrow( ) , vm) ,
359- frozen @ PyFrozenSet => self . inner. borrow( ) . gt( & frozen. inner, vm) ,
360- other => { return Err ( vm. new_type_error( format!( "{} is not a subtype of set or frozenset" , other. class( ) ) ) ) ; } ,
361- )
359+ try_set_inner ! ( vm, other, |other| self . inner. borrow( ) . gt( other, vm) )
362360 }
363361
364362 #[ pymethod( name = "__le__" ) ]
365363 fn le ( & self , other : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
366- match_class ! ( other,
367- set @ PySet => self . inner. borrow( ) . le( & set. inner. borrow( ) , vm) ,
368- frozen @ PyFrozenSet => self . inner. borrow( ) . le( & frozen. inner, vm) ,
369- other => { return Err ( vm. new_type_error( format!( "{} is not a subtype of set or frozenset" , other. class( ) ) ) ) ; } ,
370- )
364+ try_set_inner ! ( vm, other, |other| self . inner. borrow( ) . le( other, vm) )
371365 }
372366
373367 #[ pymethod( name = "__lt__" ) ]
374368 fn lt ( & self , other : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
375- match_class ! ( other,
376- set @ PySet => self . inner. borrow( ) . lt( & set. inner. borrow( ) , vm) ,
377- frozen @ PyFrozenSet => self . inner. borrow( ) . lt( & frozen. inner, vm) ,
378- other => { return Err ( vm. new_type_error( format!( "{} is not a subtype of set or frozenset" , other. class( ) ) ) ) ; } ,
379- )
369+ try_set_inner ! ( vm, other, |other| self . inner. borrow( ) . lt( other, vm) )
380370 }
381371
382372 #[ pymethod]
@@ -598,47 +588,27 @@ impl PyFrozenSet {
598588
599589 #[ pymethod( name = "__eq__" ) ]
600590 fn eq ( & self , other : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
601- match_class ! ( other,
602- set @ PySet => self . inner. eq( & set. inner. borrow( ) , vm) ,
603- frozen @ PyFrozenSet => self . inner. eq( & frozen. inner, vm) ,
604- other => { return Err ( vm. new_type_error( format!( "{} is not a subtype of set or frozenset" , other. class( ) ) ) ) ; } ,
605- )
591+ try_set_inner ! ( vm, other, |other| self . inner. eq( other, vm) )
606592 }
607593
608594 #[ pymethod( name = "__ge__" ) ]
609595 fn ge ( & self , other : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
610- match_class ! ( other,
611- set @ PySet => self . inner. ge( & set. inner. borrow( ) , vm) ,
612- frozen @ PyFrozenSet => self . inner. ge( & frozen. inner, vm) ,
613- other => { return Err ( vm. new_type_error( format!( "{} is not a subtype of set or frozenset" , other. class( ) ) ) ) ; } ,
614- )
596+ try_set_inner ! ( vm, other, |other| self . inner. ge( other, vm) )
615597 }
616598
617599 #[ pymethod( name = "__gt__" ) ]
618600 fn gt ( & self , other : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
619- match_class ! ( other,
620- set @ PySet => self . inner. gt( & set. inner. borrow( ) , vm) ,
621- frozen @ PyFrozenSet => self . inner. gt( & frozen. inner, vm) ,
622- other => { return Err ( vm. new_type_error( format!( "{} is not a subtype of set or frozenset" , other. class( ) ) ) ) ; } ,
623- )
601+ try_set_inner ! ( vm, other, |other| self . inner. gt( other, vm) )
624602 }
625603
626604 #[ pymethod( name = "__le__" ) ]
627605 fn le ( & self , other : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
628- match_class ! ( other,
629- set @ PySet => self . inner. le( & set. inner. borrow( ) , vm) ,
630- frozen @ PyFrozenSet => self . inner. le( & frozen. inner, vm) ,
631- other => { return Err ( vm. new_type_error( format!( "{} is not a subtype of set or frozenset" , other. class( ) ) ) ) ; } ,
632- )
606+ try_set_inner ! ( vm, other, |other| self . inner. le( other, vm) )
633607 }
634608
635609 #[ pymethod( name = "__lt__" ) ]
636610 fn lt ( & self , other : PyObjectRef , vm : & VirtualMachine ) -> PyResult {
637- match_class ! ( other,
638- set @ PySet => self . inner. lt( & set. inner. borrow( ) , vm) ,
639- frozen @ PyFrozenSet => self . inner. lt( & frozen. inner, vm) ,
640- other => { return Err ( vm. new_type_error( format!( "{} is not a subtype of set or frozenset" , other. class( ) ) ) ) ; } ,
641- )
611+ try_set_inner ! ( vm, other, |other| self . inner. lt( other, vm) )
642612 }
643613
644614 #[ pymethod]
0 commit comments