mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-25 11:46:31 +00:00
Berry fix walrus bug when assigning to self (#21015)
This commit is contained in:
parent
a34f5496a1
commit
c95483844a
@ -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
|
- LVGL library from v9.0.0 to v9.1.0
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
- Berry fix walrus bug when assigning to self
|
||||||
|
|
||||||
### Removed
|
### Removed
|
||||||
|
|
||||||
|
@ -728,23 +728,15 @@ int be_code_setvar(bfuncinfo *finfo, bexpdesc *e1, bexpdesc *e2, bbool keep_reg)
|
|||||||
setsupvar(finfo, OP_SETUPV, e1, src);
|
setsupvar(finfo, OP_SETUPV, e1, src);
|
||||||
break;
|
break;
|
||||||
case ETMEMBER: /* store to member R(A).RK(B) <- RK(C) */
|
case ETMEMBER: /* store to member R(A).RK(B) <- RK(C) */
|
||||||
setsfxvar(finfo, OP_SETMBR, e1, src);
|
case ETINDEX: /* store to member R(A)[RK(B)] <- RK(C) */
|
||||||
if (keep_reg && e2->type == ETREG) {
|
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 */
|
/* 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*/
|
code_move(finfo, e1->v.ss.obj, src); /* move from ETREG to MEMBER instance*/
|
||||||
free_expreg(finfo, e2); /* free source (checks only ETREG) */
|
free_expreg(finfo, e2); /* free source (checks only ETREG) */
|
||||||
e2->v.idx = e1->v.ss.obj; /* update to new register */
|
e2->v.idx = e1->v.ss.obj; /* update to new register */
|
||||||
}
|
}
|
||||||
break;
|
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:
|
default:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -56,3 +56,17 @@ import global
|
|||||||
def f() return id(global.l[0] := 42) end
|
def f() return id(global.l[0] := 42) end
|
||||||
assert(f() == 42)
|
assert(f() == 42)
|
||||||
# bug: returns [42, 11]
|
# 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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user