summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-01-21 02:22:02 +0200
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-01-21 02:25:59 +0200
commit7380a837802b4630bdcef6e01cd5be32f92750ca (patch)
tree8a26b5e0ab0581819d7d57e91992b7347103627d
parent545591a696bdff73f68573c54a05ca70eb58032d (diff)
str: Implement proper string (instead of byte string) indexing.
Also, support negative indexes.
-rw-r--r--py/objstr.c5
-rw-r--r--tests/basics/string1.py11
2 files changed, 13 insertions, 3 deletions
diff --git a/py/objstr.c b/py/objstr.c
index 01de5e367..4adfef6f8 100644
--- a/py/objstr.c
+++ b/py/objstr.c
@@ -44,9 +44,8 @@ mp_obj_t str_binary_op(int op, mp_obj_t lhs_in, mp_obj_t 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
- // TODO: Handle negative indexes.
- return mp_obj_new_int(lhs_str[mp_obj_get_int(rhs_in)]);
+ uint index = mp_get_index(lhs->base.type, strlen(lhs_str), rhs_in);
+ return mp_obj_new_str(qstr_from_strn_copy(lhs_str + index, 1));
#if MICROPY_ENABLE_SLICE
} else if (MP_OBJ_IS_TYPE(rhs_in, &slice_type)) {
machine_int_t start, stop, step;
diff --git a/tests/basics/string1.py b/tests/basics/string1.py
index 40e766b59..074b04ef8 100644
--- a/tests/basics/string1.py
+++ b/tests/basics/string1.py
@@ -10,6 +10,17 @@ print('123' + "456")
print('123' * 5)
+print('abc'[1])
+print('abc'[-1])
+try:
+ 'abc'[100]
+except IndexError:
+ print('caught')
+try:
+ 'abc'[-4]
+except IndexError:
+ print('caught2')
+
# iter
print(list('str'))