summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--py/emitnative.c7
-rw-r--r--tests/micropython/native_misc.py10
-rw-r--r--tests/micropython/native_misc.py.exp2
3 files changed, 16 insertions, 3 deletions
diff --git a/py/emitnative.c b/py/emitnative.c
index a40d690f2..7c7c34283 100644
--- a/py/emitnative.c
+++ b/py/emitnative.c
@@ -877,7 +877,7 @@ STATIC vtype_kind_t load_reg_stack_imm(emit_t *emit, int reg_dest, const stack_i
// Copies all unsettled registers and immediates that are Python values into the
// concrete Python stack. This ensures the concrete Python stack holds valid
// values for the current stack_size.
-// This function may clobber REG_TEMP0.
+// This function may clobber REG_TEMP1.
STATIC void need_stack_settled(emit_t *emit) {
DEBUG_printf(" need_stack_settled; stack_size=%d\n", emit->stack_size);
need_reg_all(emit);
@@ -886,8 +886,9 @@ STATIC void need_stack_settled(emit_t *emit) {
if (si->kind == STACK_IMM) {
DEBUG_printf(" imm(" INT_FMT ") to local(%u)\n", si->data.u_imm, emit->stack_start + i);
si->kind = STACK_VALUE;
- si->vtype = load_reg_stack_imm(emit, REG_TEMP0, si, false);
- emit_native_mov_state_reg(emit, emit->stack_start + i, REG_TEMP0);
+ // using REG_TEMP1 to avoid clobbering REG_TEMP0 (aka REG_RET)
+ si->vtype = load_reg_stack_imm(emit, REG_TEMP1, si, false);
+ emit_native_mov_state_reg(emit, emit->stack_start + i, REG_TEMP1);
}
}
}
diff --git a/tests/micropython/native_misc.py b/tests/micropython/native_misc.py
index 7c5415375..f5ef807fe 100644
--- a/tests/micropython/native_misc.py
+++ b/tests/micropython/native_misc.py
@@ -38,3 +38,13 @@ def f(a):
f(False)
f(True)
+
+
+# stack settling in branch
+@micropython.native
+def f(a):
+ print(1, 2, 3, 4 if a else 5)
+
+
+f(False)
+f(True)
diff --git a/tests/micropython/native_misc.py.exp b/tests/micropython/native_misc.py.exp
index b3e1389ef..8eec04228 100644
--- a/tests/micropython/native_misc.py.exp
+++ b/tests/micropython/native_misc.py.exp
@@ -4,3 +4,5 @@
6
True
False
+1 2 3 5
+1 2 3 4