diff options
| author | Damien George <damien@micropython.org> | 2021-09-13 22:30:24 +1000 |
|---|---|---|
| committer | Damien George <damien@micropython.org> | 2021-09-13 22:30:24 +1000 |
| commit | 426785a19eeb12aef7383fbda4693575d8c4dddf (patch) | |
| tree | 36dcbf57be41384ccaab8570043b465a3632201b | |
| parent | c0761d28fc46072d73daf6bdd1c6abbbac0fc9c1 (diff) | |
py/emitnative: Ensure load_subscr does not clobber existing REG_RET.
Fixes issue #7782, and part of issue #6314.
Signed-off-by: Damien George <damien@micropython.org>
| -rw-r--r-- | py/emitnative.c | 2 | ||||
| -rw-r--r-- | tests/micropython/viper_subscr_multi.py | 20 | ||||
| -rw-r--r-- | tests/micropython/viper_subscr_multi.py.exp | 2 |
3 files changed, 24 insertions, 0 deletions
diff --git a/py/emitnative.c b/py/emitnative.c index 7c7c34283..6504f3776 100644 --- a/py/emitnative.c +++ b/py/emitnative.c @@ -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, ®_base, reg_index, reg_index); + need_reg_single(emit, REG_RET, 0); switch (vtype_base) { case VTYPE_PTR8: { // pointer to 8-bit memory @@ -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, ®_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)); diff --git a/tests/micropython/viper_subscr_multi.py b/tests/micropython/viper_subscr_multi.py new file mode 100644 index 000000000..1561e5534 --- /dev/null +++ b/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) diff --git a/tests/micropython/viper_subscr_multi.py.exp b/tests/micropython/viper_subscr_multi.py.exp new file mode 100644 index 000000000..a2c298bb1 --- /dev/null +++ b/tests/micropython/viper_subscr_multi.py.exp @@ -0,0 +1,2 @@ +bytearray(b'\x03\x02') +bytearray(b'\x03\x02') |
