diff options
| -rw-r--r-- | lcode.c | 3 | ||||
| -rw-r--r-- | testes/closure.lua | 8 |
2 files changed, 10 insertions, 1 deletions
| @@ -31,6 +31,7 @@ | |||
| 31 | #include "lvm.h" | 31 | #include "lvm.h" |
| 32 | 32 | ||
| 33 | 33 | ||
| 34 | /* (note that expressions VJMP also have jumps.) */ | ||
| 34 | #define hasjumps(e) ((e)->t != (e)->f) | 35 | #define hasjumps(e) ((e)->t != (e)->f) |
| 35 | 36 | ||
| 36 | 37 | ||
| @@ -991,7 +992,7 @@ void luaK_exp2anyregup (FuncState *fs, expdesc *e) { | |||
| 991 | ** or it is a constant. | 992 | ** or it is a constant. |
| 992 | */ | 993 | */ |
| 993 | void luaK_exp2val (FuncState *fs, expdesc *e) { | 994 | void luaK_exp2val (FuncState *fs, expdesc *e) { |
| 994 | if (hasjumps(e)) | 995 | if (e->k == VJMP || hasjumps(e)) |
| 995 | luaK_exp2anyreg(fs, e); | 996 | luaK_exp2anyreg(fs, e); |
| 996 | else | 997 | else |
| 997 | luaK_dischargevars(fs, e); | 998 | luaK_dischargevars(fs, e); |
diff --git a/testes/closure.lua b/testes/closure.lua index de1b54ec..07149ef3 100644 --- a/testes/closure.lua +++ b/testes/closure.lua | |||
| @@ -3,6 +3,14 @@ | |||
| 3 | 3 | ||
| 4 | print "testing closures" | 4 | print "testing closures" |
| 5 | 5 | ||
| 6 | do -- bug in 5.4.7 | ||
| 7 | _ENV[true] = 10 | ||
| 8 | local function aux () return _ENV[1 < 2] end | ||
| 9 | assert(aux() == 10) | ||
| 10 | _ENV[true] = nil | ||
| 11 | end | ||
| 12 | |||
| 13 | |||
| 6 | local A,B = 0,{g=10} | 14 | local A,B = 0,{g=10} |
| 7 | local function f(x) | 15 | local function f(x) |
| 8 | local a = {} | 16 | local a = {} |
