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.
This commit is contained in:
Paul Sokolovsky 2014-01-03 02:41:17 +02:00
parent 98adccf7ac
commit 1c6de11f77
5 changed files with 67 additions and 0 deletions

View File

@ -144,6 +144,7 @@ mp_obj_t mp_obj_new_list(uint n, mp_obj_t *items);
mp_obj_t mp_obj_new_list_reverse(uint n, mp_obj_t *items); mp_obj_t mp_obj_new_list_reverse(uint n, mp_obj_t *items);
mp_obj_t mp_obj_new_dict(int n_args); mp_obj_t mp_obj_new_dict(int n_args);
mp_obj_t mp_obj_new_set(int n_args, mp_obj_t *items); mp_obj_t mp_obj_new_set(int n_args, mp_obj_t *items);
mp_obj_t mp_obj_new_slice(mp_obj_t start, mp_obj_t stop, mp_obj_t step);
mp_obj_t mp_obj_new_bound_meth(mp_obj_t self, mp_obj_t meth); mp_obj_t mp_obj_new_bound_meth(mp_obj_t self, mp_obj_t meth);
mp_obj_t mp_obj_new_class(struct _mp_map_t *class_locals); mp_obj_t mp_obj_new_class(struct _mp_map_t *class_locals);
mp_obj_t mp_obj_new_instance(mp_obj_t clas); mp_obj_t mp_obj_new_instance(mp_obj_t clas);
@ -214,6 +215,10 @@ mp_obj_t mp_obj_dict_store(mp_obj_t self_in, mp_obj_t key, mp_obj_t value);
// set // set
void mp_obj_set_store(mp_obj_t self_in, mp_obj_t item); void mp_obj_set_store(mp_obj_t self_in, mp_obj_t item);
// slice
extern const mp_obj_type_t slice_type;
void mp_obj_slice_get(mp_obj_t self_in, machine_int_t *start, machine_int_t *stop, machine_int_t *step);
// functions // functions
typedef struct _mp_obj_fun_native_t { // need this so we can define const objects (to go in ROM) typedef struct _mp_obj_fun_native_t { // need this so we can define const objects (to go in ROM)
mp_obj_base_t base; mp_obj_base_t base;

59
py/objslice.c Normal file
View File

@ -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

View File

@ -78,6 +78,7 @@ PY_O = \
objnone.o \ objnone.o \
objrange.o \ objrange.o \
objset.o \ objset.o \
objslice.o \
objstr.o \ objstr.o \
objtuple.o \ objtuple.o \
objtype.o \ objtype.o \

View File

@ -43,6 +43,7 @@ PY_O = \
objnone.o \ objnone.o \
objrange.o \ objrange.o \
objset.o \ objset.o \
objslice.o \
objstr.o \ objstr.o \
objtuple.o \ objtuple.o \
objtype.o \ objtype.o \

View File

@ -50,6 +50,7 @@ PY_O = \
objnone.o \ objnone.o \
objrange.o \ objrange.o \
objset.o \ objset.o \
objslice.o \
objstr.o \ objstr.o \
objtuple.o \ objtuple.o \
objtype.o \ objtype.o \