diff options
-rw-r--r-- | py/obj.h | 1 | ||||
-rw-r--r-- | py/objfun.c | 18 | ||||
-rw-r--r-- | py/objgenerator.c | 3 |
3 files changed, 17 insertions, 5 deletions
@@ -508,6 +508,7 @@ typedef struct _mp_obj_fun_native_t { // need this so we can define const object bool mp_obj_fun_prepare_simple_args(mp_obj_t self_in, uint n_args, uint n_kw, const mp_obj_t *args, uint *out_args1_len, const mp_obj_t **out_args1, uint *out_args2_len, const mp_obj_t **out_args2); +const char *mp_obj_code_get_name(const byte *code_info); mp_obj_t mp_identity(mp_obj_t self); MP_DECLARE_CONST_FUN_OBJ(mp_identity_obj); diff --git a/py/objfun.c b/py/objfun.c index 94f6d26d7e..7a1c3ff15a 100644 --- a/py/objfun.c +++ b/py/objfun.c @@ -126,12 +126,16 @@ mp_obj_t mp_make_function_var_between(int n_args_min, int n_args_max, mp_fun_var /******************************************************************************/ /* byte code functions */ -const char *mp_obj_fun_get_name(mp_obj_fun_bc_t *o) { - const byte *code_info = o->bytecode; +const char *mp_obj_code_get_name(const byte *code_info) { qstr block_name = code_info[8] | (code_info[9] << 8) | (code_info[10] << 16) | (code_info[11] << 24); return qstr_str(block_name); } +const char *mp_obj_fun_get_name(mp_obj_fun_bc_t *o) { + const byte *code_info = o->bytecode; + return mp_obj_code_get_name(code_info); +} + #if MICROPY_CPYTHON_COMPAT STATIC void fun_bc_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t o_in, mp_print_kind_t kind) { mp_obj_fun_bc_t *o = o_in; @@ -178,6 +182,8 @@ STATIC NORETURN void fun_pos_args_mismatch(mp_obj_fun_bc_t *f, uint expected, ui bool mp_obj_fun_prepare_simple_args(mp_obj_t self_in, uint n_args, uint n_kw, const mp_obj_t *args, uint *out_args1_len, const mp_obj_t **out_args1, uint *out_args2_len, const mp_obj_t **out_args2) { mp_obj_fun_bc_t *self = self_in; + DEBUG_printf("mp_obj_fun_prepare_simple_args: given: %d pos, %d kw, expected: %d pos (%d default)\n", + n_args, n_kw, self->n_pos_args, self->n_def_args); assert(n_kw == 0); assert(self->n_kwonly_args == 0); @@ -190,8 +196,12 @@ bool mp_obj_fun_prepare_simple_args(mp_obj_t self_in, uint n_args, uint n_kw, co if (n_args > self->n_pos_args) { goto arg_error; } else { - extra_args -= self->n_pos_args - n_args; - n_extra_args += self->n_pos_args - n_args; + if (n_args >= self->n_pos_args - self->n_def_args) { + extra_args -= self->n_pos_args - n_args; + n_extra_args += self->n_pos_args - n_args; + } else { + fun_pos_args_mismatch(self, self->n_pos_args - self->n_def_args, n_args); + } } *out_args1 = args; *out_args1_len = n_args; diff --git a/py/objgenerator.c b/py/objgenerator.c index 895c03cc23..d02f838afe 100644 --- a/py/objgenerator.c +++ b/py/objgenerator.c @@ -68,7 +68,8 @@ typedef struct _mp_obj_gen_instance_t { } mp_obj_gen_instance_t; void gen_instance_print(void (*print)(void *env, const char *fmt, ...), void *env, mp_obj_t self_in, mp_print_kind_t kind) { - print(env, "<generator object 'fun-name' at %p>", self_in); + mp_obj_gen_instance_t *self = self_in; + print(env, "<generator object '%s' at %p>", mp_obj_code_get_name(self->code_info), self_in); } mp_obj_t gen_instance_getiter(mp_obj_t self_in) { |