diff options
Diffstat (limited to 'py/objstr.c')
-rw-r--r-- | py/objstr.c | 64 |
1 files changed, 19 insertions, 45 deletions
diff --git a/py/objstr.c b/py/objstr.c index 27f6d9cd6f..9ff9106375 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -348,7 +348,7 @@ STATIC mp_obj_t str_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) { GET_STR_DATA_LEN(self_in, self_data, self_len); if (value == MP_OBJ_SENTINEL) { // load -#if MICROPY_PY_SLICE +#if MICROPY_PY_BUILTINS_SLICE if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) { mp_bound_slice_t slice; if (!mp_seq_get_fast_slice_indexes(self_len, index, &slice)) { @@ -741,14 +741,14 @@ static bool arg_looks_integer(mp_obj_t arg) { static bool arg_looks_numeric(mp_obj_t arg) { return arg_looks_integer(arg) -#if MICROPY_ENABLE_FLOAT +#if MICROPY_PY_BUILTINS_FLOAT || MP_OBJ_IS_TYPE(arg, &mp_type_float) #endif ; } static mp_obj_t arg_as_int(mp_obj_t arg) { -#if MICROPY_ENABLE_FLOAT +#if MICROPY_PY_BUILTINS_FLOAT if (MP_OBJ_IS_TYPE(arg, &mp_type_float)) { // TODO: Needs a way to construct an mpz integer from a float @@ -1066,7 +1066,7 @@ mp_obj_t mp_obj_str_format(uint n_args, const mp_obj_t *args) { flags |= PF_FLAG_PAD_NAN_INF; // '{:06e}'.format(float('-inf')) should give '-00inf' switch (type) { -#if MICROPY_ENABLE_FLOAT +#if MICROPY_PY_BUILTINS_FLOAT case 'e': case 'E': case 'f': @@ -1214,7 +1214,7 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, uint n_args, const mp_obj_t pfenv_print_strn(&pfenv_vstr, &ch, 1, flags, ' ', width); break; } -#if MICROPY_ENABLE_FLOAT +#if MICROPY_PY_BUILTINS_FLOAT // This is what CPython reports, so we report the same. if (MP_OBJ_IS_TYPE(arg, &mp_type_float)) { nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "integer argument expected, got float")); @@ -1230,7 +1230,7 @@ STATIC mp_obj_t str_modulo_format(mp_obj_t pattern, uint n_args, const mp_obj_t pfenv_print_mp_int(&pfenv_vstr, arg_as_int(arg), 1, 10, 'a', flags, fill, width); break; -#if MICROPY_ENABLE_FLOAT +#if MICROPY_PY_BUILTINS_FLOAT case 'e': case 'E': case 'f': @@ -1476,73 +1476,47 @@ STATIC mp_obj_t str_rpartition(mp_obj_t self_in, mp_obj_t arg) { return str_partitioner(self_in, arg, -1); } -enum { CASE_UPPER, CASE_LOWER }; - // Supposedly not too critical operations, so optimize for code size -STATIC mp_obj_t str_caseconv(int op, mp_obj_t self_in) { +STATIC mp_obj_t str_caseconv(unichar (*op)(unichar), mp_obj_t self_in) { GET_STR_DATA_LEN(self_in, self_data, self_len); byte *data; mp_obj_t s = mp_obj_str_builder_start(mp_obj_get_type(self_in), self_len, &data); for (int i = 0; i < self_len; i++) { - if (op == CASE_UPPER) { - *data++ = unichar_toupper(*self_data++); - } else { - *data++ = unichar_tolower(*self_data++); - } + *data++ = op(*self_data++); } *data = 0; return mp_obj_str_builder_end(s); } STATIC mp_obj_t str_lower(mp_obj_t self_in) { - return str_caseconv(CASE_LOWER, self_in); + return str_caseconv(unichar_tolower, self_in); } STATIC mp_obj_t str_upper(mp_obj_t self_in) { - return str_caseconv(CASE_UPPER, self_in); + return str_caseconv(unichar_toupper, self_in); } -enum { IS_SPACE, IS_ALPHA, IS_DIGIT, IS_UPPER, IS_LOWER }; - -STATIC mp_obj_t str_uni_istype(int type, mp_obj_t self_in) { +STATIC mp_obj_t str_uni_istype(bool (*f)(unichar), mp_obj_t self_in) { GET_STR_DATA_LEN(self_in, self_data, self_len); if (self_len == 0) { return mp_const_false; // default to False for empty str } - typedef bool (*check_function)(unichar); - check_function f; - - if (type != IS_UPPER && type != IS_LOWER) { - switch (type) { - case IS_SPACE: f = &unichar_isspace; break; - case IS_ALPHA: f = &unichar_isalpha; break; - case IS_DIGIT: f = &unichar_isdigit; break; - default: - nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "unknown type provided for str_uni_istype")); - } - + if (f != unichar_isupper && f != unichar_islower) { for (int i = 0; i < self_len; i++) { if (!f(*self_data++)) { return mp_const_false; } } } else { - switch (type) { - case IS_UPPER: f = &unichar_isupper; break; - case IS_LOWER: f = &unichar_islower; break; - default: - nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "unknown type provided for str_uni_istype")); - } - bool contains_alpha = false; for (int i = 0; i < self_len; i++) { // only check alphanumeric characters if (unichar_isalpha(*self_data++)) { contains_alpha = true; - if (!f(*(self_data-1))) { - return mp_const_false; // we already incremented + if (!f(*(self_data - 1))) { // -1 because we already incremented above + return mp_const_false; } } } @@ -1556,23 +1530,23 @@ STATIC mp_obj_t str_uni_istype(int type, mp_obj_t self_in) { } STATIC mp_obj_t str_isspace(mp_obj_t self_in) { - return str_uni_istype(IS_SPACE, self_in); + return str_uni_istype(unichar_isspace, self_in); } STATIC mp_obj_t str_isalpha(mp_obj_t self_in) { - return str_uni_istype(IS_ALPHA, self_in); + return str_uni_istype(unichar_isalpha, self_in); } STATIC mp_obj_t str_isdigit(mp_obj_t self_in) { - return str_uni_istype(IS_DIGIT, self_in); + return str_uni_istype(unichar_isdigit, self_in); } STATIC mp_obj_t str_isupper(mp_obj_t self_in) { - return str_uni_istype(IS_UPPER, self_in); + return str_uni_istype(unichar_isupper, self_in); } STATIC mp_obj_t str_islower(mp_obj_t self_in) { - return str_uni_istype(IS_LOWER, self_in); + return str_uni_istype(unichar_islower, self_in); } #if MICROPY_CPYTHON_COMPAT |