diff options
Diffstat (limited to 'py/objrange.c')
-rw-r--r-- | py/objrange.c | 77 |
1 files changed, 45 insertions, 32 deletions
diff --git a/py/objrange.c b/py/objrange.c index 64d92457b7..45f83580d1 100644 --- a/py/objrange.c +++ b/py/objrange.c @@ -5,38 +5,7 @@ #include "mpconfig.h" #include "qstr.h" #include "obj.h" - -/******************************************************************************/ -/* range */ - -typedef struct _mp_obj_range_t { - mp_obj_base_t base; - // TODO make these values generic objects or something - machine_int_t start; - machine_int_t stop; - machine_int_t step; -} mp_obj_range_t; - -STATIC mp_obj_t range_getiter(mp_obj_t o_in) { - mp_obj_range_t *o = o_in; - return mp_obj_new_range_iterator(o->start, o->stop, o->step); -} - -STATIC const mp_obj_type_t range_type = { - { &mp_type_type} , - .name = MP_QSTR_range, - .getiter = range_getiter, -}; - -// range is a class and instances are immutable sequence objects -mp_obj_t mp_obj_new_range(int start, int stop, int step) { - mp_obj_range_t *o = m_new_obj(mp_obj_range_t); - o->base.type = &range_type; - o->start = start; - o->stop = stop; - o->step = step; - return o; -} +#include "runtime.h" /******************************************************************************/ /* range iterator */ @@ -75,3 +44,47 @@ mp_obj_t mp_obj_new_range_iterator(int cur, int stop, int step) { o->step = step; return o; } + +/******************************************************************************/ +/* range */ + +typedef struct _mp_obj_range_t { + mp_obj_base_t base; + // TODO make these values generic objects or something + machine_int_t start; + machine_int_t stop; + machine_int_t step; +} mp_obj_range_t; + +STATIC mp_obj_t range_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_obj_t *args) { + mp_check_nargs(n_args, 1, 3, n_kw, false); + + mp_obj_range_t *o = m_new_obj(mp_obj_range_t); + o->base.type = &mp_type_range; + o->start = 0; + o->step = 1; + + if (n_args == 1) { + o->stop = mp_obj_get_int(args[0]); + } else { + o->start = mp_obj_get_int(args[0]); + o->stop = mp_obj_get_int(args[1]); + if (n_args == 3) { + o->step = mp_obj_get_int(args[2]); + } + } + + return o; +} + +STATIC mp_obj_t range_getiter(mp_obj_t o_in) { + mp_obj_range_t *o = o_in; + return mp_obj_new_range_iterator(o->start, o->stop, o->step); +} + +const mp_obj_type_t mp_type_range = { + { &mp_type_type }, + .name = MP_QSTR_range, + .make_new = range_make_new, + .getiter = range_getiter, +}; |