summaryrefslogtreecommitdiffstatshomepage
path: root/py/objrange.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/objrange.c')
-rw-r--r--py/objrange.c77
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,
+};