@@ -15,6 +15,7 @@ use crate::{
1515 TryFromBorrowedObject , VirtualMachine ,
1616} ;
1717use bstr:: ByteSlice ;
18+ use crossbeam_utils:: atomic:: AtomicCell ;
1819use num_bigint:: { BigInt , BigUint , Sign } ;
1920use num_integer:: Integer ;
2021use num_traits:: { One , Pow , PrimInt , Signed , ToPrimitive , Zero } ;
@@ -755,36 +756,59 @@ impl Hashable for PyInt {
755756 }
756757}
757758
759+ macro_rules! atomic_func {
760+ ( $x: expr) => {
761+ AtomicCell :: new( Some ( $x) )
762+ } ;
763+ }
764+
758765impl AsNumber for PyInt {
759766 const AS_NUMBER : PyNumberMethods = PyNumberMethods {
760- add : Some ( |number, other, vm| Self :: number_int_op ( number, other, |a, b| a + b, vm) ) ,
761- subtract : Some ( |number, other, vm| Self :: number_int_op ( number, other, |a, b| a - b, vm) ) ,
762- multiply : Some ( |number, other, vm| Self :: number_int_op ( number, other, |a, b| a * b, vm) ) ,
763- remainder : Some ( |number, other, vm| Self :: number_general_op ( number, other, inner_mod, vm) ) ,
764- divmod : Some ( |number, other, vm| Self :: number_general_op ( number, other, inner_divmod, vm) ) ,
765- power : Some ( |number, other, vm| Self :: number_general_op ( number, other, inner_pow, vm) ) ,
766- negative : Some ( |number, vm| ( & Self :: number_downcast ( number) . value ) . neg ( ) . to_pyresult ( vm) ) ,
767- positive : Some ( |number, vm| Ok ( Self :: number_int ( number, vm) . into ( ) ) ) ,
768- absolute : Some ( |number, vm| Self :: number_downcast ( number) . value . abs ( ) . to_pyresult ( vm) ) ,
769- boolean : Some ( |number, _vm| Ok ( Self :: number_downcast ( number) . value . is_zero ( ) ) ) ,
770- invert : Some ( |number, vm| ( & Self :: number_downcast ( number) . value ) . not ( ) . to_pyresult ( vm) ) ,
771- lshift : Some ( |number, other, vm| Self :: number_general_op ( number, other, inner_lshift, vm) ) ,
772- rshift : Some ( |number, other, vm| Self :: number_general_op ( number, other, inner_rshift, vm) ) ,
773- and : Some ( |number, other, vm| Self :: number_int_op ( number, other, |a, b| a & b, vm) ) ,
774- xor : Some ( |number, other, vm| Self :: number_int_op ( number, other, |a, b| a ^ b, vm) ) ,
775- or : Some ( |number, other, vm| Self :: number_int_op ( number, other, |a, b| a | b, vm) ) ,
776- int : Some ( |number, other| Ok ( Self :: number_int ( number, other) ) ) ,
777- float : Some ( |number, vm| {
778- let zelf = Self :: number_downcast ( number) ;
767+ add : atomic_func ! ( |num, other, vm| Self :: number_int_op( num, other, |a, b| a + b, vm) ) ,
768+ subtract : atomic_func ! ( |num, other, vm| Self :: number_int_op( num, other, |a, b| a - b, vm) ) ,
769+ multiply : atomic_func ! ( |num, other, vm| Self :: number_int_op( num, other, |a, b| a * b, vm) ) ,
770+ remainder : atomic_func ! ( |num, other, vm| Self :: number_general_op(
771+ num, other, inner_mod, vm
772+ ) ) ,
773+ divmod : atomic_func ! ( |num, other, vm| Self :: number_general_op(
774+ num,
775+ other,
776+ inner_divmod,
777+ vm
778+ ) ) ,
779+ power : atomic_func ! ( |num, other, vm| Self :: number_general_op( num, other, inner_pow, vm) ) ,
780+ negative : atomic_func ! ( |num, vm| ( & Self :: number_downcast( num) . value) . neg( ) . to_pyresult( vm) ) ,
781+ positive : atomic_func ! ( |num, vm| Ok ( Self :: number_int( num, vm) . into( ) ) ) ,
782+ absolute : atomic_func ! ( |num, vm| Self :: number_downcast( num) . value. abs( ) . to_pyresult( vm) ) ,
783+ boolean : atomic_func ! ( |num, _vm| Ok ( Self :: number_downcast( num) . value. is_zero( ) ) ) ,
784+ invert : atomic_func ! ( |num, vm| ( & Self :: number_downcast( num) . value) . not( ) . to_pyresult( vm) ) ,
785+ lshift : atomic_func ! ( |num, other, vm| Self :: number_general_op(
786+ num,
787+ other,
788+ inner_lshift,
789+ vm
790+ ) ) ,
791+ rshift : atomic_func ! ( |num, other, vm| Self :: number_general_op(
792+ num,
793+ other,
794+ inner_rshift,
795+ vm
796+ ) ) ,
797+ and : atomic_func ! ( |num, other, vm| Self :: number_int_op( num, other, |a, b| a & b, vm) ) ,
798+ xor : atomic_func ! ( |num, other, vm| Self :: number_int_op( num, other, |a, b| a ^ b, vm) ) ,
799+ or : atomic_func ! ( |num, other, vm| Self :: number_int_op( num, other, |a, b| a | b, vm) ) ,
800+ int : atomic_func ! ( |num, other| Ok ( Self :: number_int( num, other) ) ) ,
801+ float : atomic_func ! ( |num, vm| {
802+ let zelf = Self :: number_downcast( num) ;
779803 try_to_float( & zelf. value, vm) . map( |x| vm. ctx. new_float( x) )
780804 } ) ,
781- floor_divide : Some ( |number , other, vm| {
782- Self :: number_general_op ( number , other, inner_floordiv, vm)
805+ floor_divide : atomic_func ! ( |num , other, vm| {
806+ Self :: number_general_op( num , other, inner_floordiv, vm)
783807 } ) ,
784- true_divide : Some ( |number , other, vm| {
785- Self :: number_general_op ( number , other, inner_truediv, vm)
808+ true_divide : atomic_func ! ( |num , other, vm| {
809+ Self :: number_general_op( num , other, inner_truediv, vm)
786810 } ) ,
787- index : Some ( |number , vm| Ok ( Self :: number_int ( number , vm) ) ) ,
811+ index : atomic_func ! ( |num , vm| Ok ( Self :: number_int( num , vm) ) ) ,
788812 ..PyNumberMethods :: NOT_IMPLEMENTED
789813 } ;
790814}
0 commit comments