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