summaryrefslogtreecommitdiff
path: root/py/objfun.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2015-03-18 17:47:47 +0000
committerDamien George <damien.p.george@gmail.com>2015-11-13 12:49:18 +0000
commit9b7f583b0ca37ee87e5fb82e2d65fcd96a609b2f (patch)
tree7e061a768312190c62c1fb400619ca59c2f92f70 /py/objfun.c
parentf882d53fcd4ba9775409c994cbf183770963b37e (diff)
py: Reorganise bytecode layout so it's more structured, easier to edit.
Diffstat (limited to 'py/objfun.c')
-rw-r--r--py/objfun.c33
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