diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-02-20 15:15:33 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-02-20 15:15:33 -0300 |
commit | 099442c41f2cec6122690e6c8f2e11327613e6f6 (patch) | |
tree | 73599b274ea4a9b96906ff8160eeb4a524702a8e /ltable.c | |
parent | 27600fe87a6fafdfd4ddddeb390591fe749b480f (diff) | |
download | lua-099442c41f2cec6122690e6c8f2e11327613e6f6.tar.gz lua-099442c41f2cec6122690e6c8f2e11327613e6f6.tar.bz2 lua-099442c41f2cec6122690e6c8f2e11327613e6f6.zip |
better separation between basic types
Diffstat (limited to 'ltable.c')
-rw-r--r-- | ltable.c | 38 |
1 files changed, 27 insertions, 11 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: ltable.c,v 1.74 2001/01/30 19:48:37 roberto Exp roberto $ | 2 | ** $Id: ltable.c,v 1.75 2001/02/01 17:40:48 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 | */ |
@@ -31,7 +31,7 @@ | |||
31 | #define TagDefault LUA_TTABLE | 31 | #define TagDefault LUA_TTABLE |
32 | 32 | ||
33 | 33 | ||
34 | #define hashnum(t,n) (&t->node[lmod((luint32)(lint32)(n), t->size)]) | 34 | #define hashnum(t,n) (&t->node[lmod((lu_hash)(ls_hash)(n), t->size)]) |
35 | #define hashstr(t,str) (&t->node[lmod((str)->u.s.hash, t->size)]) | 35 | #define hashstr(t,str) (&t->node[lmod((str)->u.s.hash, t->size)]) |
36 | #define hashpointer(t,p) (&t->node[lmod(IntPoint(p), t->size)]) | 36 | #define hashpointer(t,p) (&t->node[lmod(IntPoint(p), t->size)]) |
37 | 37 | ||
@@ -81,12 +81,26 @@ int luaH_nexti (Hash *t, int i) { | |||
81 | } | 81 | } |
82 | 82 | ||
83 | 83 | ||
84 | static void setnodevector (lua_State *L, Hash *t, luint32 size) { | 84 | #define check_grow(L, p, n) \ |
85 | if ((p) >= MAX_INT/(n)) luaD_error(L, "table overflow"); | ||
86 | |||
87 | /* | ||
88 | ** returns smaller power of 2 larger than `n' (minimum is MINPOWER2) | ||
89 | */ | ||
90 | static int power2 (lua_State *L, int n) { | ||
91 | int p = MINPOWER2; | ||
92 | while (p <= n) { | ||
93 | check_grow(L, p, 2); | ||
94 | p *= 2; | ||
95 | } | ||
96 | return p; | ||
97 | } | ||
98 | |||
99 | |||
100 | static void setnodevector (lua_State *L, Hash *t, int size) { | ||
85 | int i; | 101 | int i; |
86 | if (size > MAX_INT) | ||
87 | luaD_error(L, "table overflow"); | ||
88 | t->node = luaM_newvector(L, size, Node); | 102 | t->node = luaM_newvector(L, size, Node); |
89 | for (i=0; i<(int)size; i++) { | 103 | for (i=0; i<size; i++) { |
90 | t->node[i].next = NULL; | 104 | t->node[i].next = NULL; |
91 | t->node[i].key_tt = LUA_TNIL; | 105 | t->node[i].key_tt = LUA_TNIL; |
92 | setnilvalue(&t->node[i].val); | 106 | setnilvalue(&t->node[i].val); |
@@ -104,7 +118,7 @@ Hash *luaH_new (lua_State *L, int size) { | |||
104 | t->mark = t; | 118 | t->mark = t; |
105 | t->size = 0; | 119 | t->size = 0; |
106 | t->node = NULL; | 120 | t->node = NULL; |
107 | setnodevector(L, t, luaO_power2(size)); | 121 | setnodevector(L, t, power2(L, size)); |
108 | return t; | 122 | return t; |
109 | } | 123 | } |
110 | 124 | ||
@@ -134,13 +148,15 @@ static void rehash (lua_State *L, Hash *t) { | |||
134 | int nelems = numuse(t); | 148 | int nelems = numuse(t); |
135 | int i; | 149 | int i; |
136 | lua_assert(nelems<=oldsize); | 150 | lua_assert(nelems<=oldsize); |
137 | if (nelems >= oldsize-oldsize/4) /* using more than 3/4? */ | 151 | if (nelems >= oldsize-oldsize/4) { /* using more than 3/4? */ |
138 | setnodevector(L, t, (luint32)oldsize*2); | 152 | check_grow(L, oldsize, 2); |
153 | setnodevector(L, t, oldsize*2); /* grow array */ | ||
154 | } | ||
139 | else if (nelems <= oldsize/4 && /* less than 1/4? */ | 155 | else if (nelems <= oldsize/4 && /* less than 1/4? */ |
140 | oldsize > MINPOWER2) | 156 | oldsize > MINPOWER2) |
141 | setnodevector(L, t, oldsize/2); | 157 | setnodevector(L, t, oldsize/2); /* shrink array */ |
142 | else | 158 | else |
143 | setnodevector(L, t, oldsize); | 159 | setnodevector(L, t, oldsize); /* just rehash; keep the same size */ |
144 | for (i=0; i<oldsize; i++) { | 160 | for (i=0; i<oldsize; i++) { |
145 | Node *old = nold+i; | 161 | Node *old = nold+i; |
146 | if (ttype(&old->val) != LUA_TNIL) { | 162 | if (ttype(&old->val) != LUA_TNIL) { |