summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-04-19 20:06:57 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-04-19 20:06:57 +0300
commitd6e12723edd40ce80bbaf49d11fd978b248b4dfc (patch)
treec34ac9869f7ab6e63f9aab66723f8cca84bb5867
parent9ae09124963e91bda6b6b8ed4ac993eecc409d47 (diff)
downloadmicropython-d6e12723edd40ce80bbaf49d11fd978b248b4dfc.tar.gz
micropython-d6e12723edd40ce80bbaf49d11fd978b248b4dfc.zip
objarray: Implement slice subscription.
-rw-r--r--py/objarray.c27
-rw-r--r--tests/basics/bytearray1.py4
2 files changed, 24 insertions, 7 deletions
diff --git a/py/objarray.c b/py/objarray.c
index 2255e29d7b..7b578add77 100644
--- a/py/objarray.c
+++ b/py/objarray.c
@@ -139,14 +139,27 @@ STATIC mp_obj_t array_subscr(mp_obj_t self_in, mp_obj_t index_in, mp_obj_t value
return MP_OBJ_NOT_SUPPORTED;
} else {
mp_obj_array_t *o = self_in;
- uint index = mp_get_index(o->base.type, o->len, index_in, false);
- if (value == MP_OBJ_SENTINEL) {
- // load
- return mp_binary_get_val_array(o->typecode, o->items, index);
+ if (MP_OBJ_IS_TYPE(index_in, &mp_type_slice)) {
+ machine_uint_t start, stop;
+ if (!m_seq_get_fast_slice_indexes(o->len, index_in, &start, &stop)) {
+ assert(0);
+ }
+ mp_obj_array_t *res = array_new(o->typecode, stop - start);
+ int sz = mp_binary_get_size('@', o->typecode, NULL);
+ assert(sz > 0);
+ byte *p = o->items;
+ memcpy(res->items, p + start * sz, (stop - start) * sz);
+ return res;
} else {
- // store
- mp_binary_set_val_array(o->typecode, o->items, index, value);
- return mp_const_none;
+ uint index = mp_get_index(o->base.type, o->len, index_in, false);
+ if (value == MP_OBJ_SENTINEL) {
+ // load
+ return mp_binary_get_val_array(o->typecode, o->items, index);
+ } else {
+ // store
+ mp_binary_set_val_array(o->typecode, o->items, index, value);
+ return mp_const_none;
+ }
}
}
}
diff --git a/tests/basics/bytearray1.py b/tests/basics/bytearray1.py
index e564165b9f..02066cafc3 100644
--- a/tests/basics/bytearray1.py
+++ b/tests/basics/bytearray1.py
@@ -13,3 +13,7 @@ s = 0
for i in a:
s += i
print(s)
+
+print(a[1:])
+print(a[:-1])
+print(a[2:3])