Skip to content

Commit

Permalink
py/emitnative: Ensure stack settling is safe mid-branch.
Browse files Browse the repository at this point in the history
And add a test for the case where REG_RET could be in use.

Fixes #7523.

Signed-off-by: Jim Mussared <jim.mussared@gmail.com>
  • Loading branch information
jimmo authored and dpgeorge committed Jul 19, 2021
1 parent d0227d5 commit 0e3752e
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 3 deletions.
7 changes: 4 additions & 3 deletions py/emitnative.c
Expand Up @@ -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);
Expand All @@ -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);
}
}
}
Expand Down
10 changes: 10 additions & 0 deletions tests/micropython/native_misc.py
Expand Up @@ -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)
2 changes: 2 additions & 0 deletions tests/micropython/native_misc.py.exp
Expand Up @@ -4,3 +4,5 @@
6
True
False
1 2 3 5
1 2 3 4

0 comments on commit 0e3752e

Please sign in to comment.