summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--py/argcheck.c6
-rw-r--r--py/objenumerate.c19
-rw-r--r--py/qstrdefs.h2
-rw-r--r--py/runtime.h1
-rw-r--r--stmhal/extint.c4
-rw-r--r--tests/basics/enumerate.py4
6 files changed, 28 insertions, 8 deletions
diff --git a/py/argcheck.c b/py/argcheck.c
index 924a60c45..bb26bd3ae 100644
--- a/py/argcheck.c
+++ b/py/argcheck.c
@@ -103,3 +103,9 @@ void mp_arg_parse_all(uint n_pos, const mp_obj_t *pos, mp_map_t *kws, uint n_all
nlr_raise(mp_obj_new_exception_msg(&mp_type_TypeError, "extra keyword arguments given"));
}
}
+
+void mp_arg_parse_all_kw_array(uint n_pos, uint n_kw, const mp_obj_t *args, uint n_allowed, const mp_arg_t *allowed, mp_arg_val_t *out_vals) {
+ mp_map_t kw_args;
+ mp_map_init_fixed_table(&kw_args, n_kw, args + n_pos);
+ mp_arg_parse_all(n_pos, args, &kw_args, n_allowed, allowed, out_vals);
+}
diff --git a/py/objenumerate.c b/py/objenumerate.c
index fd428da4e..611b9b52e 100644
--- a/py/objenumerate.c
+++ b/py/objenumerate.c
@@ -41,14 +41,23 @@ typedef struct _mp_obj_enumerate_t {
STATIC mp_obj_t enumerate_iternext(mp_obj_t self_in);
-/* TODO: enumerate is one of the ones that can take args or kwargs.
- Sticking to args for now */
+STATIC const mp_arg_t enumerate_make_new_args[] = {
+ { MP_QSTR_iterable, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
+ { MP_QSTR_start, MP_ARG_INT, {.u_int = 0} },
+};
+#define ENUMERATE_MAKE_NEW_NUM_ARGS ARRAY_SIZE(enumerate_make_new_args)
+
STATIC mp_obj_t enumerate_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const mp_obj_t *args) {
- assert(n_args > 0);
+ // parse args
+ mp_arg_val_t vals[ENUMERATE_MAKE_NEW_NUM_ARGS];
+ mp_arg_parse_all_kw_array(n_args, n_kw, args, ENUMERATE_MAKE_NEW_NUM_ARGS, enumerate_make_new_args, vals);
+
+ // create enumerate object
mp_obj_enumerate_t *o = m_new_obj(mp_obj_enumerate_t);
o->base.type = &mp_type_enumerate;
- o->iter = mp_getiter(args[0]);
- o->cur = n_args > 1 ? mp_obj_get_int(args[1]) : 0;
+ o->iter = mp_getiter(vals[0].u_obj);
+ o->cur = vals[1].u_int;
+
return o;
}
diff --git a/py/qstrdefs.h b/py/qstrdefs.h
index 0ffc6c902..42ae7038d 100644
--- a/py/qstrdefs.h
+++ b/py/qstrdefs.h
@@ -238,6 +238,8 @@ Q(startswith)
Q(replace)
Q(partition)
Q(rpartition)
+Q(iterable)
+Q(start)
Q(bound_method)
Q(closure)
diff --git a/py/runtime.h b/py/runtime.h
index 46be12dec..719481264 100644
--- a/py/runtime.h
+++ b/py/runtime.h
@@ -56,6 +56,7 @@ void mp_deinit(void);
void mp_arg_check_num(uint n_args, uint n_kw, uint n_args_min, uint n_args_max, bool takes_kw);
void mp_arg_parse_all(uint n_pos, const mp_obj_t *pos, mp_map_t *kws, uint n_allowed, const mp_arg_t *allowed, mp_arg_val_t *out_vals);
+void mp_arg_parse_all_kw_array(uint n_pos, uint n_kw, const mp_obj_t *args, uint n_allowed, const mp_arg_t *allowed, mp_arg_val_t *out_vals);
mp_obj_dict_t *mp_locals_get(void);
void mp_locals_set(mp_obj_dict_t *d);
diff --git a/stmhal/extint.c b/stmhal/extint.c
index 8041af202..24d51ffb8 100644
--- a/stmhal/extint.c
+++ b/stmhal/extint.c
@@ -302,10 +302,8 @@ STATIC mp_obj_t extint_make_new(mp_obj_t type_in, uint n_args, uint n_kw, const
// type_in == extint_obj_type
// parse args
- mp_map_t kw_args;
- mp_map_init_fixed_table(&kw_args, n_kw, args + n_args);
mp_arg_val_t vals[PYB_EXTINT_MAKE_NEW_NUM_ARGS];
- mp_arg_parse_all(n_args, args, &kw_args, PYB_EXTINT_MAKE_NEW_NUM_ARGS, pyb_extint_make_new_args, vals);
+ mp_arg_parse_all_kw_array(n_args, n_kw, args, PYB_EXTINT_MAKE_NEW_NUM_ARGS, pyb_extint_make_new_args, vals);
extint_obj_t *self = m_new_obj(extint_obj_t);
self->base.type = type_in;
diff --git a/tests/basics/enumerate.py b/tests/basics/enumerate.py
index da97f4601..88747557a 100644
--- a/tests/basics/enumerate.py
+++ b/tests/basics/enumerate.py
@@ -4,3 +4,7 @@ print(list(enumerate([1, 2, 3], 5)))
print(list(enumerate([1, 2, 3], -5)))
print(list(enumerate(range(1000))))
+# specifying args with keywords
+print(list(enumerate([1, 2, 3], start=1)))
+print(list(enumerate(iterable=[1, 2, 3])))
+print(list(enumerate(iterable=[1, 2, 3], start=1)))