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>
This commit is contained in:
Damien George
2022-07-25 15:23:48 +10:00
parent 1e87b56219
commit 4fe3e493b1
5 changed files with 45 additions and 21 deletions

View File

@@ -89,11 +89,8 @@ STATIC mp_obj_t complex_make_new(const mp_obj_type_t *type_in, size_t n_args, si
return args[0];
} else {
mp_float_t real, imag;
if (mp_obj_get_complex_maybe(args[0], &real, &imag)) {
return mp_obj_new_complex(real, imag);
}
// something else, try to cast it to a complex
return mp_obj_new_complex(mp_obj_get_float(args[0]), 0);
mp_obj_get_complex(args[0], &real, &imag);
return mp_obj_new_complex(real, imag);
}
case 2: