aboutsummaryrefslogtreecommitdiff
path: root/py/sequence.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-05-25 21:21:57 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-05-25 21:21:57 +0300
commitde4b9329f99794dc2025a7f9aa203811a156b3c4 (patch)
treecda613e8734bd7821f5ab1380558c103e8f2bbcb /py/sequence.c
parentff4b6daa4f446094361c6bd4cfa557f0ad2565fc (diff)
py: Refactor slice helpers, preparing to support arbitrary slicing.
Diffstat (limited to 'py/sequence.c')
-rw-r--r--py/sequence.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/py/sequence.c b/py/sequence.c
index 8418f1ef6..db5eed4c8 100644
--- a/py/sequence.c
+++ b/py/sequence.c
@@ -51,15 +51,10 @@ void mp_seq_multiply(const void *items, uint item_sz, uint len, uint times, void
}
}
-bool mp_seq_get_fast_slice_indexes(machine_uint_t len, mp_obj_t slice, machine_uint_t *begin, machine_uint_t *end) {
+bool mp_seq_get_fast_slice_indexes(machine_uint_t len, mp_obj_t slice, mp_bound_slice_t *indexes) {
mp_obj_t ostart, ostop, ostep;
machine_int_t start, stop;
mp_obj_slice_get(slice, &ostart, &ostop, &ostep);
- if (ostep != mp_const_none && ostep != MP_OBJ_NEW_SMALL_INT(1)) {
- nlr_raise(mp_obj_new_exception_msg(&mp_type_NotImplementedError,
- "Only slices with step=1 (aka None) are supported"));
- return false;
- }
if (ostart == mp_const_none) {
start = 0;
@@ -96,8 +91,16 @@ bool mp_seq_get_fast_slice_indexes(machine_uint_t len, mp_obj_t slice, machine_u
stop = start;
}
- *begin = start;
- *end = stop;
+ indexes->start = start;
+ indexes->stop = stop;
+
+ if (ostep != mp_const_none && ostep != MP_OBJ_NEW_SMALL_INT(1)) {
+ nlr_raise(mp_obj_new_exception_msg(&mp_type_NotImplementedError,
+ "Only slices with step=1 (aka None) are supported"));
+ indexes->step = MP_OBJ_SMALL_INT_VALUE(ostep);
+ return false;
+ }
+ indexes->step = 1;
return true;
}