@@ -745,7 +745,24 @@ impl PyInt {
745745 multiply : Some ( |a, b, vm| PyInt :: number_op ( a, b, |a, b, _vm| a * b, vm) ) ,
746746 remainder : Some ( |a, b, vm| PyInt :: number_op ( a, b, inner_mod, vm) ) ,
747747 divmod : Some ( |a, b, vm| PyInt :: number_op ( a, b, inner_divmod, vm) ) ,
748- power : Some ( |a, b, _c, vm| PyInt :: number_op ( a, b, inner_pow, vm) ) , // TODO(snowapril) : use modulo
748+ power : Some ( |a, b, c, vm| {
749+ if let ( Some ( a) , Some ( b) ) = (
750+ a. payload :: < Self > ( ) ,
751+ if b. payload_is :: < Self > ( ) {
752+ Some ( b)
753+ } else {
754+ None
755+ } ,
756+ ) {
757+ if vm. is_none ( c) {
758+ a. general_op ( b. to_owned ( ) , |a, b| inner_pow ( a, b, vm) , vm)
759+ } else {
760+ a. modpow ( b. to_owned ( ) , c. to_owned ( ) , vm)
761+ }
762+ } else {
763+ Ok ( vm. ctx . not_implemented ( ) )
764+ }
765+ } ) ,
749766 negative : Some ( |num, vm| ( & PyInt :: number_downcast ( num) . value ) . neg ( ) . to_pyresult ( vm) ) ,
750767 positive : Some ( |num, vm| Ok ( PyInt :: number_downcast_exact ( num, vm) . into ( ) ) ) ,
751768 absolute : Some ( |num, vm| PyInt :: number_downcast ( num) . value . abs ( ) . to_pyresult ( vm) ) ,
@@ -756,14 +773,14 @@ impl PyInt {
756773 and : Some ( |a, b, vm| PyInt :: number_op ( a, b, |a, b, _vm| a & b, vm) ) ,
757774 xor : Some ( |a, b, vm| PyInt :: number_op ( a, b, |a, b, _vm| a ^ b, vm) ) ,
758775 or : Some ( |a, b, vm| PyInt :: number_op ( a, b, |a, b, _vm| a | b, vm) ) ,
759- int : Some ( |num, vm| PyInt :: number_downcast_exact ( num, vm) . to_pyresult ( vm ) ) ,
776+ int : Some ( |num, vm| Ok ( PyInt :: number_downcast_exact ( num, vm) . into ( ) ) ) ,
760777 float : Some ( |num, vm| {
761778 let zelf = PyInt :: number_downcast ( num) ;
762- try_to_float ( & zelf. value , vm) . map ( |x| vm. ctx . new_float ( x) . into_pyobject ( vm ) )
779+ try_to_float ( & zelf. value , vm) . map ( |x| vm. ctx . new_float ( x) . into ( ) )
763780 } ) ,
764781 floor_divide : Some ( |a, b, vm| PyInt :: number_op ( a, b, inner_floordiv, vm) ) ,
765782 true_divide : Some ( |a, b, vm| PyInt :: number_op ( a, b, inner_truediv, vm) ) ,
766- index : Some ( |num, vm| PyInt :: number_downcast_exact ( num, vm) . to_pyresult ( vm ) ) ,
783+ index : Some ( |num, vm| Ok ( PyInt :: number_downcast_exact ( num, vm) . into ( ) ) ) ,
767784 ..PyNumberMethods :: NOT_IMPLEMENTED
768785 } ;
769786
0 commit comments