@@ -18,8 +18,8 @@ use bstr::ByteSlice;
18
18
use num_bigint:: { BigInt , BigUint , Sign } ;
19
19
use num_integer:: Integer ;
20
20
use num_traits:: { One , Pow , PrimInt , Signed , ToPrimitive , Zero } ;
21
- use std:: fmt ;
22
- use std:: { borrow :: Cow , ops:: Neg } ;
21
+ use std:: ops :: Neg ;
22
+ use std:: { fmt , ops:: Not } ;
23
23
24
24
/// int(x=0) -> integer
25
25
/// int(x, base=10) -> integer
@@ -756,13 +756,46 @@ impl Hashable for PyInt {
756
756
}
757
757
758
758
impl AsNumber for PyInt {
759
- fn as_number ( _zelf : & crate :: Py < Self > , _vm : & VirtualMachine ) -> Cow < ' static , PyNumberMethods > {
760
- Cow :: Borrowed ( & Self :: NUMBER_METHODS )
761
- }
759
+ 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) ;
779
+ try_to_float ( & zelf. value , vm) . map ( |x| vm. ctx . new_float ( x) )
780
+ } ) ,
781
+ floor_divide : Some ( |number, other, vm| {
782
+ Self :: number_general_op ( number, other, inner_floordiv, vm)
783
+ } ) ,
784
+ true_divide : Some ( |number, other, vm| {
785
+ Self :: number_general_op ( number, other, inner_truediv, vm)
786
+ } ) ,
787
+ index : Some ( |number, vm| Ok ( Self :: number_int ( number, vm) ) ) ,
788
+ ..PyNumberMethods :: NOT_IMPLEMENTED
789
+ } ;
762
790
}
763
791
764
792
impl PyInt {
765
- fn np_general_op < F > ( number : & PyNumber , other : & PyObject , op : F , vm : & VirtualMachine ) -> PyResult
793
+ fn number_general_op < F > (
794
+ number : & PyNumber ,
795
+ other : & PyObject ,
796
+ op : F ,
797
+ vm : & VirtualMachine ,
798
+ ) -> PyResult
766
799
where
767
800
F : FnOnce ( & BigInt , & BigInt , & VirtualMachine ) -> PyResult ,
768
801
{
@@ -773,62 +806,21 @@ impl PyInt {
773
806
}
774
807
}
775
808
776
- fn np_int_op < F > ( number : & PyNumber , other : & PyObject , op : F , vm : & VirtualMachine ) -> PyResult
809
+ fn number_int_op < F > ( number : & PyNumber , other : & PyObject , op : F , vm : & VirtualMachine ) -> PyResult
777
810
where
778
811
F : FnOnce ( & BigInt , & BigInt ) -> BigInt ,
779
812
{
780
- Self :: np_general_op ( number, other, |a, b, _vm| op ( a, b) . to_pyresult ( vm) , vm)
813
+ Self :: number_general_op ( number, other, |a, b, _vm| op ( a, b) . to_pyresult ( vm) , vm)
781
814
}
782
815
783
- fn np_int ( number : & PyNumber , vm : & VirtualMachine ) -> PyIntRef {
816
+ fn number_int ( number : & PyNumber , vm : & VirtualMachine ) -> PyIntRef {
784
817
if let Some ( zelf) = number. obj . downcast_ref_if_exact :: < Self > ( vm) {
785
818
zelf. to_owned ( )
786
819
} else {
787
820
let zelf = Self :: number_downcast ( number) ;
788
821
vm. ctx . new_int ( zelf. value . clone ( ) )
789
822
}
790
823
}
791
-
792
- const NUMBER_METHODS : PyNumberMethods = PyNumberMethods {
793
- add : Some ( |number, other, vm| Self :: np_int_op ( number, other, |a, b| a + b, vm) ) ,
794
- subtract : Some ( |number, other, vm| Self :: np_int_op ( number, other, |a, b| a - b, vm) ) ,
795
- multiply : Some ( |number, other, vm| Self :: np_int_op ( number, other, |a, b| a * b, vm) ) ,
796
- remainder : Some ( |number, other, vm| Self :: np_general_op ( number, other, inner_mod, vm) ) ,
797
- divmod : Some ( |number, other, vm| Self :: np_general_op ( number, other, inner_divmod, vm) ) ,
798
- power : Some ( |number, other, vm| Self :: np_general_op ( number, other, inner_pow, vm) ) ,
799
- negative : Some ( |number, vm| {
800
- Self :: number_downcast ( number)
801
- . value
802
- . clone ( )
803
- . neg ( )
804
- . to_pyresult ( vm)
805
- } ) ,
806
- positive : Some ( |number, vm| Ok ( Self :: np_int ( number, vm) . into ( ) ) ) ,
807
- absolute : Some ( |number, vm| Self :: number_downcast ( number) . value . abs ( ) . to_pyresult ( vm) ) ,
808
- boolean : Some ( |number, _vm| Ok ( Self :: number_downcast ( number) . value . is_zero ( ) ) ) ,
809
- invert : Some ( |number, vm| {
810
- let value = Self :: number_downcast ( number) . value . clone ( ) ;
811
- ( !value) . to_pyresult ( vm)
812
- } ) ,
813
- lshift : Some ( |number, other, vm| Self :: np_general_op ( number, other, inner_lshift, vm) ) ,
814
- rshift : Some ( |number, other, vm| Self :: np_general_op ( number, other, inner_rshift, vm) ) ,
815
- and : Some ( |number, other, vm| Self :: np_int_op ( number, other, |a, b| a & b, vm) ) ,
816
- xor : Some ( |number, other, vm| Self :: np_int_op ( number, other, |a, b| a ^ b, vm) ) ,
817
- or : Some ( |number, other, vm| Self :: np_int_op ( number, other, |a, b| a | b, vm) ) ,
818
- int : Some ( |number, other| Ok ( Self :: np_int ( number, other) ) ) ,
819
- float : Some ( |number, vm| {
820
- let zelf = Self :: number_downcast ( number) ;
821
- try_to_float ( & zelf. value , vm) . map ( |x| vm. ctx . new_float ( x) )
822
- } ) ,
823
- floor_divide : Some ( |number, other, vm| {
824
- Self :: np_general_op ( number, other, inner_floordiv, vm)
825
- } ) ,
826
- true_divide : Some ( |number, other, vm| {
827
- Self :: np_general_op ( number, other, inner_truediv, vm)
828
- } ) ,
829
- index : Some ( |number, vm| Ok ( Self :: np_int ( number, vm) ) ) ,
830
- ..* PyNumberMethods :: not_implemented ( )
831
- } ;
832
824
}
833
825
834
826
#[ derive( FromArgs ) ]
0 commit comments