summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2014-08-29 20:05:32 +0100
committerDamien George <damien.p.george@gmail.com>2014-08-29 20:05:32 +0100
commit02d95d7ce9e12afa890b5ffb6a4d92fb593687ff (patch)
tree7a1bef4227b6fa520523c71ed2eb82992c0c623b
parenteb4e18f0578db65573bf6db708f7f001dcb43715 (diff)
downloadmicropython-02d95d7ce9e12afa890b5ffb6a4d92fb593687ff.tar.gz
micropython-02d95d7ce9e12afa890b5ffb6a4d92fb593687ff.zip
py: Fix 2 bugs in native emitter: jump_or_pop and stack settling.
Addresses issue #838.
-rw-r--r--py/emitnative.c5
-rw-r--r--tests/basics/andor.py5
-rw-r--r--tests/basics/ifcond.py35
3 files changed, 43 insertions, 2 deletions
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)