diff options
Diffstat (limited to 'py')
-rw-r--r-- | py/argcheck.c | 8 | ||||
-rw-r--r-- | py/objenumerate.c | 25 | ||||
-rw-r--r-- | py/qstrdefs.h | 2 | ||||
-rw-r--r-- | py/runtime.h | 3 |
4 files changed, 29 insertions, 9 deletions
diff --git a/py/argcheck.c b/py/argcheck.c index 40c0cefb7a..8343d7b279 100644 --- a/py/argcheck.c +++ b/py/argcheck.c @@ -104,8 +104,14 @@ void mp_arg_parse_all(uint n_pos, const mp_obj_t *pos, mp_map_t *kws, uint n_all } } +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); +} + #if MICROPY_CPYTHON_COMPAT -void mp_arg_error_unimpl_kw() { +NORETURN void mp_arg_error_unimpl_kw(void) { nlr_raise(mp_obj_new_exception_msg(&mp_type_NotImplementedError, "keyword argument(s) not yet implemented - use normal args instead")); } diff --git a/py/objenumerate.c b/py/objenumerate.c index 78169b31c4..7d9ea9915a 100644 --- a/py/objenumerate.c +++ b/py/objenumerate.c @@ -41,19 +41,30 @@ typedef struct _mp_obj_enumerate_t { STATIC mp_obj_t enumerate_iternext(mp_obj_t self_in); +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) { - /* TODO: enumerate is one of the ones that can take args or kwargs. - Sticking to args for now */ #if MICROPY_CPYTHON_COMPAT - if (n_kw != 0) { - mp_arg_error_unimpl_kw(); - } -#endif - 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(vals[0].u_obj); + o->cur = vals[1].u_int; +#else 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; +#endif + return o; } diff --git a/py/qstrdefs.h b/py/qstrdefs.h index 0ffc6c902d..42ae7038d1 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 beb687e847..910a485446 100644 --- a/py/runtime.h +++ b/py/runtime.h @@ -56,7 +56,8 @@ 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); -NORETURN void mp_arg_error_unimpl_kw(); +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); +NORETURN void mp_arg_error_unimpl_kw(void); mp_obj_dict_t *mp_locals_get(void); void mp_locals_set(mp_obj_dict_t *d); |