Skip to content

Commit

Permalink
py: Fix 2 bugs in native emitter: jump_or_pop and stack settling.
Browse files Browse the repository at this point in the history
Addresses issue micropython#838.
  • Loading branch information
dpgeorge committed Aug 29, 2014
1 parent eb4e18f commit 02d95d7
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 2 deletions.
5 changes: 3 additions & 2 deletions py/emitnative.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Expand Down Expand Up @@ -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);
Expand Down
5 changes: 5 additions & 0 deletions tests/basics/andor.py
Original file line number Diff line number Diff line change
@@ -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)
35 changes: 35 additions & 0 deletions tests/basics/ifcond.py
Original file line number Diff line number Diff line change
@@ -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)

0 comments on commit 02d95d7

Please sign in to comment.