Berry fix walrus bug when assigning to self (#21015)

This commit is contained in:
s-hadinger 2024-03-22 18:51:48 +01:00 committed by GitHub
parent a34f5496a1
commit c95483844a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 18 additions and 12 deletions

View File

@ -14,7 +14,7 @@ All notable changes to this project will be documented in this file.
- LVGL library from v9.0.0 to v9.1.0
### Fixed
- Berry fix walrus bug when assigning to self
### Removed

View File

@ -728,23 +728,15 @@ int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, bbool keep_reg)
setsupvar(finfo, OP_SETUPV, e1, src);
break;
case ETMEMBER: /* store to member R(A).RK(B) <- RK(C) */
setsfxvar(finfo, OP_SETMBR, e1, src);
if (keep_reg && e2->type == ETREG) {
case ETINDEX: /* store to member R(A)[RK(B)] <- RK(C) */
setsfxvar(finfo, (e1->type == ETMEMBER) ? OP_SETMBR : OP_SETIDX, e1, src);
if (keep_reg && e2->type == ETREG && e1->v.ss.obj >= be_list_count(finfo->local)) {
/* special case of walrus assignemnt when we need to recreate an ETREG */
code_move(finfo, e1->v.ss.obj, src); /* move from ETREG to MEMBER instance*/
free_expreg(finfo, e2); /* free source (checks only ETREG) */
e2->v.idx = e1->v.ss.obj; /* update to new register */
}
break;
case ETINDEX: /* store to member R(A)[RK(B)] <- RK(C) */
setsfxvar(finfo, OP_SETIDX, e1, src);
if (keep_reg && e2->type == ETREG) {
/* special case of walrus assignemnt when we need to recreate an ETREG */
code_move(finfo, e1->v.ss.obj, src);
free_expreg(finfo, e2); /* free source (checks only ETREG) */
e2->v.idx = e1->v.ss.obj;
}
break;
default:
return 1;
}

View File

@ -56,3 +56,17 @@ import global
def f() return id(global.l[0] := 42) end
assert(f() == 42)
# bug: returns [42, 11]
# bug when using member for self
class confused_walrus
var b
def f()
var c = 1
if self.b := true
c = 2
end
return self
end
end
var ins = confused_walrus()
assert(ins.f() == ins)