diff options
| -rw-r--r-- | ltable.c | 13 |
1 files changed, 8 insertions, 5 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltable.c,v 2.75 2013/04/29 17:12:50 roberto Exp roberto $ | 2 | ** $Id: ltable.c,v 2.76 2013/05/27 12:43:37 roberto Exp roberto $ |
| 3 | ** Lua tables (hash) | 3 | ** Lua tables (hash) |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -18,6 +18,8 @@ | |||
| 18 | ** Hence even when the load factor reaches 100%, performance remains good. | 18 | ** Hence even when the load factor reaches 100%, performance remains good. |
| 19 | */ | 19 | */ |
| 20 | 20 | ||
| 21 | #include <float.h> | ||
| 22 | #include <math.h> | ||
| 21 | #include <string.h> | 23 | #include <string.h> |
| 22 | 24 | ||
| 23 | #define ltable_c | 25 | #define ltable_c |
| @@ -82,11 +84,12 @@ static const Node dummynode_ = { | |||
| 82 | 84 | ||
| 83 | 85 | ||
| 84 | /* | 86 | /* |
| 85 | ** hash for lua_Numbers | 87 | ** hash for floating-point numbers |
| 86 | */ | 88 | */ |
| 87 | static Node *hashnum (const Table *t, lua_Number n) { | 89 | static Node *hashfloat (const Table *t, lua_Number n) { |
| 88 | int i; | 90 | int i; |
| 89 | luai_hashnum(i, n); | 91 | n = l_mathop(frexp)(n, &i) * cast_num(INT_MAX - DBL_MAX_EXP); |
| 92 | i += cast_int(n); | ||
| 90 | if (i < 0) { | 93 | if (i < 0) { |
| 91 | if (cast(unsigned int, i) == 0u - i) /* use unsigned to avoid overflows */ | 94 | if (cast(unsigned int, i) == 0u - i) /* use unsigned to avoid overflows */ |
| 92 | i = 0; /* handle INT_MIN */ | 95 | i = 0; /* handle INT_MIN */ |
| @@ -106,7 +109,7 @@ static Node *mainposition (const Table *t, const TValue *key) { | |||
| 106 | case LUA_TNUMINT: | 109 | case LUA_TNUMINT: |
| 107 | return hashint(t, ivalue(key)); | 110 | return hashint(t, ivalue(key)); |
| 108 | case LUA_TNUMFLT: | 111 | case LUA_TNUMFLT: |
| 109 | return hashnum(t, fltvalue(key)); | 112 | return hashfloat(t, fltvalue(key)); |
| 110 | case LUA_TSHRSTR: | 113 | case LUA_TSHRSTR: |
| 111 | return hashstr(t, rawtsvalue(key)); | 114 | return hashstr(t, rawtsvalue(key)); |
| 112 | case LUA_TLNGSTR: { | 115 | case LUA_TLNGSTR: { |
