summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--py/mpconfig.h6
-rw-r--r--py/objrange.c17
-rw-r--r--py/qstrdefs.h5
-rw-r--r--tests/basics/builtin_range.py5
4 files changed, 33 insertions, 0 deletions
diff --git a/py/mpconfig.h b/py/mpconfig.h
index 26d2287855..bfa4121677 100644
--- a/py/mpconfig.h
+++ b/py/mpconfig.h
@@ -382,6 +382,12 @@ typedef double mp_float_t;
#define MICROPY_PY_BUILTINS_PROPERTY (1)
#endif
+// Whether to implement the start/stop/step attributes (readback) on
+// the "range" builtin type. Rarely used, and costs ~60 bytes (x86).
+#ifndef MICROPY_PY_BUILTINS_RANGE_ATTRS
+#define MICROPY_PY_BUILTINS_RANGE_ATTRS (1)
+#endif
+
// Whether to support complete set of special methods
// for user classes, otherwise only the most used
#ifndef MICROPY_PY_ALL_SPECIAL_METHODS
diff --git a/py/objrange.c b/py/objrange.c
index cc32701597..ff62cc5b81 100644
--- a/py/objrange.c
+++ b/py/objrange.c
@@ -166,6 +166,20 @@ STATIC mp_obj_t range_getiter(mp_obj_t o_in) {
return mp_obj_new_range_iterator(o->start, o->stop, o->step);
}
+
+#if MICROPY_PY_BUILTINS_RANGE_ATTRS
+STATIC void range_load_attr(mp_obj_t o_in, qstr attr, mp_obj_t *dest) {
+ mp_obj_range_t *o = o_in;
+ if (attr == MP_QSTR_start) {
+ dest[0] = mp_obj_new_int(o->start);
+ } else if (attr == MP_QSTR_stop) {
+ dest[0] = mp_obj_new_int(o->stop);
+ } else if (attr == MP_QSTR_step) {
+ dest[0] = mp_obj_new_int(o->step);
+ }
+}
+#endif
+
const mp_obj_type_t mp_type_range = {
{ &mp_type_type },
.name = MP_QSTR_range,
@@ -174,4 +188,7 @@ const mp_obj_type_t mp_type_range = {
.unary_op = range_unary_op,
.subscr = range_subscr,
.getiter = range_getiter,
+#if MICROPY_PY_BUILTINS_RANGE_ATTRS
+ .load_attr = range_load_attr,
+#endif
};
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index 88c0d5a3ef..63112e6c70 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -245,6 +245,11 @@ Q(single)
Q(sep)
Q(end)
+#if MICROPY_PY_BUILTINS_RANGE_ATTRS
+Q(step)
+Q(stop)
+#endif
+
Q(clear)
Q(copy)
Q(fromkeys)
diff --git a/tests/basics/builtin_range.py b/tests/basics/builtin_range.py
index 0c0110c269..25f8b84fe5 100644
--- a/tests/basics/builtin_range.py
+++ b/tests/basics/builtin_range.py
@@ -24,3 +24,8 @@ print(range(4)[1:2])
print(range(4)[1:3])
print(range(4)[1::2])
print(range(4)[1:-2:2])
+
+# attrs
+print(range(1, 2, 3).start)
+print(range(1, 2, 3).stop)
+print(range(1, 2, 3).step)