Skip to content

Commit

Permalink
py/emitnative: Ensure load_subscr does not clobber existing REG_RET.
Browse files Browse the repository at this point in the history
Fixes issue #7782, and part of issue #6314.

Signed-off-by: Damien George <damien@micropython.org>
  • Loading branch information
dpgeorge committed Sep 13, 2021
1 parent c0761d2 commit 426785a
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 0 deletions.
2 changes: 2 additions & 0 deletions py/emitnative.c
Expand Up @@ -1560,6 +1560,7 @@ STATIC void emit_native_load_subscr(emit_t *emit) {
int reg_base = REG_ARG_1;
int reg_index = REG_ARG_2;
emit_pre_pop_reg_flexible(emit, &vtype_base, &reg_base, reg_index, reg_index);
need_reg_single(emit, REG_RET, 0);
switch (vtype_base) {
case VTYPE_PTR8: {
// pointer to 8-bit memory
Expand Down Expand Up @@ -1623,6 +1624,7 @@ STATIC void emit_native_load_subscr(emit_t *emit) {
int reg_index = REG_ARG_2;
emit_pre_pop_reg_flexible(emit, &vtype_index, &reg_index, REG_ARG_1, REG_ARG_1);
emit_pre_pop_reg(emit, &vtype_base, REG_ARG_1);
need_reg_single(emit, REG_RET, 0);
if (vtype_index != VTYPE_INT && vtype_index != VTYPE_UINT) {
EMIT_NATIVE_VIPER_TYPE_ERROR(emit,
MP_ERROR_TEXT("can't load with '%q' index"), vtype_to_qstr(vtype_index));
Expand Down
20 changes: 20 additions & 0 deletions tests/micropython/viper_subscr_multi.py
@@ -0,0 +1,20 @@
# test viper with multiple subscripts in a single expression


@micropython.viper
def f1(b: ptr8):
b[0] += b[1]


@micropython.viper
def f2(b: ptr8, i: int):
b[0] += b[i]


b = bytearray(b"\x01\x02")
f1(b)
print(b)

b = bytearray(b"\x01\x02")
f2(b, 1)
print(b)
2 changes: 2 additions & 0 deletions tests/micropython/viper_subscr_multi.py.exp
@@ -0,0 +1,2 @@
bytearray(b'\x03\x02')
bytearray(b'\x03\x02')

0 comments on commit 426785a

Please sign in to comment.