diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2022-02-15 12:28:46 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2022-02-15 12:28:46 -0300 |
| commit | 1f3c6f4534c6411313361697d98d1145a1f030fa (patch) | |
| tree | 4fe12910861bced95a9349e6aedb03097837939c | |
| parent | 25b143dd34fb587d1e35290c4b25bc08954800e2 (diff) | |
| download | lua-1f3c6f4534c6411313361697d98d1145a1f030fa.tar.gz lua-1f3c6f4534c6411313361697d98d1145a1f030fa.tar.bz2 lua-1f3c6f4534c6411313361697d98d1145a1f030fa.zip | |
Bug: Lua can generate wrong code when _ENV is <const>
| -rw-r--r-- | lparser.c | 1 | ||||
| -rw-r--r-- | testes/attrib.lua | 10 |
2 files changed, 11 insertions, 0 deletions
| @@ -468,6 +468,7 @@ static void singlevar (LexState *ls, expdesc *var) { | |||
| 468 | expdesc key; | 468 | expdesc key; |
| 469 | singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ | 469 | singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ |
| 470 | lua_assert(var->k != VVOID); /* this one must exist */ | 470 | lua_assert(var->k != VVOID); /* this one must exist */ |
| 471 | luaK_exp2anyregup(fs, var); /* but could be a constant */ | ||
| 471 | codestring(&key, varname); /* key is variable name */ | 472 | codestring(&key, varname); /* key is variable name */ |
| 472 | luaK_indexed(fs, var, &key); /* env[varname] */ | 473 | luaK_indexed(fs, var, &key); /* env[varname] */ |
| 473 | } | 474 | } |
diff --git a/testes/attrib.lua b/testes/attrib.lua index b1076c76..83821c06 100644 --- a/testes/attrib.lua +++ b/testes/attrib.lua | |||
| @@ -434,6 +434,16 @@ a.aVeryLongName012345678901234567890123456789012345678901234567890123456789 == | |||
| 434 | 10) | 434 | 10) |
| 435 | 435 | ||
| 436 | 436 | ||
| 437 | do | ||
| 438 | -- _ENV constant | ||
| 439 | local function foo () | ||
| 440 | local _ENV <const> = 11 | ||
| 441 | X = "hi" | ||
| 442 | end | ||
| 443 | local st, msg = pcall(foo) | ||
| 444 | assert(not st and string.find(msg, "number")) | ||
| 445 | end | ||
| 446 | |||
| 437 | 447 | ||
| 438 | -- test of large float/integer indices | 448 | -- test of large float/integer indices |
| 439 | 449 | ||
