aboutsummaryrefslogtreecommitdiff
path: root/py/nativeglue.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2017-01-17 15:27:37 +1100
committerDamien George <damien.p.george@gmail.com>2017-02-16 18:38:06 +1100
commit088740ecc40476fd0796a3ef6a68ee7c677eae64 (patch)
tree97284e7a795fbf6e0a196bbe56234d7fff5fc74b /py/nativeglue.c
parent6e769da0da2ae24cbdab50c57f0d088e137146e3 (diff)
py: Optimise storage of iterator so it takes only 4 slots on Py stack.
Diffstat (limited to 'py/nativeglue.c')
-rw-r--r--py/nativeglue.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/py/nativeglue.c b/py/nativeglue.c
index 5db63080b..694dfca74 100644
--- a/py/nativeglue.c
+++ b/py/nativeglue.c
@@ -98,6 +98,32 @@ void mp_native_raise(mp_obj_t o) {
}
}
+// wrapper that handles iterator buffer
+STATIC mp_obj_t mp_native_getiter(mp_obj_t obj, mp_obj_iter_buf_t *iter) {
+ if (iter == NULL) {
+ return mp_getiter(obj, NULL);
+ } else {
+ obj = mp_getiter(obj, iter);
+ if (obj != MP_OBJ_FROM_PTR(iter)) {
+ // Iterator didn't use the stack so indicate that with MP_OBJ_NULL.
+ iter->base.type = MP_OBJ_NULL;
+ iter->buf[0] = obj;
+ }
+ return NULL;
+ }
+}
+
+// wrapper that handles iterator buffer
+STATIC mp_obj_t mp_native_iternext(mp_obj_iter_buf_t *iter) {
+ mp_obj_t obj;
+ if (iter->base.type == MP_OBJ_NULL) {
+ obj = iter->buf[0];
+ } else {
+ obj = MP_OBJ_FROM_PTR(iter);
+ }
+ return mp_iternext(obj);
+}
+
// these must correspond to the respective enum in runtime0.h
void *const mp_fun_table[MP_F_NUMBER_OF] = {
mp_convert_obj_to_native,
@@ -127,8 +153,8 @@ void *const mp_fun_table[MP_F_NUMBER_OF] = {
mp_native_call_function_n_kw,
mp_call_method_n_kw,
mp_call_method_n_kw_var,
- mp_getiter,
- mp_iternext,
+ mp_native_getiter,
+ mp_native_iternext,
nlr_push,
nlr_pop,
mp_native_raise,