Skip to content

Commit 71d3112

Browse files
committed
py: Make built-in 'range' a class.
Addresses issue adafruit#487.
1 parent d553be5 commit 71d3112

5 files changed

Lines changed: 47 additions & 47 deletions

File tree

py/builtin.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -362,17 +362,6 @@ STATIC mp_obj_t mp_builtin_print(uint n_args, const mp_obj_t *args, mp_map_t *kw
362362

363363
MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_print_obj, 0, mp_builtin_print);
364364

365-
STATIC mp_obj_t mp_builtin_range(uint n_args, const mp_obj_t *args) {
366-
assert(1 <= n_args && n_args <= 3);
367-
switch (n_args) {
368-
case 1: return mp_obj_new_range(0, mp_obj_get_int(args[0]), 1);
369-
case 2: return mp_obj_new_range(mp_obj_get_int(args[0]), mp_obj_get_int(args[1]), 1);
370-
default: return mp_obj_new_range(mp_obj_get_int(args[0]), mp_obj_get_int(args[1]), mp_obj_get_int(args[2]));
371-
}
372-
}
373-
374-
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_range_obj, 1, 3, mp_builtin_range);
375-
376365
STATIC mp_obj_t mp_builtin_repr(mp_obj_t o_in) {
377366
vstr_t *vstr = vstr_new();
378367
mp_obj_print_helper((void (*)(void *env, const char *fmt, ...))vstr_printf, vstr, o_in, PRINT_REPR);

py/builtin.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ MP_DECLARE_CONST_FUN_OBJ(mp_builtin_oct_obj);
3131
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_ord_obj);
3232
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_pow_obj);
3333
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_print_obj);
34-
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_range_obj);
3534
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_repr_obj);
3635
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_sorted_obj);
3736
MP_DECLARE_CONST_FUN_OBJ(mp_builtin_sum_obj);

