diff options
author | Damien George <damien.p.george@gmail.com> | 2016-02-11 22:30:53 +0000 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2016-02-25 10:05:46 +0000 |
commit | ea23520403777f9b026f49245d39f8be1ccdbdac (patch) | |
tree | 949532b08d2614af11e8616a2d902ac8ca9ad3c2 /py/compile.c | |
parent | 57b96a7be214c8f2493db7d430348f5efcc8ad34 (diff) |
py: Add MICROPY_DYNAMIC_COMPILER option to config compiler at runtime.
This new compile-time option allows to make the bytecode compiler
configurable at runtime by setting the fields in the mp_dynamic_compiler
structure. By using this feature, the compiler can generate bytecode
that targets any MicroPython runtime/VM, regardless of the host and
target compile-time settings.
Options so far that fall under this dynamic setting are:
- maximum number of bits that a small int can hold;
- whether caching of lookups is used in the bytecode;
- whether to use unicode strings or not (lexer behaviour differs, and
therefore generated string constants differ).
Diffstat (limited to 'py/compile.c')
-rw-r--r-- | py/compile.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/py/compile.c b/py/compile.c index 7f9689102..0699692df 100644 --- a/py/compile.c +++ b/py/compile.c @@ -2486,7 +2486,23 @@ STATIC void compile_node(compiler_t *comp, mp_parse_node_t pn) { // pass } else if (MP_PARSE_NODE_IS_SMALL_INT(pn)) { mp_int_t arg = MP_PARSE_NODE_LEAF_SMALL_INT(pn); + #if MICROPY_DYNAMIC_COMPILER + mp_uint_t sign_mask = -(1 << (mp_dynamic_compiler.small_int_bits - 1)); + if ((arg & sign_mask) == 0 || (arg & sign_mask) == sign_mask) { + // integer fits in target runtime's small-int + EMIT_ARG(load_const_small_int, arg); + } else { + // integer doesn't fit, so create a multi-precision int object + // (but only create the actual object on the last pass) + if (comp->pass != MP_PASS_EMIT) { + EMIT_ARG(load_const_obj, mp_const_none); + } else { + EMIT_ARG(load_const_obj, mp_obj_new_int_from_ll(arg)); + } + } + #else EMIT_ARG(load_const_small_int, arg); + #endif } else if (MP_PARSE_NODE_IS_LEAF(pn)) { uintptr_t arg = MP_PARSE_NODE_LEAF_ARG(pn); switch (MP_PARSE_NODE_LEAF_KIND(pn)) { |