summaryrefslogtreecommitdiff
path: root/py/modbuiltins.c
diff options
context:
space:
mode:
authorstijn <stijn@ignitron.net>2019-01-03 15:19:42 +0100
committerDamien George <damien.p.george@gmail.com>2019-01-27 13:01:28 +1100
commit42863830be2d19c7dcdf7ccf1fa66168b1bdc13a (patch)
tree7a79ea7a839754ea15f6a98d0273632135cae29c /py/modbuiltins.c
parent51577629b2e91be3ec911167e0bd0311694166db (diff)
py: Add optional support for 2-argument version of built-in next().
Configurable via MICROPY_PY_BUILTINS_NEXT2, disabled by default.
Diffstat (limited to 'py/modbuiltins.c')
-rw-r--r--py/modbuiltins.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/py/modbuiltins.c b/py/modbuiltins.c
index c4de325c1..f0d0421d6 100644
--- a/py/modbuiltins.c
+++ b/py/modbuiltins.c
@@ -316,6 +316,22 @@ MP_DEFINE_CONST_FUN_OBJ_KW(mp_builtin_min_obj, 1, mp_builtin_min);
#endif
+#if MICROPY_PY_BUILTINS_NEXT2
+STATIC mp_obj_t mp_builtin_next(size_t n_args, const mp_obj_t *args) {
+ if (n_args == 1) {
+ mp_obj_t ret = mp_iternext_allow_raise(args[0]);
+ if (ret == MP_OBJ_STOP_ITERATION) {
+ nlr_raise(mp_obj_new_exception(&mp_type_StopIteration));
+ } else {
+ return ret;
+ }
+ } else {
+ mp_obj_t ret = mp_iternext(args[0]);
+ return ret == MP_OBJ_STOP_ITERATION ? args[1] : ret;
+ }
+}
+MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_builtin_next_obj, 1, 2, mp_builtin_next);
+#else
STATIC mp_obj_t mp_builtin_next(mp_obj_t o) {
mp_obj_t ret = mp_iternext_allow_raise(o);
if (ret == MP_OBJ_STOP_ITERATION) {
@@ -325,6 +341,7 @@ STATIC mp_obj_t mp_builtin_next(mp_obj_t o) {
}
}
MP_DEFINE_CONST_FUN_OBJ_1(mp_builtin_next_obj, mp_builtin_next);
+#endif
STATIC mp_obj_t mp_builtin_oct(mp_obj_t o_in) {
#if MICROPY_PY_BUILTINS_STR_OP_MODULO