diff options
Diffstat (limited to 'py/emitglue.h')
| -rw-r--r-- | py/emitglue.h | 38 |
1 files changed, 21 insertions, 17 deletions
diff --git a/py/emitglue.h b/py/emitglue.h index 4ddf74011..c9c6c8ba1 100644 --- a/py/emitglue.h +++ b/py/emitglue.h @@ -49,34 +49,38 @@ typedef enum { MP_CODE_NATIVE_ASM, } mp_raw_code_kind_t; +// This mp_raw_code_t struct holds static information about a non-instantiated function. +// A function object is created from this information, and that object can then be executed. +// +// This struct appears in the following places: // compiled bytecode: instance in RAM, referenced by outer scope, usually freed after first (and only) use // mpy file: instance in RAM, created when .mpy file is loaded (same comments as above) // frozen: instance in ROM typedef struct _mp_raw_code_t { - mp_uint_t kind : 3; // of type mp_raw_code_kind_t - mp_uint_t scope_flags : 7; - mp_uint_t n_pos_args : 11; + uint32_t kind : 3; // of type mp_raw_code_kind_t + uint32_t scope_flags : 7; const void *fun_data; + struct _mp_raw_code_t **children; #if MICROPY_PERSISTENT_CODE_SAVE || MICROPY_DEBUG_PRINTERS - size_t fun_data_len; // so mp_raw_code_save and mp_bytecode_print work + uint32_t fun_data_len; // so mp_raw_code_save and mp_bytecode_print work #endif - struct _mp_raw_code_t **children; #if MICROPY_PERSISTENT_CODE_SAVE - size_t n_children; + uint16_t n_children; + #if MICROPY_EMIT_MACHINE_CODE + uint16_t prelude_offset; + #endif #if MICROPY_PY_SYS_SETTRACE - mp_bytecode_prelude_t prelude; // line_of_definition is a Python source line where the raw_code was // created e.g. MP_BC_MAKE_FUNCTION. This is different from lineno info // stored in prelude, which provides line number for first statement of // a function. Required to properly implement "call" trace event. - mp_uint_t line_of_definition; - #endif - #if MICROPY_EMIT_MACHINE_CODE - uint16_t prelude_offset; + uint32_t line_of_definition; + mp_bytecode_prelude_t prelude; #endif #endif - #if MICROPY_EMIT_MACHINE_CODE - mp_uint_t type_sig; // for viper, compressed as 2-bit types; ret is MSB, then arg0, arg1, etc + #if MICROPY_EMIT_INLINE_ASM + uint32_t asm_n_pos_args : 8; + uint32_t asm_type_sig : 24; // compressed as 2-bit types; ret is MSB, then arg0, arg1, etc #endif } mp_raw_code_t; @@ -88,17 +92,17 @@ void mp_emit_glue_assign_bytecode(mp_raw_code_t *rc, const byte *code, #endif mp_raw_code_t **children, #if MICROPY_PERSISTENT_CODE_SAVE - size_t n_children, + uint16_t n_children, #endif - mp_uint_t scope_flags); + uint16_t scope_flags); void mp_emit_glue_assign_native(mp_raw_code_t *rc, mp_raw_code_kind_t kind, void *fun_data, mp_uint_t fun_len, mp_raw_code_t **children, #if MICROPY_PERSISTENT_CODE_SAVE - size_t n_children, + uint16_t n_children, uint16_t prelude_offset, #endif - mp_uint_t scope_flags, mp_uint_t n_pos_args, mp_uint_t type_sig); + uint16_t scope_flags, uint32_t asm_n_pos_args, uint32_t asm_type_sig); mp_obj_t mp_make_function_from_raw_code(const mp_raw_code_t *rc, const mp_module_context_t *context, const mp_obj_t *def_args); mp_obj_t mp_make_closure_from_raw_code(const mp_raw_code_t *rc, const mp_module_context_t *context, mp_uint_t n_closed_over, const mp_obj_t *args); |
