aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2015-02-20 12:05:01 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2015-02-20 12:05:01 -0200
commit397ce11996bb1b5a6ef81fdf44252cf58b230937 (patch)
tree53d086c60232e526717de58abd96c965417bdad7
parent97f2aa5a443b75f2528a27e6e78fe18f66cb4f87 (diff)
downloadlua-397ce11996bb1b5a6ef81fdf44252cf58b230937.tar.gz
lua-397ce11996bb1b5a6ef81fdf44252cf58b230937.tar.bz2
lua-397ce11996bb1b5a6ef81fdf44252cf58b230937.zip
make 'hashfloat' configurable
-rw-r--r--ltable.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/ltable.c b/ltable.c
index 3b1e6a1f..8d62ed60 100644
--- a/ltable.c
+++ b/ltable.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltable.c,v 2.102 2015/02/13 13:05:34 roberto Exp roberto $ 2** $Id: ltable.c,v 2.103 2015/02/16 13:15:00 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*/
@@ -97,7 +97,7 @@ static int numisinteger (lua_Number x, lua_Integer *p) {
97/* 97/*
98** Hash for floating-point numbers. 98** Hash for floating-point numbers.
99** The main computation should be just 99** The main computation should be just
100** n = frepx(n, &i); hash = (n * INT_MAX) + i 100** n = frepx(n, &i); return (n * INT_MAX) + i
101** but there are some numerical subtleties. 101** but there are some numerical subtleties.
102** In a two-complement representation, INT_MAX does not has an exact 102** In a two-complement representation, INT_MAX does not has an exact
103** representation as a float, but INT_MIN does; because the absolute 103** representation as a float, but INT_MIN does; because the absolute
@@ -107,21 +107,21 @@ static int numisinteger (lua_Number x, lua_Integer *p) {
107** adding 'i'; the use of '~u' (instead of '-u') avoids problems with 107** adding 'i'; the use of '~u' (instead of '-u') avoids problems with
108** INT_MIN. 108** INT_MIN.
109*/ 109*/
110static Node *hashfloat (const Table *t, lua_Number n) { 110#if !defined(l_hashfloat)
111static int l_hashfloat (lua_Number n) {
111 int i; 112 int i;
112 lua_Integer ni; 113 lua_Integer ni;
113 n = l_mathop(frexp)(n, &i) * -cast_num(INT_MIN); 114 n = l_mathop(frexp)(n, &i) * -cast_num(INT_MIN);
114 if (!lua_numbertointeger(n, &ni)) { /* is 'n' inf/-inf/NaN? */ 115 if (!lua_numbertointeger(n, &ni)) { /* is 'n' inf/-inf/NaN? */
115 lua_assert(luai_numisnan(n) || l_mathop(fabs)(n) == HUGE_VAL); 116 lua_assert(luai_numisnan(n) || l_mathop(fabs)(n) == HUGE_VAL);
116 i = 0; 117 return 0;
117 } 118 }
118 else { /* normal case */ 119 else { /* normal case */
119 unsigned int u = cast(unsigned int, i) + cast(unsigned int, ni); 120 unsigned int u = cast(unsigned int, i) + cast(unsigned int, ni);
120 i = (u <= cast(unsigned int, INT_MAX) ? u : ~u); 121 return cast_int(u <= cast(unsigned int, INT_MAX) ? u : ~u);
121 } 122 }
122 return hashmod(t, i);
123} 123}
124 124#endif
125 125
126 126
127/* 127/*
@@ -133,7 +133,7 @@ static Node *mainposition (const Table *t, const TValue *key) {
133 case LUA_TNUMINT: 133 case LUA_TNUMINT:
134 return hashint(t, ivalue(key)); 134 return hashint(t, ivalue(key));
135 case LUA_TNUMFLT: 135 case LUA_TNUMFLT:
136 return hashfloat(t, fltvalue(key)); 136 return hashmod(t, l_hashfloat(fltvalue(key)));
137 case LUA_TSHRSTR: 137 case LUA_TSHRSTR:
138 return hashstr(t, tsvalue(key)); 138 return hashstr(t, tsvalue(key));
139 case LUA_TLNGSTR: { 139 case LUA_TLNGSTR: {