py/builtintables.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ STATIC const mp_map_elem_t mp_builtin_object_table[] = {
3434
#if MICROPY_ENABLE_PROPERTY
3535
{ MP_OBJ_NEW_QSTR(MP_QSTR_property), (mp_obj_t)&mp_type_property },
3636
#endif
37+
{ MP_OBJ_NEW_QSTR(MP_QSTR_range), (mp_obj_t)&mp_type_range },
3738
{ MP_OBJ_NEW_QSTR(MP_QSTR_set), (mp_obj_t)&mp_type_set },
3839
{ MP_OBJ_NEW_QSTR(MP_QSTR_str), (mp_obj_t)&mp_type_str },
3940
{ MP_OBJ_NEW_QSTR(MP_QSTR_super), (mp_obj_t)&mp_type_super },
@@ -75,7 +76,6 @@ STATIC const mp_map_elem_t mp_builtin_object_table[] = {
7576
{ MP_OBJ_NEW_QSTR(MP_QSTR_ord), (mp_obj_t)&mp_builtin_ord_obj },
7677
{ MP_OBJ_NEW_QSTR(MP_QSTR_pow), (mp_obj_t)&mp_builtin_pow_obj },
7778
{ MP_OBJ_NEW_QSTR(MP_QSTR_print), (mp_obj_t)&mp_builtin_print_obj },
78-
{ MP_OBJ_NEW_QSTR(MP_QSTR_range), (mp_obj_t)&mp_builtin_range_obj },
7979
{ MP_OBJ_NEW_QSTR(MP_QSTR_repr), (mp_obj_t)&mp_builtin_repr_obj },
8080
{ MP_OBJ_NEW_QSTR(MP_QSTR_sorted), (mp_obj_t)&mp_builtin_sorted_obj },
8181
{ MP_OBJ_NEW_QSTR(MP_QSTR_sum), (mp_obj_t)&mp_builtin_sum_obj },

py/obj.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ extern const mp_obj_type_t mp_type_map; // map (the python builtin, not the dict
272272
extern const mp_obj_type_t mp_type_enumerate;
273273
extern const mp_obj_type_t mp_type_filter;
274274
extern const mp_obj_type_t mp_type_dict;
275+
extern const mp_obj_type_t mp_type_range;
275276
extern const mp_obj_type_t mp_type_set;
276277
extern const mp_obj_type_t mp_type_slice;
277278
extern const mp_obj_type_t mp_type_zip;
@@ -346,8 +347,6 @@ mp_obj_t mp_obj_new_exception(const mp_obj_type_t *exc_type);
346347
mp_obj_t mp_obj_new_exception_args(const mp_obj_type_t *exc_type, uint n_args, const mp_obj_t *args);
347348
mp_obj_t mp_obj_new_exception_msg(const mp_obj_type_t *exc_type, const char *msg);
348349
mp_obj_t mp_obj_new_exception_msg_varg(const mp_obj_type_t *exc_type, const char *fmt, ...); // counts args by number of % symbols in fmt, excluding %%; can only handle void* sizes (ie no float/double!)
349-
mp_obj_t mp_obj_new_range(int start, int stop, int step);
350-
mp_obj_t mp_obj_new_range_iterator(int cur, int stop, int step);
351350
mp_obj_t mp_obj_new_fun_bc(uint scope_flags, qstr *args, uint n_args, mp_obj_t def_args, const byte *code);
352351
mp_obj_t mp_obj_new_fun_asm(uint n_args, void *fun);
353352
mp_obj_t mp_obj_new_gen_wrap(mp_obj_t fun);

py/objrange.c

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,7 @@
55
#include "mpconfig.h"
66
#include "qstr.h"
77
#include "obj.h"
8-
9-
/******************************************************************************/
10-
/* range */
11-
12-
typedef struct _mp_obj_range_t {
13-
mp_obj_base_t base;
14-
// TODO make these values generic objects or something
15-
machine_int_t start;
16-
machine_int_t stop;
17-
machine_int_t step;
18-
} mp_obj_range_t;
19-
20-
STATIC mp_obj_t range_getiter(mp_obj_t o_in) {
21-
mp_obj_range_t *o = o_in;
22-
return mp_obj_new_range_iterator(o->start, o->stop, o->step);
23-
}
24-
25-
STATIC const mp_obj_type_t range_type = {
26-
{ &mp_type_type} ,
27-
.name = MP_QSTR_range,
28-
.getiter = range_getiter,
29-
};
30-
31-
// range is a class and instances are immutable sequence objects
32-
mp_obj_t mp_obj_new_range(int start, int stop, int step) {
33-
mp_obj_range_t *o = m_new_obj(mp_obj_range_t);
34-
o->base.type = &range_type;
35-
o->start = start;
36-
o->stop = stop;
37-
o->step = step;
38-
return o;
39-
}
8+
#include "runtime.h"
409

4110
/******************************************************************************/
4211
/* range iterator */
@@ -75,3 +44,47 @@ mp_obj_t mp_obj_new_range_iterator(int cur, int stop, int step) {
7544
o->step = step;
7645
return o;
7746
}
47+
48+
/******************************************************************************/
49+
/* range */
50+
51+
typedef struct _mp_obj_range_t {
52+
mp_obj_base_t base;
53+
// TODO make these values generic objects or something
54+
machine_int_t start;
55+
machine_int_t stop;
56+
machine_int_t step;
57+
} mp_obj_range_t;
58+
59+
STATIC mp_obj_t range_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_obj_t *args) {
60+
mp_check_nargs(n_args, 1, 3, n_kw, false);
61+
62+
mp_obj_range_t *o = m_new_obj(mp_obj_range_t);
63+
o->base.type = &mp_type_range;
64+
o->start = 0;
65+
o->step = 1;
66+
67+
if (n_args == 1) {
68+
o->stop = mp_obj_get_int(args[0]);
69+
} else {
70+
o->start = mp_obj_get_int(args[0]);
71+
o->stop = mp_obj_get_int(args[1]);
72+
if (n_args == 3) {
73+
o->step = mp_obj_get_int(args[2]);
74+
}
75+
}
76+
77+
return o;
78+
}
79+
80+
STATIC mp_obj_t range_getiter(mp_obj_t o_in) {
81+
mp_obj_range_t *o = o_in;
82+
return mp_obj_new_range_iterator(o->start, o->stop, o->step);
83+
}
84+
85+
const mp_obj_type_t mp_type_range = {
86+
{ &mp_type_type },
87+
.name = MP_QSTR_range,
88+
.make_new = range_make_new,
89+
.getiter = range_getiter,
90+
};

0 commit comments

Comments
 (0)