aboutsummaryrefslogtreecommitdiff
path: root/ltable.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-12-28 10:55:41 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2000-12-28 10:55:41 -0200
commit0183b8030c80f57b87874ff7867ccdb172d9d3dc (patch)
tree1033b5a84489a2f1f1bd210b1b120155cd7aeed7 /ltable.c
parent8c49e198654567f770a7d5081b886a7c35201d81 (diff)
downloadlua-0183b8030c80f57b87874ff7867ccdb172d9d3dc.tar.gz
lua-0183b8030c80f57b87874ff7867ccdb172d9d3dc.tar.bz2
lua-0183b8030c80f57b87874ff7867ccdb172d9d3dc.zip
`free' gets size of the block: complete control over memory use
Diffstat (limited to 'ltable.c')
-rw-r--r--ltable.c15
1 files changed, 4 insertions, 11 deletions
diff --git a/ltable.c b/ltable.c
index 82f47808..1895029c 100644
--- a/ltable.c
+++ b/ltable.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: ltable.c,v 1.60 2000/12/04 18:33:40 roberto Exp roberto $ 2** $Id: ltable.c,v 1.61 2000/12/22 16:57:46 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*/
@@ -27,9 +27,6 @@
27#include "ltable.h" 27#include "ltable.h"
28 28
29 29
30#define gcsize(L, n) (sizeof(Hash)+(n)*sizeof(Node))
31
32
33 30
34#define TagDefault LUA_TTABLE 31#define TagDefault LUA_TTABLE
35 32
@@ -167,8 +164,6 @@ static void setnodevector (lua_State *L, Hash *t, luint32 size) {
167 ttype(&t->node[i].key) = ttype(&t->node[i].val) = LUA_TNIL; 164 ttype(&t->node[i].key) = ttype(&t->node[i].val) = LUA_TNIL;
168 t->node[i].next = NULL; 165 t->node[i].next = NULL;
169 } 166 }
170 L->nblocks -= gcsize(L, t->size); /* old size */
171 L->nblocks += gcsize(L, size); /* new size */
172 t->size = size; 167 t->size = size;
173 t->firstfree = &t->node[size-1]; /* first free position to be used */ 168 t->firstfree = &t->node[size-1]; /* first free position to be used */
174} 169}
@@ -181,7 +176,6 @@ Hash *luaH_new (lua_State *L, int size) {
181 L->roottable = t; 176 L->roottable = t;
182 t->mark = t; 177 t->mark = t;
183 t->size = 0; 178 t->size = 0;
184 L->nblocks += gcsize(L, 0);
185 t->node = NULL; 179 t->node = NULL;
186 setnodevector(L, t, luaO_power2(size)); 180 setnodevector(L, t, luaO_power2(size));
187 return t; 181 return t;
@@ -189,9 +183,8 @@ Hash *luaH_new (lua_State *L, int size) {
189 183
190 184
191void luaH_free (lua_State *L, Hash *t) { 185void luaH_free (lua_State *L, Hash *t) {
192 L->nblocks -= gcsize(L, t->size); 186 luaM_freearray(L, t->node, t->size, Node);
193 luaM_free(L, t->node); 187 luaM_freelem(L, t, Hash);
194 luaM_free(L, t);
195} 188}
196 189
197 190
@@ -226,7 +219,7 @@ static void rehash (lua_State *L, Hash *t) {
226 if (ttype(&old->val) != LUA_TNIL) 219 if (ttype(&old->val) != LUA_TNIL)
227 *luaH_set(L, t, &old->key) = old->val; 220 *luaH_set(L, t, &old->key) = old->val;
228 } 221 }
229 luaM_free(L, nold); /* free old array */ 222 luaM_freearray(L, nold, oldsize, Node); /* free old array */
230} 223}
231 224
232 225