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).
This commit is contained in:
parent
5f3fe3aa14
commit
a9ddd6d9df
10
py/obj.c
10
py/obj.c
@ -277,12 +277,10 @@ void mp_obj_get_array_fixed_n(mp_obj_t o, uint len, mp_obj_t **items) {
|
||||
|
||||
// is_slice determines whether the index is a slice index
|
||||
uint mp_get_index(const mp_obj_type_t *type, machine_uint_t len, mp_obj_t index, bool is_slice) {
|
||||
int i;
|
||||
if (MP_OBJ_IS_INT(index)) {
|
||||
i = mp_obj_int_get_checked(index);
|
||||
} else if (MP_OBJ_IS_TYPE(index, &mp_type_bool)) {
|
||||
i = (index == mp_const_true ? 1 : 0);
|
||||
} else {
|
||||
machine_int_t i;
|
||||
if (MP_OBJ_IS_SMALL_INT(index)) {
|
||||
i = MP_OBJ_SMALL_INT_VALUE(index);
|
||||
} else if (!mp_obj_get_int_maybe(index, &i)) {
|
||||
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_TypeError, "%s indices must be integers, not %s", qstr_str(type->name), mp_obj_get_type_str(index)));
|
||||
}
|
||||
|
||||
|
25
py/objstr.c
25
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
|
||||
} 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"));
|
||||
}
|
||||
#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:
|
||||
|
Loading…
Reference in New Issue
Block a user