diff options
-rw-r--r-- | bugs | 28 | ||||
-rw-r--r-- | lcode.c | 9 |
2 files changed, 32 insertions, 5 deletions
@@ -3652,9 +3652,9 @@ It needs an "interceptor" 'memcmp' function that continues | |||
3652 | reading memory after a difference is found.]], | 3652 | reading memory after a difference is found.]], |
3653 | patch = [[ | 3653 | patch = [[ |
3654 | 2c2 | 3654 | 2c2 |
3655 | < ** $Id: loslib.c,v 1.64 2016/04/18 13:06:55 roberto Exp roberto $ | 3655 | < ** $Id: bugs,v 1.149 2016/07/15 17:24:09 roberto Exp roberto $ |
3656 | --- | 3656 | --- |
3657 | > ** $Id: loslib.c,v 1.64 2016/04/18 13:06:55 roberto Exp $ | 3657 | > ** $Id: bugs,v 1.149 2016/07/15 17:24:09 roberto Exp roberto $ |
3658 | 263c263,264 | 3658 | 263c263,264 |
3659 | < for (option = LUA_STRFTIMEOPTIONS; *option != '\0'; option += oplen) { | 3659 | < for (option = LUA_STRFTIMEOPTIONS; *option != '\0'; option += oplen) { |
3660 | --- | 3660 | --- |
@@ -3664,6 +3664,30 @@ patch = [[ | |||
3664 | } | 3664 | } |
3665 | 3665 | ||
3666 | 3666 | ||
3667 | Bug{ | ||
3668 | what = [[Lua can generate wrong code in functions with too many constants]], | ||
3669 | report = [[Marco Schöpl, 2016/07/17]], | ||
3670 | since = [[5.3.3]], | ||
3671 | fix = nil, | ||
3672 | example = [[See http://lua-users.org/lists/lua-l/2016-07/msg00303.html]], | ||
3673 | patch = [[ | ||
3674 | --- lcode.c 2016/06/20 19:12:46 2.110 | ||
3675 | +++ lcode.c 2016/07/18 15:43:41 | ||
3676 | @@ -1018,8 +1018,8 @@ | ||
3677 | */ | ||
3678 | static void codebinexpval (FuncState *fs, OpCode op, | ||
3679 | expdesc *e1, expdesc *e2, int line) { | ||
3680 | - int rk1 = luaK_exp2RK(fs, e1); /* both operands are "RK" */ | ||
3681 | - int rk2 = luaK_exp2RK(fs, e2); | ||
3682 | + int rk2 = luaK_exp2RK(fs, e2); /* both operands are "RK" */ | ||
3683 | + int rk1 = luaK_exp2RK(fs, e1); | ||
3684 | freeexps(fs, e1, e2); | ||
3685 | e1->u.info = luaK_codeABC(fs, op, 0, rk1, rk2); /* generate opcode */ | ||
3686 | e1->k = VRELOCABLE; /* all those operations are relocatable */ | ||
3687 | ]] | ||
3688 | } | ||
3689 | |||
3690 | |||
3667 | --[=[ | 3691 | --[=[ |
3668 | Bug{ | 3692 | Bug{ |
3669 | what = [[ ]], | 3693 | what = [[ ]], |
@@ -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 */ |