diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-06-20 14:37:31 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2013-06-20 14:37:31 -0300 |
commit | f45177f2d325d76e0622109ddf4f534a05e721e8 (patch) | |
tree | 3adad0c9c836262a620b1814173282b2db06aca1 | |
parent | d6f5fb2d2c5cfeab1e0aaddac7f121a909eb9408 (diff) | |
download | lua-f45177f2d325d76e0622109ddf4f534a05e721e8.tar.gz lua-f45177f2d325d76e0622109ddf4f534a05e721e8.tar.bz2 lua-f45177f2d325d76e0622109ddf4f534a05e721e8.zip |
In the table that hashes constants, use a light userdata as keys
to integer values to avoid collisions with floats with the same
numerical value
-rw-r--r-- | lcode.c | 18 |
1 files changed, 9 insertions, 9 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lcode.c,v 2.68 2013/05/02 12:37:24 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 2.69 2013/05/06 17:22:16 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 | */ |
@@ -333,9 +333,12 @@ int luaK_stringK (FuncState *fs, TString *s) { | |||
333 | 333 | ||
334 | 334 | ||
335 | int luaK_intK (FuncState *fs, lua_Integer n) { | 335 | int luaK_intK (FuncState *fs, lua_Integer n) { |
336 | TValue o; | 336 | TValue k, o; |
337 | /* use userdata as key to avoid collision with float with same value; | ||
338 | conversion to 'void*' used only for hash, no "precision" problems */ | ||
339 | setpvalue(&k, cast(void*, cast(size_t, n))); | ||
337 | setivalue(&o, n); | 340 | setivalue(&o, n); |
338 | return addk(fs, &o, &o); | 341 | return addk(fs, &k, &o); |
339 | } | 342 | } |
340 | 343 | ||
341 | 344 | ||
@@ -344,17 +347,14 @@ static int luaK_numberK (FuncState *fs, lua_Number r) { | |||
344 | lua_State *L = fs->ls->L; | 347 | lua_State *L = fs->ls->L; |
345 | TValue o; | 348 | TValue o; |
346 | setnvalue(&o, r); | 349 | setnvalue(&o, r); |
347 | if (r == 0 || luai_numisnan(NULL, r)) { /* handle -0 and NaN */ | 350 | if (r != 0 && !luai_numisnan(NULL, r)) /* avoid -0 and NaN */ |
351 | n = addk(fs, &o, &o); /* regular case */ | ||
352 | else { /* handle -0 and NaN */ | ||
348 | /* use raw representation as key to avoid numeric problems */ | 353 | /* use raw representation as key to avoid numeric problems */ |
349 | setsvalue(L, L->top++, luaS_newlstr(L, (char *)&r, sizeof(r))); | 354 | setsvalue(L, L->top++, luaS_newlstr(L, (char *)&r, sizeof(r))); |
350 | n = addk(fs, L->top - 1, &o); | 355 | n = addk(fs, L->top - 1, &o); |
351 | L->top--; | 356 | L->top--; |
352 | } | 357 | } |
353 | else { | ||
354 | TValue k; | ||
355 | setnvalue(&k, r + 0.5); /* ???? (avoid some collisions with ints) */ | ||
356 | n = addk(fs, &k, &o); /* regular case */ | ||
357 | } | ||
358 | return n; | 358 | return n; |
359 | } | 359 | } |
360 | 360 | ||