diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-11-24 15:39:56 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2000-11-24 15:39:56 -0200 |
commit | 96253ed8ceb38afa50887ccb5500442b5b220f08 (patch) | |
tree | 4b42b80f781b0cbe95782f8e8ebec06d85e80ae4 /ltable.c | |
parent | 35d6b1505702b0f4a2eee0e6d2f8dfc50943a1a7 (diff) | |
download | lua-96253ed8ceb38afa50887ccb5500442b5b220f08.tar.gz lua-96253ed8ceb38afa50887ccb5500442b5b220f08.tar.bz2 lua-96253ed8ceb38afa50887ccb5500442b5b220f08.zip |
better support for 64-bit machines (avoid excessive use of longs)
Diffstat (limited to 'ltable.c')
-rw-r--r-- | ltable.c | 17 |
1 files changed, 10 insertions, 7 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltable.c,v 1.57 2000/10/05 12:14:08 roberto Exp roberto $ | 2 | ** $Id: ltable.c,v 1.58 2000/10/26 12:47:05 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 | */ |
@@ -40,10 +40,10 @@ | |||
40 | ** of its hash value) | 40 | ** of its hash value) |
41 | */ | 41 | */ |
42 | Node *luaH_mainposition (const Hash *t, const TObject *key) { | 42 | Node *luaH_mainposition (const Hash *t, const TObject *key) { |
43 | unsigned long h; | 43 | luint32 h; |
44 | switch (ttype(key)) { | 44 | switch (ttype(key)) { |
45 | case LUA_TNUMBER: | 45 | case LUA_TNUMBER: |
46 | h = (unsigned long)(long)nvalue(key); | 46 | h = (luint32)(lint32)nvalue(key); |
47 | break; | 47 | break; |
48 | case LUA_TSTRING: | 48 | case LUA_TSTRING: |
49 | h = tsvalue(key)->u.s.hash; | 49 | h = tsvalue(key)->u.s.hash; |
@@ -82,7 +82,7 @@ static const TObject *luaH_getany (lua_State *L, const Hash *t, | |||
82 | 82 | ||
83 | /* specialized version for numbers */ | 83 | /* specialized version for numbers */ |
84 | const TObject *luaH_getnum (const Hash *t, Number key) { | 84 | const TObject *luaH_getnum (const Hash *t, Number key) { |
85 | Node *n = &t->node[(unsigned long)(long)key&(t->size-1)]; | 85 | Node *n = &t->node[(luint32)(lint32)key&(t->size-1)]; |
86 | do { | 86 | do { |
87 | if (ttype(&n->key) == LUA_TNUMBER && nvalue(&n->key) == key) | 87 | if (ttype(&n->key) == LUA_TNUMBER && nvalue(&n->key) == key) |
88 | return &n->val; | 88 | return &n->val; |
@@ -158,7 +158,7 @@ void luaH_remove (Hash *t, TObject *key) { | |||
158 | } | 158 | } |
159 | 159 | ||
160 | 160 | ||
161 | static void setnodevector (lua_State *L, Hash *t, lint32 size) { | 161 | static void setnodevector (lua_State *L, Hash *t, luint32 size) { |
162 | int i; | 162 | int i; |
163 | if (size > MAX_INT) | 163 | if (size > MAX_INT) |
164 | lua_error(L, "table overflow"); | 164 | lua_error(L, "table overflow"); |
@@ -167,7 +167,10 @@ static void setnodevector (lua_State *L, Hash *t, lint32 size) { | |||
167 | ttype(&t->node[i].key) = ttype(&t->node[i].val) = LUA_TNIL; | 167 | ttype(&t->node[i].key) = ttype(&t->node[i].val) = LUA_TNIL; |
168 | t->node[i].next = NULL; | 168 | t->node[i].next = NULL; |
169 | } | 169 | } |
170 | L->nblocks += gcsize(L, size) - gcsize(L, t->size); | 170 | if ((int)size > t->size) /* avoid "unsigned negative" values */ |
171 | L->nblocks += gcsize(L, size) - gcsize(L, t->size); | ||
172 | else | ||
173 | L->nblocks -= gcsize(L, t->size) - gcsize(L, size); | ||
171 | t->size = size; | 174 | t->size = size; |
172 | t->firstfree = &t->node[size-1]; /* first free position to be used */ | 175 | t->firstfree = &t->node[size-1]; /* first free position to be used */ |
173 | } | 176 | } |
@@ -214,7 +217,7 @@ static void rehash (lua_State *L, Hash *t) { | |||
214 | int i; | 217 | int i; |
215 | LUA_ASSERT(nelems<=oldsize, "wrong count"); | 218 | LUA_ASSERT(nelems<=oldsize, "wrong count"); |
216 | if (nelems >= oldsize-oldsize/4) /* using more than 3/4? */ | 219 | if (nelems >= oldsize-oldsize/4) /* using more than 3/4? */ |
217 | setnodevector(L, t, (lint32)oldsize*2); | 220 | setnodevector(L, t, (luint32)oldsize*2); |
218 | else if (nelems <= oldsize/4 && /* less than 1/4? */ | 221 | else if (nelems <= oldsize/4 && /* less than 1/4? */ |
219 | oldsize > MINPOWER2) | 222 | oldsize > MINPOWER2) |
220 | setnodevector(L, t, oldsize/2); | 223 | setnodevector(L, t, oldsize/2); |