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>
This commit is contained in:
parent
c0761d28fc
commit
426785a19e
@ -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));
|
||||
|
20
tests/micropython/viper_subscr_multi.py
Normal file
20
tests/micropython/viper_subscr_multi.py
Normal file
@ -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
tests/micropython/viper_subscr_multi.py.exp
Normal file
2
tests/micropython/viper_subscr_multi.py.exp
Normal file
@ -0,0 +1,2 @@
|
||||
bytearray(b'\x03\x02')
|
||||
bytearray(b'\x03\x02')
|
Loading…
Reference in New Issue
Block a user