diff options
Diffstat (limited to 'py/objfun.c')
-rw-r--r-- | py/objfun.c | 33 |
1 files changed, 13 insertions, 20 deletions
diff --git a/py/objfun.c b/py/objfun.c index 774d8e64c..53ddb0a7b 100644 --- a/py/objfun.c +++ b/py/objfun.c @@ -121,8 +121,13 @@ qstr mp_obj_fun_get_name(mp_const_obj_t fun_in) { return MP_QSTR_; } #endif - const byte *code_info = fun->bytecode; - return mp_obj_code_get_name(code_info); + + const byte *bc = fun->bytecode; + mp_decode_uint(&bc); // skip n_state + mp_decode_uint(&bc); // skip n_exc_stack + bc = MP_ALIGN(bc, sizeof(mp_uint_t)); // align + bc += (fun->n_pos_args + fun->n_kwonly_args) * sizeof(mp_uint_t); // skip arg names + return mp_obj_code_get_name(bc); } #if MICROPY_CPYTHON_COMPAT @@ -158,13 +163,8 @@ mp_code_state *mp_obj_fun_bc_prepare_codestate(mp_obj_t self_in, mp_uint_t n_arg MP_STACK_CHECK(); mp_obj_fun_bc_t *self = self_in; - // skip code-info block - const byte *code_info = self->bytecode; - mp_uint_t code_info_size = mp_decode_uint(&code_info); - const byte *ip = self->bytecode + code_info_size; - - // bytecode prelude: skip arg names - ip += (self->n_pos_args + self->n_kwonly_args) * sizeof(mp_obj_t); + // get start of bytecode + const byte *ip = self->bytecode; // bytecode prelude: state size and exception stack size mp_uint_t n_state = mp_decode_uint(&ip); @@ -178,9 +178,8 @@ mp_code_state *mp_obj_fun_bc_prepare_codestate(mp_obj_t self_in, mp_uint_t n_arg return NULL; } + code_state->ip = (byte*)(ip - self->bytecode); // offset to after n_state/n_exc_stack code_state->n_state = n_state; - code_state->code_info = 0; // offset to code-info - code_state->ip = (byte*)(ip - self->bytecode); // offset to prelude mp_setup_code_state(code_state, self_in, n_args, n_kw, args); // execute the byte code with the correct globals context @@ -202,13 +201,8 @@ STATIC mp_obj_t fun_bc_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, mp_obj_fun_bc_t *self = self_in; DEBUG_printf("Func n_def_args: %d\n", self->n_def_args); - // skip code-info block - const byte *code_info = self->bytecode; - mp_uint_t code_info_size = mp_decode_uint(&code_info); - const byte *ip = self->bytecode + code_info_size; - - // bytecode prelude: skip arg names - ip += (self->n_pos_args + self->n_kwonly_args) * sizeof(mp_obj_t); + // get start of bytecode + const byte *ip = self->bytecode; // bytecode prelude: state size and exception stack size mp_uint_t n_state = mp_decode_uint(&ip); @@ -229,9 +223,8 @@ STATIC mp_obj_t fun_bc_call(mp_obj_t self_in, mp_uint_t n_args, mp_uint_t n_kw, state_size = 0; // indicate that we allocated using alloca } + code_state->ip = (byte*)(ip - self->bytecode); // offset to after n_state/n_exc_stack code_state->n_state = n_state; - code_state->code_info = 0; // offset to code-info - code_state->ip = (byte*)(ip - self->bytecode); // offset to prelude mp_setup_code_state(code_state, self_in, n_args, n_kw, args); // execute the byte code with the correct globals context |