py: Allow 'complex()' to take a string as first argument.
This commit is contained in:
parent
c06ea7abf2
commit
6e48f7fa85
@ -6,6 +6,7 @@
|
|||||||
#include "mpconfig.h"
|
#include "mpconfig.h"
|
||||||
#include "qstr.h"
|
#include "qstr.h"
|
||||||
#include "obj.h"
|
#include "obj.h"
|
||||||
|
#include "parsenum.h"
|
||||||
#include "runtime0.h"
|
#include "runtime0.h"
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
|
|
||||||
@ -36,15 +37,20 @@ STATIC mp_obj_t complex_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const
|
|||||||
return mp_obj_new_complex(0, 0);
|
return mp_obj_new_complex(0, 0);
|
||||||
|
|
||||||
case 1:
|
case 1:
|
||||||
// TODO allow string as first arg and parse it
|
if (MP_OBJ_IS_STR(args[0])) {
|
||||||
if (MP_OBJ_IS_TYPE(args[0], &mp_type_complex)) {
|
// a string, parse it
|
||||||
|
uint l;
|
||||||
|
const char *s = mp_obj_str_get_data(args[0], &l);
|
||||||
|
return mp_parse_num_decimal(s, l, true, true);
|
||||||
|
} else if (MP_OBJ_IS_TYPE(args[0], &mp_type_complex)) {
|
||||||
|
// a complex, just return it
|
||||||
return args[0];
|
return args[0];
|
||||||
} else {
|
} else {
|
||||||
|
// something else, try to cast it to a complex
|
||||||
return mp_obj_new_complex(mp_obj_get_float(args[0]), 0);
|
return mp_obj_new_complex(mp_obj_get_float(args[0]), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
case 2:
|
case 2: {
|
||||||
{
|
|
||||||
mp_float_t real, imag;
|
mp_float_t real, imag;
|
||||||
if (MP_OBJ_IS_TYPE(args[0], &mp_type_complex)) {
|
if (MP_OBJ_IS_TYPE(args[0], &mp_type_complex)) {
|
||||||
mp_obj_complex_get(args[0], &real, &imag);
|
mp_obj_complex_get(args[0], &real, &imag);
|
||||||
|
@ -38,10 +38,12 @@ STATIC mp_obj_t float_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const m
|
|||||||
// a string, parse it
|
// a string, parse it
|
||||||
uint l;
|
uint l;
|
||||||
const char *s = mp_obj_str_get_data(args[0], &l);
|
const char *s = mp_obj_str_get_data(args[0], &l);
|
||||||
return mp_parse_num_decimal(s, l, false);
|
return mp_parse_num_decimal(s, l, false, false);
|
||||||
} else if (MP_OBJ_IS_TYPE(args[0], &mp_type_float)) {
|
} else if (MP_OBJ_IS_TYPE(args[0], &mp_type_float)) {
|
||||||
|
// a float, just return it
|
||||||
return args[0];
|
return args[0];
|
||||||
} else {
|
} else {
|
||||||
|
// something else, try to cast it to a float
|
||||||
return mp_obj_new_float(mp_obj_get_float(args[0]));
|
return mp_obj_new_float(mp_obj_get_float(args[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -88,7 +88,7 @@ mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base) {
|
|||||||
#define PARSE_DEC_IN_FRAC (2)
|
#define PARSE_DEC_IN_FRAC (2)
|
||||||
#define PARSE_DEC_IN_EXP (3)
|
#define PARSE_DEC_IN_EXP (3)
|
||||||
|
|
||||||
mp_obj_t mp_parse_num_decimal(const char *str, uint len, bool allow_imag) {
|
mp_obj_t mp_parse_num_decimal(const char *str, uint len, bool allow_imag, bool force_complex) {
|
||||||
#if MICROPY_ENABLE_FLOAT
|
#if MICROPY_ENABLE_FLOAT
|
||||||
const char *top = str + len;
|
const char *top = str + len;
|
||||||
mp_float_t dec_val = 0;
|
mp_float_t dec_val = 0;
|
||||||
@ -129,7 +129,7 @@ mp_obj_t mp_parse_num_decimal(const char *str, uint len, bool allow_imag) {
|
|||||||
dec_val = MICROPY_FLOAT_C_FUN(nan)("");
|
dec_val = MICROPY_FLOAT_C_FUN(nan)("");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// parse the digits
|
// string should be a decimal number
|
||||||
int in = PARSE_DEC_IN_INTG;
|
int in = PARSE_DEC_IN_INTG;
|
||||||
bool exp_neg = false;
|
bool exp_neg = false;
|
||||||
int exp_val = 0;
|
int exp_val = 0;
|
||||||
@ -198,6 +198,8 @@ mp_obj_t mp_parse_num_decimal(const char *str, uint len, bool allow_imag) {
|
|||||||
// return the object
|
// return the object
|
||||||
if (imag) {
|
if (imag) {
|
||||||
return mp_obj_new_complex(0, dec_val);
|
return mp_obj_new_complex(0, dec_val);
|
||||||
|
} else if (force_complex) {
|
||||||
|
return mp_obj_new_complex(dec_val, 0);
|
||||||
} else {
|
} else {
|
||||||
return mp_obj_new_float(dec_val);
|
return mp_obj_new_float(dec_val);
|
||||||
}
|
}
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base);
|
mp_obj_t mp_parse_num_integer(const char *restrict str, uint len, int base);
|
||||||
mp_obj_t mp_parse_num_decimal(const char *str, uint len, bool allow_imag);
|
mp_obj_t mp_parse_num_decimal(const char *str, uint len, bool allow_imag, bool force_complex);
|
||||||
|
@ -375,7 +375,7 @@ mp_obj_t rt_load_const_dec(qstr qstr) {
|
|||||||
DEBUG_OP_printf("load '%s'\n", qstr_str(qstr));
|
DEBUG_OP_printf("load '%s'\n", qstr_str(qstr));
|
||||||
uint len;
|
uint len;
|
||||||
const byte* data = qstr_data(qstr, &len);
|
const byte* data = qstr_data(qstr, &len);
|
||||||
return mp_parse_num_decimal((const char*)data, len, true);
|
return mp_parse_num_decimal((const char*)data, len, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
mp_obj_t rt_load_const_str(qstr qstr) {
|
mp_obj_t rt_load_const_str(qstr qstr) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user