diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-04-02 13:54:20 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2014-04-02 13:54:20 -0300 |
commit | 7d514af0bc95b75d7a162331b0e4c1fd7d20c9c7 (patch) | |
tree | 9afd43a4201273e3a78677f188ff77ba237c366d /lvm.c | |
parent | f61ceee70822259725a335ccaaa323416296a6c1 (diff) | |
download | lua-7d514af0bc95b75d7a162331b0e4c1fd7d20c9c7.tar.gz lua-7d514af0bc95b75d7a162331b0e4c1fd7d20c9c7.tar.bz2 lua-7d514af0bc95b75d7a162331b0e4c1fd7d20c9c7.zip |
bug (in work version): comparisons should not try to convert
strings to numbers
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 25 |
1 files changed, 20 insertions, 5 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 2.191 2014/03/31 18:37:52 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.192 2014/03/31 19:18:24 roberto Exp roberto $ |
3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -37,6 +37,21 @@ | |||
37 | #define MAXNUMBER2STR 50 | 37 | #define MAXNUMBER2STR 50 |
38 | 38 | ||
39 | 39 | ||
40 | /* | ||
41 | ** Similar to 'tonumber', but does not attempt to convert strings. | ||
42 | ** Used in comparisons. | ||
43 | */ | ||
44 | static int tofloat (const TValue *obj, lua_Number *n) { | ||
45 | if (ttisfloat(obj)) *n = fltvalue(obj); | ||
46 | else if (ttisinteger(obj)) *n = cast_num(ivalue(obj)); | ||
47 | else { | ||
48 | *n = 0; /* to avoid warnings */ | ||
49 | return 0; | ||
50 | } | ||
51 | return 1; | ||
52 | } | ||
53 | |||
54 | |||
40 | int luaV_tonumber_ (const TValue *obj, lua_Number *n) { | 55 | int luaV_tonumber_ (const TValue *obj, lua_Number *n) { |
41 | lua_assert(!ttisfloat(obj)); | 56 | lua_assert(!ttisfloat(obj)); |
42 | if (ttisinteger(obj)) { | 57 | if (ttisinteger(obj)) { |
@@ -184,7 +199,7 @@ int luaV_lessthan (lua_State *L, const TValue *l, const TValue *r) { | |||
184 | lua_Number nl, nr; | 199 | lua_Number nl, nr; |
185 | if (ttisinteger(l) && ttisinteger(r)) | 200 | if (ttisinteger(l) && ttisinteger(r)) |
186 | return (ivalue(l) < ivalue(r)); | 201 | return (ivalue(l) < ivalue(r)); |
187 | else if (tonumber(l, &nl) && tonumber(r, &nr)) | 202 | else if (tofloat(l, &nl) && tofloat(r, &nr)) |
188 | return luai_numlt(nl, nr); | 203 | return luai_numlt(nl, nr); |
189 | else if (ttisstring(l) && ttisstring(r)) | 204 | else if (ttisstring(l) && ttisstring(r)) |
190 | return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0; | 205 | return l_strcmp(rawtsvalue(l), rawtsvalue(r)) < 0; |
@@ -199,7 +214,7 @@ int luaV_lessequal (lua_State *L, const TValue *l, const TValue *r) { | |||
199 | lua_Number nl, nr; | 214 | lua_Number nl, nr; |
200 | if (ttisinteger(l) && ttisinteger(r)) | 215 | if (ttisinteger(l) && ttisinteger(r)) |
201 | return (ivalue(l) <= ivalue(r)); | 216 | return (ivalue(l) <= ivalue(r)); |
202 | else if (tonumber(l, &nl) && tonumber(r, &nr)) | 217 | else if (tofloat(l, &nl) && tofloat(r, &nr)) |
203 | return luai_numle(nl, nr); | 218 | return luai_numle(nl, nr); |
204 | else if (ttisstring(l) && ttisstring(r)) | 219 | else if (ttisstring(l) && ttisstring(r)) |
205 | return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0; | 220 | return l_strcmp(rawtsvalue(l), rawtsvalue(r)) <= 0; |
@@ -222,7 +237,7 @@ int luaV_equalobj (lua_State *L, const TValue *t1, const TValue *t2) { | |||
222 | else { /* two numbers with different variants */ | 237 | else { /* two numbers with different variants */ |
223 | lua_Number n1, n2; | 238 | lua_Number n1, n2; |
224 | lua_assert(ttisnumber(t1) && ttisnumber(t2)); | 239 | lua_assert(ttisnumber(t1) && ttisnumber(t2)); |
225 | cast_void(tonumber(t1, &n1)); cast_void(tonumber(t2, &n2)); | 240 | cast_void(tofloat(t1, &n1)); cast_void(tofloat(t2, &n2)); |
226 | return luai_numeq(n1, n2); | 241 | return luai_numeq(n1, n2); |
227 | } | 242 | } |
228 | } | 243 | } |
@@ -377,7 +392,7 @@ lua_Integer luaV_pow (lua_State *L, lua_Integer x, lua_Integer y) { | |||
377 | /* number of bits in an integer */ | 392 | /* number of bits in an integer */ |
378 | #define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT) | 393 | #define NBITS cast_int(sizeof(lua_Integer) * CHAR_BIT) |
379 | 394 | ||
380 | LUAI_FUNC lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) { | 395 | lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) { |
381 | if (y < 0) { /* shift right? */ | 396 | if (y < 0) { /* shift right? */ |
382 | if (y <= -NBITS) return 0; | 397 | if (y <= -NBITS) return 0; |
383 | else return cast_integer(cast_unsigned(x) >> (-y)); | 398 | else return cast_integer(cast_unsigned(x) >> (-y)); |