str: Initial implementation of string slicing.

Only step=1 and non-negative indexes are supported so far.
This commit is contained in:
Paul Sokolovsky 2014-01-03 02:51:16 +02:00
parent ded0a1efa5
commit 31ba60f836
1 changed files with 15 additions and 1 deletions

View File

@ -29,7 +29,21 @@ mp_obj_t str_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
case RT_BINARY_OP_SUBSCR:
// string access
// XXX a massive hack!
return mp_obj_new_int(lhs_str[mp_obj_get_int(rhs_in)]);
// TODO: need predicate to check for int-like type (bools are such for example)
// ["no", "yes"][1 == 2] is common idiom
if (MP_OBJ_IS_SMALL_INT(rhs_in)) {
// TODO: This implements byte string access for single index so far
return mp_obj_new_int(lhs_str[mp_obj_get_int(rhs_in)]);
} else if (MP_OBJ_IS_TYPE(rhs_in, &slice_type)) {
int start, stop, step;
mp_obj_slice_get(rhs_in, &start, &stop, &step);
assert(step == 1);
return mp_obj_new_str(qstr_from_strn_copy(lhs_str + start, stop - start));
} else {
// Throw TypeError here
assert(0);
}
case RT_BINARY_OP_ADD:
case RT_BINARY_OP_INPLACE_ADD: