diff options
author | Damien George <damien.p.george@gmail.com> | 2017-01-17 15:27:37 +1100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2017-02-16 18:38:06 +1100 |
commit | 088740ecc40476fd0796a3ef6a68ee7c677eae64 (patch) | |
tree | 97284e7a795fbf6e0a196bbe56234d7fff5fc74b /py/nativeglue.c | |
parent | 6e769da0da2ae24cbdab50c57f0d088e137146e3 (diff) | |
download | micropython-088740ecc40476fd0796a3ef6a68ee7c677eae64.tar.gz micropython-088740ecc40476fd0796a3ef6a68ee7c677eae64.zip |
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.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/py/nativeglue.c b/py/nativeglue.c index 5db63080b4..694dfca74a 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, |