aboutsummaryrefslogtreecommitdiff
path: root/py/objslice.c
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-01-03 02:41:17 +0200
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-01-04 02:35:48 +0200
commit1c6de11f772afae9b4155f8a654cadd05125a2de (patch)
tree91773ad883e3ab1ccf513a5f9b2233461f295572 /py/objslice.c
parent98adccf7acb52a0cf9169a78e3af1a8958f7ab36 (diff)
Add basic implementation of slice object.
So far, only start and stop integer indexes are supported. Step is not supported, as well as objects of arbitrary types.
Diffstat (limited to 'py/objslice.c')
-rw-r--r--py/objslice.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/py/objslice.c b/py/objslice.c
new file mode 100644
index 000000000..619899b23
--- /dev/null
+++ b/py/objslice.c
@@ -0,0 +1,59 @@
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <assert.h>
+
+#include "nlr.h"
+#include "misc.h"
+#include "mpconfig.h"
+#include "obj.h"
+#include "runtime0.h"
+
+#if MICROPY_ENABLE_SLICE
+
+// TODO: This implements only variant of slice with 2 integer args only.
+// CPython supports 3rd arg (step), plus args can be arbitrary Python objects.
+typedef struct _mp_obj_slice_t {
+ mp_obj_base_t base;
+ machine_int_t start;
+ machine_int_t stop;
+} mp_obj_slice_t;
+
+void slice_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in) {
+ mp_obj_slice_t *o = o_in;
+ print(env, "slice(" INT_FMT ", " INT_FMT ")", o->start, o->stop);
+}
+
+const mp_obj_type_t slice_type = {
+ { &mp_const_type },
+ "slice",
+ slice_print,
+ NULL, // call_n
+ NULL, // unary_op
+ NULL, // binary_op
+ NULL, // getiter
+ NULL, // iternext
+ { { NULL, NULL }, }, // method list
+};
+
+// 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);
+ mp_obj_slice_t *o = m_new(mp_obj_slice_t, 1);
+ o->base.type = &slice_type;
+ o->start = start;
+ o->stop = stop;
+ return (mp_obj_t)o;
+}
+
+void mp_obj_slice_get(mp_obj_t self_in, machine_int_t *start, machine_int_t *stop, machine_int_t *step) {
+ assert(MP_OBJ_IS_TYPE(self_in, &slice_type));
+ mp_obj_slice_t *self = self_in;
+ *start = self->start;
+ *stop = self->stop;
+ *step = 1;
+}
+
+#endif