Bug: wrong code gen. for indices with comparisons

In function 'luaK_exp2val', used to generate code for indices: Macro
'hasjumps' does not consider the case when the whole expression is a
"jump" (a test). In all other of its uses, the surrounding code ensures
that the expression cannot be VJMP.
This commit is contained in:
Roberto Ierusalimschy 2024-08-17 12:37:04 -03:00
parent 30982bec96
commit 782ef85b22
2 changed files with 10 additions and 1 deletions

View File

@ -35,6 +35,7 @@
#define MAXREGS 255
/* (note that expressions VJMP also have jumps.) */
#define hasjumps(e) ((e)->t != (e)->f)
@ -985,7 +986,7 @@ void luaK_exp2anyregup (FuncState *fs, expdesc *e) {
** or it is a constant.
*/
void luaK_exp2val (FuncState *fs, expdesc *e) {
if (hasjumps(e))
if (e->k == VJMP || hasjumps(e))
luaK_exp2anyreg(fs, e);
else
luaK_dischargevars(fs, e);

View File

@ -3,6 +3,14 @@
print "testing closures"
do -- bug in 5.4.7
_ENV[true] = 10
local function aux () return _ENV[1 < 2] end
assert(aux() == 10)
_ENV[true] = nil
end
local A,B = 0,{g=10}
local function f(x)
local a = {}