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 | |
| 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
| -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)); |
