summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-01-03 23:35:32 +0200
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-01-04 02:35:48 +0200
commit59800afae9f74571eea5bb463a28fd9bd8251150 (patch)
tree74c9537be44992e8d37bb5f6e38fd4b76360667b
parentcd22627f781080fb245dd6999f2158c8099379b0 (diff)
downloadmicropython-59800afae9f74571eea5bb463a28fd9bd8251150.tar.gz
micropython-59800afae9f74571eea5bb463a28fd9bd8251150.zip
slice: Implement special handling of omitted start/stop indexes.
-rw-r--r--py/objslice.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/py/objslice.c b/py/objslice.c
index 619899b232..03607e4c3e 100644
--- a/py/objslice.c
+++ b/py/objslice.c
@@ -39,8 +39,23 @@ const mp_obj_type_t slice_type = {
// TODO: Make sure to handle "empty" values, which are signified by None in CPython
mp_obj_t mp_obj_new_slice(mp_obj_t ostart, mp_obj_t ostop, mp_obj_t ostep) {
assert(ostep == NULL);
- machine_int_t start = mp_obj_get_int(ostart);
- machine_int_t stop = mp_obj_get_int(ostop);
+ machine_int_t start = 0, stop = 0;
+ if (ostart != mp_const_none) {
+ start = mp_obj_get_int(ostart);
+ }
+ if (ostop != mp_const_none) {
+ stop = mp_obj_get_int(ostop);
+ if (stop == 0) {
+ // [x:0] is a special case - in our slice object, stop = 0 means
+ // "end of sequence". Fortunately, [x:0] is an empty seqence for
+ // any x (including negative). [x:x] is also always empty sequence.
+ // but x also can be 0. But note that b""[x:x] is b"" for any x (i.e.
+ // no IndexError, at least in Python 3.3.3). So, we just use -1's to
+ // signify that. -1 is catchy "special" number in case someone will
+ // try to print [x:0] slice ever.
+ start = stop = -1;
+ }
+ }
mp_obj_slice_t *o = m_new(mp_obj_slice_t, 1);
o->base.type = &slice_type;
o->start = start;