From a9ddd6d9df97637c944bfc51a66476008a88feb3 Mon Sep 17 00:00:00 2001 From: Damien George Date: Fri, 11 Apr 2014 10:40:38 +0000 Subject: py: Simplify and improve mp_get_index. It has (again) a fast path for ints, and a simplified "slow" path for everything else. Also simplify the way str indexing is done (now matches tuple and list). --- py/objstr.c | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'py/objstr.c') diff --git a/py/objstr.c b/py/objstr.c index 39c24205be..e55a2edd5c 100644 --- a/py/objstr.c +++ b/py/objstr.c @@ -220,27 +220,24 @@ 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 (mp_obj_is_integer(rhs_in)) { - uint index = mp_get_index(mp_obj_get_type(lhs_in), lhs_len, rhs_in, false); - if (MP_OBJ_IS_TYPE(lhs_in, &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_SUBSCR: { #if MICROPY_ENABLE_SLICE - } else if (MP_OBJ_IS_TYPE(rhs_in, &mp_type_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 { - // Message doesn't match CPython, but we don't have so much bytes as they - // to spend them on verbose wording - nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "index must be int")); + return mp_obj_new_str(lhs_data + index, 1, true); } + } case MP_BINARY_OP_ADD: case MP_BINARY_OP_INPLACE_ADD: -- cgit v1.2.3