aboutsummaryrefslogtreecommitdiff
path: root/py/bc.h
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2022-05-15 13:37:06 +1000
committerDamien George <damien@micropython.org>2022-05-17 14:25:51 +1000
commit1762990579ff8ddc285e24492626fe40b6f2621d (patch)
tree180999f988cc79cebf1c56bfe9a978d4dbe3aaab /py/bc.h
parent8e1db993cd6bca93c031619e05c465f05c48381c (diff)
py/bc: Provide separate code-state setup funcs for bytecode and native.
mpy-cross will now generate native code based on the size of mp_code_state_native_t, and the runtime will use this struct to calculate the offset of the .state field. This makes native code generation and execution (which rely on this struct) independent to the settings MICROPY_STACKLESS and MICROPY_PY_SYS_SETTRACE, both of which change the size of the mp_code_state_t struct. Fixes issue #5059. Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'py/bc.h')
-rw-r--r--py/bc.h12
1 files changed, 12 insertions, 0 deletions
diff --git a/py/bc.h b/py/bc.h
index 3b7b625fe..a888164f1 100644
--- a/py/bc.h
+++ b/py/bc.h
@@ -254,6 +254,17 @@ typedef struct _mp_code_state_t {
// mp_exc_stack_t exc_state[0];
} mp_code_state_t;
+// State for an executing native function (based on mp_code_state_t).
+typedef struct _mp_code_state_native_t {
+ struct _mp_obj_fun_bc_t *fun_bc;
+ const byte *ip;
+ mp_obj_t *sp;
+ uint16_t n_state;
+ uint16_t exc_sp_idx;
+ mp_obj_dict_t *old_globals;
+ mp_obj_t state[0];
+} mp_code_state_native_t;
+
// Allocator may return NULL, in which case data is not stored (can be used to compute size).
typedef uint8_t *(*mp_encode_uint_allocator_t)(void *env, size_t nbytes);
@@ -269,6 +280,7 @@ mp_vm_return_kind_t mp_execute_bytecode(mp_code_state_t *code_state,
mp_obj_t inject_exc);
mp_code_state_t *mp_obj_fun_bc_prepare_codestate(mp_obj_t func, size_t n_args, size_t n_kw, const mp_obj_t *args);
void mp_setup_code_state(mp_code_state_t *code_state, size_t n_args, size_t n_kw, const mp_obj_t *args);
+void mp_setup_code_state_native(mp_code_state_native_t *code_state, size_t n_args, size_t n_kw, const mp_obj_t *args);
void mp_bytecode_print(const mp_print_t *print, const struct _mp_raw_code_t *rc, const mp_module_constants_t *cm);
void mp_bytecode_print2(const mp_print_t *print, const byte *ip, size_t len, struct _mp_raw_code_t *const *child_table, const mp_module_constants_t *cm);
const byte *mp_bytecode_print_str(const mp_print_t *print, const byte *ip_start, const byte *ip, struct _mp_raw_code_t *const *child_table, const mp_module_constants_t *cm);