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:
parent
98adccf7ac
commit
1c6de11f77
5
py/obj.h
5
py/obj.h
@ -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
59
py/objslice.c
Normal 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
|
@ -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 \
|
||||||
|
@ -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 \
|
||||||
|
@ -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 \
|
||||||
|
Loading…
Reference in New Issue
Block a user