summaryrefslogtreecommitdiff
path: root/py/compile.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2018-08-13 23:34:47 +1000
committerDamien George <damien.p.george@gmail.com>2018-08-13 23:34:47 +1000
commitcbec17f2cd2712772bc57f3530d6d16f8552e155 (patch)
treec4f3bbc1827a441a36730cdbe269718ccec95b7d /py/compile.c
parent86e0b2553288bf40a22e1e91d161c075295dd4a7 (diff)
py/compile: For dynamic compiler, widen literal 1 to get correct shift.
Without this patch, on 64-bit architectures the "1 << (small_int_bits - 1)" is computed using only 32-bit values (since small_int_bits is a uint8_t) and so will overflow (and give the wrong result) if small_int_bits is larger than 32.
Diffstat (limited to 'py/compile.c')
-rw-r--r--py/compile.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/py/compile.c b/py/compile.c
index 98c09b210..df416b87f 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -2685,7 +2685,7 @@ STATIC void compile_node(compiler_t *comp, mp_parse_node_t pn) {
} 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));
+ mp_uint_t sign_mask = -((mp_uint_t)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);