@@ -455,27 +455,24 @@ impl Hashable for PyComplex {
455455impl AsNumber for PyComplex {
456456 fn as_number ( ) -> & ' static PyNumberMethods {
457457 static AS_NUMBER : Lazy < PyNumberMethods > = Lazy :: new ( || PyNumberMethods {
458- add : atomic_func ! ( |number, other, vm| PyComplex :: number_complex_op(
459- number,
460- other,
461- |a, b| a + b,
462- vm
463- ) ) ,
458+ add : atomic_func ! ( |number, other, vm| {
459+ PyComplex :: number_op( number, other, |a, b, _vm| a + b, vm)
460+ } ) ,
464461 subtract : atomic_func ! ( |number, other, vm| {
465- PyComplex :: number_complex_op ( number, other, |a, b| a - b, vm)
462+ PyComplex :: number_op ( number, other, |a, b, _vm | a - b, vm)
466463 } ) ,
467464 multiply : atomic_func ! ( |number, other, vm| {
468- PyComplex :: number_complex_op ( number, other, |a, b| a * b, vm)
465+ PyComplex :: number_op ( number, other, |a, b, _vm | a * b, vm)
469466 } ) ,
470- power : atomic_func ! ( |number, other, vm| PyComplex :: number_general_op (
467+ power : atomic_func ! ( |number, other, vm| PyComplex :: number_op (
471468 number, other, inner_pow, vm
472469 ) ) ,
473470 negative : atomic_func ! ( |number, vm| {
474471 let value = PyComplex :: number_downcast( number) . value;
475472 ( -value) . to_pyresult( vm)
476473 } ) ,
477474 positive : atomic_func ! (
478- |number, vm| PyComplex :: number_complex ( number, vm) . to_pyresult( vm)
475+ |number, vm| PyComplex :: number_downcast_exact ( number, vm) . to_pyresult( vm)
479476 ) ,
480477 absolute : atomic_func ! ( |number, vm| {
481478 let value = PyComplex :: number_downcast( number) . value;
@@ -485,7 +482,7 @@ impl AsNumber for PyComplex {
485482 . value
486483 . is_zero( ) ) ) ,
487484 true_divide : atomic_func ! ( |number, other, vm| {
488- PyComplex :: number_general_op ( number, other, inner_div, vm)
485+ PyComplex :: number_op ( number, other, inner_div, vm)
489486 } ) ,
490487 ..PyNumberMethods :: NOT_IMPLEMENTED
491488 } ) ;
@@ -494,36 +491,19 @@ impl AsNumber for PyComplex {
494491}
495492
496493impl PyComplex {
497- fn number_general_op < F , R > (
498- number : PyNumber ,
499- other : & PyObject ,
500- op : F ,
501- vm : & VirtualMachine ,
502- ) -> PyResult
494+ fn number_op < F , R > ( number : PyNumber , other : & PyObject , op : F , vm : & VirtualMachine ) -> PyResult
503495 where
504496 F : FnOnce ( Complex64 , Complex64 , & VirtualMachine ) -> R ,
505497 R : ToPyResult ,
506498 {
507- if let ( Some ( a) , Some ( b) ) = ( number. obj . payload :: < Self > ( ) , other . payload :: < Self > ( ) ) {
508- op ( a. value , b. value , vm) . to_pyresult ( vm)
499+ if let ( Some ( a) , Some ( b) ) = ( to_op_complex ( number. obj , vm ) ? , to_op_complex ( other , vm ) ? ) {
500+ op ( a, b, vm) . to_pyresult ( vm)
509501 } else {
510502 Ok ( vm. ctx . not_implemented ( ) )
511503 }
512504 }
513505
514- fn number_complex_op < F > (
515- number : PyNumber ,
516- other : & PyObject ,
517- op : F ,
518- vm : & VirtualMachine ,
519- ) -> PyResult
520- where
521- F : FnOnce ( Complex64 , Complex64 ) -> Complex64 ,
522- {
523- Self :: number_general_op ( number, other, |a, b, _vm| op ( a, b) , vm)
524- }
525-
526- fn number_complex ( number : PyNumber , vm : & VirtualMachine ) -> PyRef < PyComplex > {
506+ fn number_downcast_exact ( number : PyNumber , vm : & VirtualMachine ) -> PyRef < PyComplex > {
527507 if let Some ( zelf) = number. obj . downcast_ref_if_exact :: < Self > ( vm) {
528508 zelf. to_owned ( )
529509 } else {
0 commit comments