diff options
Diffstat (limited to 'py/objstr.c')
-rw-r--r-- | py/objstr.c | 46 |
1 files changed, 27 insertions, 19 deletions
diff --git a/py/objstr.c b/py/objstr.c index 7de42b6e9e..b9ca8a8ab7 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -214,25 +214,6 @@ STATIC const byte *find_subbytes(const byte *haystack, machine_uint_t hlen, cons STATIC mp_obj_t str_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) { GET_STR_DATA_LEN(lhs_in, lhs_data, lhs_len); switch (op) { - case MP_BINARY_OP_SUBSCR: { -#if MICROPY_ENABLE_SLICE - if (MP_OBJ_IS_TYPE(rhs_in, &mp_type_slice)) { - machine_uint_t start, stop; - if (!m_seq_get_fast_slice_indexes(lhs_len, rhs_in, &start, &stop)) { - assert(0); - } - return mp_obj_new_str(lhs_data + start, stop - start, false); - } -#endif - mp_obj_type_t *type = mp_obj_get_type(lhs_in); - uint index = mp_get_index(type, lhs_len, rhs_in, false); - if (type == &mp_type_bytes) { - return MP_OBJ_NEW_SMALL_INT((mp_small_int_t)lhs_data[index]); - } else { - return mp_obj_new_str(lhs_data + index, 1, true); - } - } - case MP_BINARY_OP_ADD: case MP_BINARY_OP_INPLACE_ADD: if (MP_OBJ_IS_STR(rhs_in)) { @@ -307,6 +288,31 @@ STATIC mp_obj_t str_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) { return MP_OBJ_NULL; // op not supported } +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_ENABLE_SLICE + if (MP_OBJ_IS_TYPE(index, &mp_type_slice)) { + machine_uint_t start, stop; + if (!m_seq_get_fast_slice_indexes(self_len, index, &start, &stop)) { + assert(0); + } + return mp_obj_new_str(self_data + start, stop - start, false); + } +#endif + mp_obj_type_t *type = mp_obj_get_type(self_in); + uint index_val = mp_get_index(type, self_len, index, false); + if (type == &mp_type_bytes) { + return MP_OBJ_NEW_SMALL_INT((mp_small_int_t)self_data[index_val]); + } else { + return mp_obj_new_str(self_data + index_val, 1, true); + } + } else { + return MP_OBJ_NOT_SUPPORTED; + } +} + STATIC mp_obj_t str_join(mp_obj_t self_in, mp_obj_t arg) { assert(MP_OBJ_IS_STR(self_in)); @@ -1380,6 +1386,7 @@ const mp_obj_type_t mp_type_str = { .print = str_print, .make_new = str_make_new, .binary_op = str_binary_op, + .subscr = str_subscr, .getiter = mp_obj_new_str_iterator, .buffer_p = { .get_buffer = str_get_buffer }, .locals_dict = (mp_obj_t)&str_locals_dict, @@ -1392,6 +1399,7 @@ const mp_obj_type_t mp_type_bytes = { .print = str_print, .make_new = bytes_make_new, .binary_op = str_binary_op, + .subscr = str_subscr, .getiter = mp_obj_new_bytes_iterator, .buffer_p = { .get_buffer = str_get_buffer }, .locals_dict = (mp_obj_t)&str_locals_dict, |