summaryrefslogtreecommitdiff
path: root/py/compile.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-09-27 23:27:53 +1000
committerDamien George <damien.p.george@gmail.com>2018-09-27 23:39:08 +1000
commit7d4b6cc868ebf0e1cc5dfe5276b22e1b857c411b (patch)
treec24010ac7a5cc689d1f1f3a27d756e7c1ca53568 /py/compile.c
parent8a84e08dc853eb294cc53160e902a39ead6fca8e (diff)
py/emitnative: Place const objs for native code in separate const table.
This commit changes native code to handle constant objects like bytecode: instead of storing the pointers inside the native code they are now stored in a separate constant table (such pointers include objects like bignum, bytes, and raw code for nested functions). This removes the need for the GC to scan native code for root pointers, and takes a step towards making native code independent of the runtime (eg so it can be compiled offline by mpy-cross). Note that the changes to the struct scope_t did not increase its size: on a 32-bit architecture it is still 48 bytes, and on a 64-bit architecture it decreased from 80 to 72 bytes.
Diffstat (limited to 'py/compile.c')
-rw-r--r--py/compile.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/py/compile.c b/py/compile.c
index 4cc6ab9eb..a7039be11 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -569,7 +569,7 @@ STATIC void close_over_variables_etc(compiler_t *comp, scope_t *this_scope, int
#if MICROPY_EMIT_NATIVE
// When creating a function/closure it will take a reference to the current globals
- comp->scope_cur->scope_flags |= MP_SCOPE_FLAG_REFGLOBALS;
+ comp->scope_cur->scope_flags |= MP_SCOPE_FLAG_REFGLOBALS | MP_SCOPE_FLAG_HASCONSTS;
#endif
// make closed over variables, if any
@@ -2665,6 +2665,9 @@ STATIC mp_obj_t get_const_object(mp_parse_node_struct_t *pns) {
}
STATIC void compile_const_object(compiler_t *comp, mp_parse_node_struct_t *pns) {
+ #if MICROPY_EMIT_NATIVE
+ comp->scope_cur->scope_flags |= MP_SCOPE_FLAG_HASCONSTS;
+ #endif
EMIT_ARG(load_const_obj, get_const_object(pns));
}
@@ -2699,6 +2702,9 @@ STATIC void compile_node(compiler_t *comp, mp_parse_node_t pn) {
} else {
EMIT_ARG(load_const_obj, mp_obj_new_int_from_ll(arg));
}
+ #if MICROPY_EMIT_NATIVE
+ comp->scope_cur->scope_flags |= MP_SCOPE_FLAG_HASCONSTS;
+ #endif
}
#else
EMIT_ARG(load_const_small_int, arg);
@@ -2717,6 +2723,9 @@ STATIC void compile_node(compiler_t *comp, mp_parse_node_t pn) {
const byte *data = qstr_data(arg, &len);
EMIT_ARG(load_const_obj, mp_obj_new_bytes(data, len));
}
+ #if MICROPY_EMIT_NATIVE
+ comp->scope_cur->scope_flags |= MP_SCOPE_FLAG_HASCONSTS;
+ #endif
break;
case MP_PARSE_NODE_TOKEN: default:
if (arg == MP_TOKEN_NEWLINE) {