summaryrefslogtreecommitdiff
path: root/py/compile.c
diff options
context:
space:
mode:
Diffstat (limited to 'py/compile.c')
-rw-r--r--py/compile.c54
1 files changed, 19 insertions, 35 deletions
diff --git a/py/compile.c b/py/compile.c
index 75cd562a1..7852b68ef 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -185,8 +185,6 @@ typedef struct _compiler_t {
scope_t *scope_head;
scope_t *scope_cur;
- mp_emit_common_t emit_common;
-
emit_t *emit; // current emitter
#if NEED_METHOD_TABLE
const emit_method_table_t *emit_method_table; // current emit method table
@@ -196,6 +194,8 @@ typedef struct _compiler_t {
emit_inline_asm_t *emit_inline_asm; // current emitter for inline asm
const emit_inline_asm_method_table_t *emit_inline_asm_method_table; // current emit method table for inline asm
#endif
+
+ mp_emit_common_t emit_common;
} compiler_t;
/******************************************************************************/
@@ -210,15 +210,11 @@ STATIC void mp_emit_common_init(mp_emit_common_t *emit, qstr source_file) {
mp_map_elem_t *elem = mp_map_lookup(&emit->qstr_map, MP_OBJ_NEW_QSTR(source_file), MP_MAP_LOOKUP_ADD_IF_NOT_FOUND);
elem->value = MP_OBJ_NEW_SMALL_INT(0);
#endif
+ mp_obj_list_init(&emit->const_obj_list, 0);
}
STATIC void mp_emit_common_start_pass(mp_emit_common_t *emit, pass_kind_t pass) {
emit->pass = pass;
- if (pass == MP_PASS_STACK_SIZE) {
- emit->ct_cur_obj_base = emit->ct_cur_obj;
- } else if (pass > MP_PASS_STACK_SIZE) {
- emit->ct_cur_obj = emit->ct_cur_obj_base;
- }
if (pass == MP_PASS_CODE_SIZE) {
if (emit->ct_cur_child == 0) {
emit->children = NULL;
@@ -229,22 +225,10 @@ STATIC void mp_emit_common_start_pass(mp_emit_common_t *emit, pass_kind_t pass)
emit->ct_cur_child = 0;
}
-STATIC void mp_emit_common_finalise(mp_emit_common_t *emit, bool has_native_code) {
- emit->ct_cur_obj += has_native_code; // allocate an additional slot for &mp_fun_table
- emit->const_table = m_new0(mp_uint_t, emit->ct_cur_obj);
- emit->ct_cur_obj = has_native_code; // reserve slot 0 for &mp_fun_table
- #if MICROPY_EMIT_NATIVE
- if (has_native_code) {
- // store mp_fun_table pointer at the start of the constant table
- emit->const_table[0] = (mp_uint_t)(uintptr_t)&mp_fun_table;
- }
- #endif
-}
-
STATIC void mp_emit_common_populate_module_context(mp_emit_common_t *emit, qstr source_file, mp_module_context_t *context) {
#if MICROPY_EMIT_BYTECODE_USES_QSTR_TABLE
size_t qstr_map_used = emit->qstr_map.used;
- mp_module_context_alloc_tables(context, qstr_map_used, emit->ct_cur_obj);
+ mp_module_context_alloc_tables(context, qstr_map_used, emit->const_obj_list.len);
for (size_t i = 0; i < emit->qstr_map.alloc; ++i) {
if (mp_map_slot_is_filled(&emit->qstr_map, i)) {
size_t idx = MP_OBJ_SMALL_INT_VALUE(emit->qstr_map.table[i].value);
@@ -253,12 +237,12 @@ STATIC void mp_emit_common_populate_module_context(mp_emit_common_t *emit, qstr
}
}
#else
- mp_module_context_alloc_tables(context, 0, emit->ct_cur_obj);
+ mp_module_context_alloc_tables(context, 0, emit->const_obj_list.len);
context->constants.source_file = source_file;
#endif
- if (emit->ct_cur_obj > 0) {
- memcpy(context->constants.obj_table, emit->const_table, emit->ct_cur_obj * sizeof(mp_uint_t));
+ for (size_t i = 0; i < emit->const_obj_list.len; ++i) {
+ context->constants.obj_table[i] = emit->const_obj_list.items[i];
}
}
@@ -3501,23 +3485,13 @@ mp_compiled_module_t mp_compile_to_raw_code(mp_parse_tree_t *parse_tree, qstr so
}
// compute some things related to scope and identifiers
- bool has_native_code = false;
for (scope_t *s = comp->scope_head; s != NULL && comp->compile_error == MP_OBJ_NULL; s = s->next) {
- #if MICROPY_EMIT_NATIVE
- if (s->emit_options == MP_EMIT_OPT_NATIVE_PYTHON || s->emit_options == MP_EMIT_OPT_VIPER) {
- has_native_code = true;
- }
- #endif
-
scope_compute_things(s);
}
// set max number of labels now that it's calculated
emit_bc_set_max_num_labels(emit_bc, max_num_labels);
- // finalise and allocate the constant table
- mp_emit_common_finalise(&comp->emit_common, has_native_code);
-
// compile MP_PASS_STACK_SIZE, MP_PASS_CODE_SIZE, MP_PASS_EMIT
#if MICROPY_EMIT_NATIVE
emit_t *emit_native = NULL;
@@ -3604,9 +3578,19 @@ mp_compiled_module_t mp_compile_to_raw_code(mp_parse_tree_t *parse_tree, qstr so
cm.rc = module_scope->raw_code;
cm.context = context;
#if MICROPY_PERSISTENT_CODE_SAVE
- cm.has_native = has_native_code;
+ cm.has_native = false;
+ #if MICROPY_EMIT_NATIVE
+ if (emit_native != NULL) {
+ cm.has_native = true;
+ }
+ #endif
+ #if MICROPY_EMIT_INLINE_ASM
+ if (comp->emit_inline_asm != NULL) {
+ cm.has_native = true;
+ }
+ #endif
cm.n_qstr = comp->emit_common.qstr_map.used;
- cm.n_obj = comp->emit_common.ct_cur_obj;
+ cm.n_obj = comp->emit_common.const_obj_list.len;
#endif
if (comp->compile_error == MP_OBJ_NULL) {
mp_emit_common_populate_module_context(&comp->emit_common, source_file, context);