summaryrefslogtreecommitdiff
path: root/py/compile.c
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-01-28 23:27:35 +0000
committerDamien George <damien.p.george@gmail.com>2014-01-28 23:27:35 +0000
commite4b6a079b3422e83a5fb082ba0e166ed1b48ecdf (patch)
tree534926f93ce82967398a08ab24ec269a5f87e659 /py/compile.c
parentb40892d266c05613f3e32f12ca3a7c4b03270fb7 (diff)
py: Implement 'not' in compiler, and improve rt_is_true.
Diffstat (limited to 'py/compile.c')
-rw-r--r--py/compile.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/py/compile.c b/py/compile.c
index e1b62a11b..ebd2abb5c 100644
--- a/py/compile.c
+++ b/py/compile.c
@@ -1912,7 +1912,21 @@ void compile_and_test(compiler_t *comp, mp_parse_node_struct_t *pns) {
void compile_not_test_2(compiler_t *comp, mp_parse_node_struct_t *pns) {
compile_node(comp, pns->nodes[0]);
+#if MICROPY_EMIT_CPYTHON
EMIT_ARG(unary_op, RT_UNARY_OP_NOT);
+#else
+ // eliminate use of NOT byte code
+ int l_load_false = comp_next_label(comp);
+ int l_done = comp_next_label(comp);
+ int stack_size = EMIT(get_stack_size);
+ EMIT_ARG(pop_jump_if_true, l_load_false);
+ EMIT_ARG(load_const_tok, MP_TOKEN_KW_TRUE);
+ EMIT_ARG(jump, l_done);
+ EMIT_ARG(label_assign, l_load_false);
+ EMIT_ARG(load_const_tok, MP_TOKEN_KW_FALSE);
+ EMIT_ARG(label_assign, l_done);
+ EMIT_ARG(set_stack_size, stack_size); // force stack size since it counts 1 pop and 2 pushes statically, but really it's 1 pop and 1 push dynamically
+#endif
}
void compile_comparison(compiler_t *comp, mp_parse_node_struct_t *pns) {