diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-06-15 11:12:59 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2009-06-15 11:12:59 -0300 |
| commit | 49b88b1c39fca21f1f55e462e0f549b8187f89d6 (patch) | |
| tree | bd81ea8bdcc7732438dd51f87fab359a0cca78f8 | |
| parent | 3db5f60547d6f31892071f5c00032dfb79a8f729 (diff) | |
| download | lua-49b88b1c39fca21f1f55e462e0f549b8187f89d6.tar.gz lua-49b88b1c39fca21f1f55e462e0f549b8187f89d6.tar.bz2 lua-49b88b1c39fca21f1f55e462e0f549b8187f89d6.zip | |
patch for wrong code generation for some particular boolean expressions
| -rw-r--r-- | bugs | 51 |
1 files changed, 49 insertions, 2 deletions
| @@ -1880,8 +1880,8 @@ patch = [[ | |||
| 1880 | +++ lundump.c 2008/04/04 19:51:41 2.7.1.4 | 1880 | +++ lundump.c 2008/04/04 19:51:41 2.7.1.4 |
| 1881 | @@ -1,5 +1,5 @@ | 1881 | @@ -1,5 +1,5 @@ |
| 1882 | /* | 1882 | /* |
| 1883 | -** $Id: bugs,v 1.98 2008/08/06 13:32:45 roberto Exp roberto $ | 1883 | -** $Id: bugs,v 1.99 2009/04/27 20:11:11 roberto Exp roberto $ |
| 1884 | +** $Id: bugs,v 1.98 2008/08/06 13:32:45 roberto Exp roberto $ | 1884 | +** $Id: bugs,v 1.99 2009/04/27 20:11:11 roberto Exp roberto $ |
| 1885 | ** load precompiled Lua chunks | 1885 | ** load precompiled Lua chunks |
| 1886 | ** See Copyright Notice in lua.h | 1886 | ** See Copyright Notice in lua.h |
| 1887 | */ | 1887 | */ |
| @@ -2102,6 +2102,53 @@ print(((1 or false) and true) or false) --> 1 | |||
| 2102 | -- should be 'true' | 2102 | -- should be 'true' |
| 2103 | ]], | 2103 | ]], |
| 2104 | patch = [[ | 2104 | patch = [[ |
| 2105 | --- lcode.c 2007/12/28 15:32:23 2.25.1.3 | ||
| 2106 | +++ lcode.c 2009/06/15 14:07:34 | ||
| 2107 | @@ -544,15 +544,18 @@ | ||
| 2108 | pc = NO_JUMP; /* always true; do nothing */ | ||
| 2109 | break; | ||
| 2110 | } | ||
| 2111 | - case VFALSE: { | ||
| 2112 | - pc = luaK_jump(fs); /* always jump */ | ||
| 2113 | - break; | ||
| 2114 | - } | ||
| 2115 | case VJMP: { | ||
| 2116 | invertjump(fs, e); | ||
| 2117 | pc = e->u.s.info; | ||
| 2118 | break; | ||
| 2119 | } | ||
| 2120 | + case VFALSE: { | ||
| 2121 | + if (!hasjumps(e)) { | ||
| 2122 | + pc = luaK_jump(fs); /* always jump */ | ||
| 2123 | + break; | ||
| 2124 | + } | ||
| 2125 | + /* else go through */ | ||
| 2126 | + } | ||
| 2127 | default: { | ||
| 2128 | pc = jumponcond(fs, e, 0); | ||
| 2129 | break; | ||
| 2130 | @@ -572,14 +575,17 @@ | ||
| 2131 | pc = NO_JUMP; /* always false; do nothing */ | ||
| 2132 | break; | ||
| 2133 | } | ||
| 2134 | - case VTRUE: { | ||
| 2135 | - pc = luaK_jump(fs); /* always jump */ | ||
| 2136 | - break; | ||
| 2137 | - } | ||
| 2138 | case VJMP: { | ||
| 2139 | pc = e->u.s.info; | ||
| 2140 | break; | ||
| 2141 | } | ||
| 2142 | + case VTRUE: { | ||
| 2143 | + if (!hasjumps(e)) { | ||
| 2144 | + pc = luaK_jump(fs); /* always jump */ | ||
| 2145 | + break; | ||
| 2146 | + } | ||
| 2147 | + /* else go through */ | ||
| 2148 | + } | ||
| 2149 | default: { | ||
| 2150 | pc = jumponcond(fs, e, 1); | ||
| 2151 | break; | ||
| 2105 | ]], | 2152 | ]], |
| 2106 | } | 2153 | } |
| 2107 | 2154 | ||
