diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2016-07-19 14:12:07 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2016-07-19 14:12:07 -0300 |
commit | fc6b32bcaaf486beeffd35af44932a53f44d1c65 (patch) | |
tree | 170fba188c75ebbda8eb5458755222592de68a42 /lcode.c | |
parent | de96e26afc690957a1b14380ea589c10b9b9e162 (diff) | |
download | lua-fc6b32bcaaf486beeffd35af44932a53f44d1c65.tar.gz lua-fc6b32bcaaf486beeffd35af44932a53f44d1c65.tar.bz2 lua-fc6b32bcaaf486beeffd35af44932a53f44d1c65.zip |
bug: Lua can generate wrong code in functions with too many constants
Diffstat (limited to 'lcode.c')
-rw-r--r-- | lcode.c | 9 |
1 files changed, 6 insertions, 3 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lcode.c,v 2.109 2016/05/13 19:09:21 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 2.110 2016/06/20 19:12:46 roberto Exp roberto $ |
3 | ** Code generator for Lua | 3 | ** Code generator for Lua |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -1015,11 +1015,14 @@ static void codeunexpval (FuncState *fs, OpCode op, expdesc *e, int line) { | |||
1015 | ** (everything but logical operators 'and'/'or' and comparison | 1015 | ** (everything but logical operators 'and'/'or' and comparison |
1016 | ** operators). | 1016 | ** operators). |
1017 | ** Expression to produce final result will be encoded in 'e1'. | 1017 | ** Expression to produce final result will be encoded in 'e1'. |
1018 | ** Because 'luaK_exp2RK' can free registers, its calls must be | ||
1019 | ** in "stack order" (that is, first on 'e2', which may have more | ||
1020 | ** recent registers to be released). | ||
1018 | */ | 1021 | */ |
1019 | static void codebinexpval (FuncState *fs, OpCode op, | 1022 | static void codebinexpval (FuncState *fs, OpCode op, |
1020 | expdesc *e1, expdesc *e2, int line) { | 1023 | expdesc *e1, expdesc *e2, int line) { |
1021 | int rk1 = luaK_exp2RK(fs, e1); /* both operands are "RK" */ | 1024 | int rk2 = luaK_exp2RK(fs, e2); /* both operands are "RK" */ |
1022 | int rk2 = luaK_exp2RK(fs, e2); | 1025 | int rk1 = luaK_exp2RK(fs, e1); |
1023 | freeexps(fs, e1, e2); | 1026 | freeexps(fs, e1, e2); |
1024 | e1->u.info = luaK_codeABC(fs, op, 0, rk1, rk2); /* generate opcode */ | 1027 | e1->u.info = luaK_codeABC(fs, op, 0, rk1, rk2); /* generate opcode */ |
1025 | e1->k = VRELOCABLE; /* all those operations are relocatable */ | 1028 | e1->k = VRELOCABLE; /* all those operations are relocatable */ |