diff --git a/py/emitnative.c b/py/emitnative.c index 6b5c3f989f..6e064fc4c3 100644 --- a/py/emitnative.c +++ b/py/emitnative.c @@ -503,6 +503,7 @@ STATIC void need_stack_settled(emit_t *emit) { for (int i = 0; i < emit->stack_size; i++) { stack_info_t *si = &emit->stack_info[i]; if (si->kind == STACK_IMM) { + si->kind = STACK_VALUE; ASM_MOV_IMM_TO_LOCAL_USING(si->u_imm, emit->stack_start + i, REG_TEMP0); } } @@ -1131,10 +1132,10 @@ STATIC void emit_native_jump_helper(emit_t *emit, uint label, bool pop) { } } else if (vtype == VTYPE_PYOBJ) { emit_pre_pop_reg(emit, &vtype, REG_ARG_1); - emit_call(emit, MP_F_OBJ_IS_TRUE); if (!pop) { - emit_post_push_reg(emit, VTYPE_PYOBJ, REG_RET); + adjust_stack(emit, 1); } + emit_call(emit, MP_F_OBJ_IS_TRUE); } else { printf("ViperTypeError: expecting a bool or pyobj, got %d\n", vtype); assert(0); diff --git a/tests/basics/andor.py b/tests/basics/andor.py new file mode 100644 index 0000000000..4deddaf8b5 --- /dev/null +++ b/tests/basics/andor.py @@ -0,0 +1,5 @@ +# test short circuit expressions outside if conditionals +print(() or 1) +print((1,) or 1) +print(() and 1) +print((1,) and 1) diff --git a/tests/basics/ifcond.py b/tests/basics/ifcond.py new file mode 100644 index 0000000000..9101c3859f --- /dev/null +++ b/tests/basics/ifcond.py @@ -0,0 +1,35 @@ +# test if conditions which are optimised by the compiler + +f2 = 0 + +def f(t1, t2, f1): + if False: + print(1) + if True: + print(1) + if (): + print(1) + if (1,): + print(1) + if (1, 2): + print(1) + if t1 and t2: + print(1) + if (t1 and t2): # parsed differently to above + print(1) + if not (t1 and f1): + print(1) + if t1 or t2: + print(1) + if (t1 or t2): # parse differently to above + print(1) + if f1 or t1: + print(1) + if not (f1 or f2): + print(1) + if t1 and f1 or t1 and t2: + print(1) + if (f1 or t1) and (f2 or t2): + print(1) + +f(True, 1, False)