()
| 447 | |
| 448 | impl AsNumber for PyComplex { |
| 449 | fn as_number() -> &'static PyNumberMethods { |
| 450 | static AS_NUMBER: PyNumberMethods = PyNumberMethods { |
| 451 | add: Some(|a, b, vm| { |
| 452 | PyComplex::complex_real_binop( |
| 453 | a, |
| 454 | b, |
| 455 | |a, b| a + b, |
| 456 | |a_complex, b_real| Complex64::new(a_complex.re + b_real, a_complex.im), |
| 457 | |a_real, b_complex| Complex64::new(a_real + b_complex.re, b_complex.im), |
| 458 | vm, |
| 459 | ) |
| 460 | }), |
| 461 | subtract: Some(|a, b, vm| { |
| 462 | PyComplex::complex_real_binop( |
| 463 | a, |
| 464 | b, |
| 465 | |a, b| a - b, |
| 466 | |a_complex, b_real| Complex64::new(a_complex.re - b_real, a_complex.im), |
| 467 | |a_real, b_complex| Complex64::new(a_real - b_complex.re, -b_complex.im), |
| 468 | vm, |
| 469 | ) |
| 470 | }), |
| 471 | multiply: Some(|a, b, vm| PyComplex::number_op(a, b, |a, b, _vm| a * b, vm)), |
| 472 | power: Some(|a, b, c, vm| { |
| 473 | if vm.is_none(c) { |
| 474 | PyComplex::number_op(a, b, inner_pow, vm) |
| 475 | } else { |
| 476 | Err(vm.new_value_error(String::from("complex modulo"))) |
| 477 | } |
| 478 | }), |
| 479 | negative: Some(|number, vm| { |
| 480 | let value = PyComplex::number_downcast(number).value; |
| 481 | (-value).to_pyresult(vm) |
| 482 | }), |
| 483 | positive: Some(|number, vm| { |
| 484 | PyComplex::number_downcast_exact(number, vm).to_pyresult(vm) |
| 485 | }), |
| 486 | absolute: Some(|number, vm| { |
| 487 | let value = PyComplex::number_downcast(number).value; |
| 488 | let result = value.norm(); |
| 489 | // Check for overflow: hypot returns inf for finite inputs that overflow |
| 490 | if result.is_infinite() && value.re.is_finite() && value.im.is_finite() { |
| 491 | return Err(vm.new_overflow_error("absolute value too large")); |
| 492 | } |
| 493 | result.to_pyresult(vm) |
| 494 | }), |
| 495 | boolean: Some(|number, _vm| Ok(!PyComplex::number_downcast(number).value.is_zero())), |
| 496 | true_divide: Some(|a, b, vm| PyComplex::number_op(a, b, inner_div, vm)), |
| 497 | ..PyNumberMethods::NOT_IMPLEMENTED |
| 498 | }; |
| 499 | &AS_NUMBER |
| 500 | } |
| 501 | |
| 502 | fn clone_exact(zelf: &Py<Self>, vm: &VirtualMachine) -> PyRef<Self> { |
| 503 | vm.ctx.new_complex(zelf.value) |
nothing calls this directly
no test coverage detected