summaryrefslogtreecommitdiffstatshomepage
path: root/py/obj.c
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2022-07-25 15:23:48 +1000
committerDamien George <damien@micropython.org>2022-07-25 16:11:26 +1000
commit4fe3e493b1a62381db15b724f77d565ff2666120 (patch)
tree93497990188f39e0c747d1bdebce8fb170c527b2 /py/obj.c
parent1e87b56219c69306d77a887cac3d29146180f113 (diff)
downloadmicropython-4fe3e493b1a62381db15b724f77d565ff2666120.tar.gz
micropython-4fe3e493b1a62381db15b724f77d565ff2666120.zip
py/obj: Make mp_obj_get_complex_maybe call mp_obj_get_float_maybe first.
This commit simplifies mp_obj_get_complex_maybe() by first calling mp_obj_get_float_maybe() to handle the cases corresponding to floats. Only if that fails does it attempt to extra a full complex number. This reduces code size and also means that mp_obj_get_complex_maybe() now supports user-defined classes defining __float__; in particular this allows user-defined classes to be used as arguments to cmath-module function. Furthermore, complex_make_new() can now be simplified to directly call mp_obj_get_complex(), instead of mp_obj_get_complex_maybe() followed by mp_obj_get_float(). This also improves error messages from complex with an invalid argument, it now raises "can't convert <type> to complex" rather than "can't convert <type> to float". Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'py/obj.c')
-rw-r--r--py/obj.c17
1 files changed, 1 insertions, 16 deletions
diff --git a/py/obj.c b/py/obj.c
index 5a05ea58c5..b461fe50aa 100644
--- a/py/obj.c
+++ b/py/obj.c
@@ -383,22 +383,7 @@ mp_float_t mp_obj_get_float(mp_obj_t arg) {
#if MICROPY_PY_BUILTINS_COMPLEX
bool mp_obj_get_complex_maybe(mp_obj_t arg, mp_float_t *real, mp_float_t *imag) {
- if (arg == mp_const_false) {
- *real = 0;
- *imag = 0;
- } else if (arg == mp_const_true) {
- *real = 1;
- *imag = 0;
- } else if (mp_obj_is_small_int(arg)) {
- *real = (mp_float_t)MP_OBJ_SMALL_INT_VALUE(arg);
- *imag = 0;
- #if MICROPY_LONGINT_IMPL != MICROPY_LONGINT_IMPL_NONE
- } else if (mp_obj_is_exact_type(arg, &mp_type_int)) {
- *real = mp_obj_int_as_float_impl(arg);
- *imag = 0;
- #endif
- } else if (mp_obj_is_float(arg)) {
- *real = mp_obj_float_get(arg);
+ if (mp_obj_get_float_maybe(arg, real)) {
*imag = 0;
} else if (mp_obj_is_type(arg, &mp_type_complex)) {
mp_obj_complex_get(arg, real, imag);