aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWaldemar Celes <celes@tecgraf.puc-rio.br>1994-04-20 19:07:57 -0300
committerWaldemar Celes <celes@tecgraf.puc-rio.br>1994-04-20 19:07:57 -0300
commit44521b21e542831a95de0c63271cd38d1cd4d394 (patch)
tree0fd861510cd5c0a1880410442c642c2388a02e57
parentf8fb7b39478c3468192c69fcb2154f9022dbab64 (diff)
downloadlua-44521b21e542831a95de0c63271cd38d1cd4d394.tar.gz
lua-44521b21e542831a95de0c63271cd38d1cd4d394.tar.bz2
lua-44521b21e542831a95de0c63271cd38d1cd4d394.zip
Implementacao da nova estrategia para armazenar os arrays
em lista encadeada.
-rw-r--r--hash.c120
-rw-r--r--hash.h10
-rw-r--r--opcode.c10
-rw-r--r--opcode.h3
-rw-r--r--table.c128
-rw-r--r--table.h26
6 files changed, 175 insertions, 122 deletions
diff --git a/hash.c b/hash.c
index 1704acfe..549338a1 100644
--- a/hash.c
+++ b/hash.c
@@ -4,7 +4,7 @@
4** Luiz Henrique de Figueiredo - 17 Aug 90 4** Luiz Henrique de Figueiredo - 17 Aug 90
5*/ 5*/
6 6
7char *rcs_hash="$Id: hash.c,v 1.1 1993/12/17 18:41:19 celes Exp celes $"; 7char *rcs_hash="$Id: hash.c,v 1.2 1994/03/28 15:14:02 celes Exp celes $";
8 8
9#include <string.h> 9#include <string.h>
10#include <stdlib.h> 10#include <stdlib.h>
@@ -26,10 +26,23 @@ char *rcs_hash="$Id: hash.c,v 1.1 1993/12/17 18:41:19 celes Exp celes $";
26#define nhash(t) ((t)->nhash) 26#define nhash(t) ((t)->nhash)
27#define nodelist(t) ((t)->list) 27#define nodelist(t) ((t)->list)
28#define list(t,i) ((t)->list[i]) 28#define list(t,i) ((t)->list[i])
29#define markarray(t) ((t)->mark)
29#define ref_tag(n) (tag(&(n)->ref)) 30#define ref_tag(n) (tag(&(n)->ref))
30#define ref_nvalue(n) (nvalue(&(n)->ref)) 31#define ref_nvalue(n) (nvalue(&(n)->ref))
31#define ref_svalue(n) (svalue(&(n)->ref)) 32#define ref_svalue(n) (svalue(&(n)->ref))
32 33
34#ifndef ARRAYBLOCK
35#define ARRAYBLOCK 50
36#endif
37
38typedef struct ArrayList
39{
40 Hash *array;
41 struct ArrayList *next;
42} ArrayList;
43
44static ArrayList *listhead = NULL;
45
33static int head (Hash *t, Object *ref) /* hash function */ 46static int head (Hash *t, Object *ref) /* hash function */
34{ 47{
35 if (tag(ref) == T_NUMBER) return (((int)nvalue(ref))%nhash(t)); 48 if (tag(ref) == T_NUMBER) return (((int)nvalue(ref))%nhash(t));
@@ -91,7 +104,7 @@ static void freelist (Node *n)
91/* 104/*
92** Create a new hash. Return the hash pointer or NULL on error. 105** Create a new hash. Return the hash pointer or NULL on error.
93*/ 106*/
94Hash *lua_hashcreate (unsigned int nhash) 107static Hash *hashcreate (unsigned int nhash)
95{ 108{
96 Hash *t = new (Hash); 109 Hash *t = new (Hash);
97 if (t == NULL) 110 if (t == NULL)
@@ -113,7 +126,7 @@ Hash *lua_hashcreate (unsigned int nhash)
113/* 126/*
114** Delete a hash 127** Delete a hash
115*/ 128*/
116void lua_hashdelete (Hash *h) 129static void hashdelete (Hash *h)
117{ 130{
118 int i; 131 int i;
119 for (i=0; i<nhash(h); i++) 132 for (i=0; i<nhash(h); i++)
@@ -122,6 +135,86 @@ void lua_hashdelete (Hash *h)
122 free(h); 135 free(h);
123} 136}
124 137
138
139/*
140** Mark a hash and check its elements
141*/
142void lua_hashmark (Hash *h)
143{
144 if (markarray(h) == 0)
145 {
146 int i;
147 markarray(h) = 1;
148 for (i=0; i<nhash(h); i++)
149 {
150 Node *n;
151 for (n = list(h,i); n != NULL; n = n->next)
152 {
153 lua_markobject(&n->ref);
154 lua_markobject(&n->val);
155 }
156 }
157 }
158}
159
160/*
161** Garbage collection to arrays
162** Delete all unmarked arrays.
163*/
164void lua_hashcollector (void)
165{
166 ArrayList *curr = listhead, *prev = NULL;
167 while (curr != NULL)
168 {
169 ArrayList *next = curr->next;
170 if (markarray(curr->array) != 1)
171 {
172 if (prev == NULL) listhead = next;
173 else prev->next = next;
174 hashdelete(curr->array);
175 free(curr);
176 }
177 else
178 {
179 markarray(curr->array) = 0;
180 prev = curr;
181 }
182 curr = next;
183 }
184}
185
186
187/*
188** Create a new array
189** This function insert the new array at array list. It also
190** execute garbage collection if the number of array created
191** exceed a pre-defined range.
192*/
193Hash *lua_createarray (int nhash)
194{
195 ArrayList *new = new(ArrayList);
196 if (new == NULL)
197 {
198 lua_error ("not enough memory");
199 return NULL;
200 }
201 new->array = hashcreate(nhash);
202 if (new->array == NULL)
203 {
204 lua_error ("not enough memory");
205 return NULL;
206 }
207
208 if (lua_nentity == lua_block)
209 lua_pack();
210
211 lua_nentity++;
212 new->next = listhead;
213 listhead = new;
214 return new->array;
215}
216
217
125/* 218/*
126** If the hash node is present, return its pointer, otherwise create a new 219** If the hash node is present, return its pointer, otherwise create a new
127** node for the given reference and also return its pointer. 220** node for the given reference and also return its pointer.
@@ -151,26 +244,6 @@ Object *lua_hashdefine (Hash *t, Object *ref)
151 return (&n->val); 244 return (&n->val);
152} 245}
153 246
154/*
155** Mark a hash and check its elements
156*/
157void lua_hashmark (Hash *h)
158{
159 int i;
160
161 markarray(h) = 1;
162
163 for (i=0; i<nhash(h); i++)
164 {
165 Node *n;
166 for (n = list(h,i); n != NULL; n = n->next)
167 {
168 lua_markobject (&n->ref);
169 lua_markobject (&n->val);
170 }
171 }
172}
173
174 247
175/* 248/*
176** Internal function to manipulate arrays. 249** Internal function to manipulate arrays.
@@ -178,7 +251,6 @@ void lua_hashmark (Hash *h)
178** in the hash. 251** in the hash.
179** This function pushs the element value and its reference to the stack. 252** This function pushs the element value and its reference to the stack.
180*/ 253*/
181#include "lua.h"
182static void firstnode (Hash *a, int h) 254static void firstnode (Hash *a, int h)
183{ 255{
184 if (h < nhash(a)) 256 if (h < nhash(a))
diff --git a/hash.h b/hash.h
index 0a66a492..cea34df1 100644
--- a/hash.h
+++ b/hash.h
@@ -2,7 +2,7 @@
2** hash.h 2** hash.h
3** hash manager for lua 3** hash manager for lua
4** Luiz Henrique de Figueiredo - 17 Aug 90 4** Luiz Henrique de Figueiredo - 17 Aug 90
5** $Id: $ 5** $Id: hash.h,v 1.1 1993/12/17 18:41:19 celes Exp celes $
6*/ 6*/
7 7
8#ifndef hash_h 8#ifndef hash_h
@@ -22,13 +22,11 @@ typedef struct Hash
22 Node **list; 22 Node **list;
23} Hash; 23} Hash;
24 24
25#define markarray(t) ((t)->mark)
26 25
27Hash *lua_hashcreate (unsigned int nhash); 26Hash *lua_createarray (int nhash);
28void lua_hashdelete (Hash *h); 27void lua_hashmark (Hash *h);
28void lua_hashcollector (void);
29Object *lua_hashdefine (Hash *t, Object *ref); 29Object *lua_hashdefine (Hash *t, Object *ref);
30void lua_hashmark (Hash *h);
31
32void lua_next (void); 30void lua_next (void);
33 31
34#endif 32#endif
diff --git a/opcode.c b/opcode.c
index aaf38b51..261baa5d 100644
--- a/opcode.c
+++ b/opcode.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_opcode="$Id: opcode.c,v 1.3 1994/03/28 15:14:02 celes Exp celes $"; 6char *rcs_opcode="$Id: opcode.c,v 1.4 1994/04/13 21:37:20 celes Exp celes $";
7 7
8#include <stdio.h> 8#include <stdio.h>
9#include <stdlib.h> 9#include <stdlib.h>
@@ -319,7 +319,7 @@ int lua_execute (Byte *pc)
319 if (tonumber(top-1)) return 1; 319 if (tonumber(top-1)) return 1;
320 if (nvalue(top-1) <= 0) nvalue(top-1) = 101; 320 if (nvalue(top-1) <= 0) nvalue(top-1) = 101;
321 } 321 }
322 avalue(top-1) = lua_createarray(lua_hashcreate(nvalue(top-1))); 322 avalue(top-1) = lua_createarray(nvalue(top-1));
323 if (avalue(top-1) == NULL) 323 if (avalue(top-1) == NULL)
324 return 1; 324 return 1;
325 tag(top-1) = T_ARRAY; 325 tag(top-1) = T_ARRAY;
@@ -603,13 +603,13 @@ int lua_execute (Byte *pc)
603 603
604 604
605/* 605/*
606** Mark all strings and arrays used by any object stored at stack. 606** Traverse all objects on stack
607*/ 607*/
608void lua_markstack (void) 608void lua_travstack (void (*fn)(Object *))
609{ 609{
610 Object *o; 610 Object *o;
611 for (o = top-1; o >= stack; o--) 611 for (o = top-1; o >= stack; o--)
612 lua_markobject (o); 612 fn (o);
613} 613}
614 614
615/* 615/*
diff --git a/opcode.h b/opcode.h
index f48e50fd..38202f6e 100644
--- a/opcode.h
+++ b/opcode.h
@@ -1,6 +1,6 @@
1/* 1/*
2** TeCGraf - PUC-Rio 2** TeCGraf - PUC-Rio
3** $Id: opcode.h,v 1.3 1994/02/13 20:35:53 roberto Exp celes $ 3** $Id: opcode.h,v 1.4 1994/04/13 21:37:20 celes Exp celes $
4*/ 4*/
5 5
6#ifndef opcode_h 6#ifndef opcode_h
@@ -159,5 +159,6 @@ void lua_obj2number (void);
159void lua_print (void); 159void lua_print (void);
160void lua_internaldofile (void); 160void lua_internaldofile (void);
161void lua_internaldostring (void); 161void lua_internaldostring (void);
162void lua_travstack (void (*fn)(Object *));
162 163
163#endif 164#endif
diff --git a/table.c b/table.c
index abbb8850..5d2f1b28 100644
--- a/table.c
+++ b/table.c
@@ -3,7 +3,7 @@
3** Module to control static tables 3** Module to control static tables
4*/ 4*/
5 5
6char *rcs_table="$Id: table.c,v 1.4 1994/04/06 12:55:08 celes Exp celes $"; 6char *rcs_table="$Id: table.c,v 1.5 1994/04/13 22:10:21 celes Exp celes $";
7 7
8#include <stdlib.h> 8#include <stdlib.h>
9#include <string.h> 9#include <string.h>
@@ -75,18 +75,19 @@ static char *stringbuffer[MAXSTRING];
75char **lua_string = stringbuffer; 75char **lua_string = stringbuffer;
76Word lua_nstring=0; 76Word lua_nstring=0;
77 77
78#ifndef MAXARRAY
79#define MAXARRAY 512
80#endif
81static Hash *arraybuffer[MAXARRAY];
82Hash **lua_array = arraybuffer;
83Word lua_narray=0;
84
85#define MAXFILE 20 78#define MAXFILE 20
86char *lua_file[MAXFILE]; 79char *lua_file[MAXFILE];
87int lua_nfile; 80int lua_nfile;
88 81
89 82
83#define markstring(s) (*((s)-1))
84
85
86/* Variables to controll garbage collection */
87Word lua_block=10; /* to check when garbage collector will be called */
88Word lua_nentity; /* counter of new entities (strings and arrays) */
89
90
90/* 91/*
91** Given a name, search it at symbol table and return its index. If not 92** Given a name, search it at symbol table and return its index. If not
92** found, allocate at end of table, checking oveflow and return its index. 93** found, allocate at end of table, checking oveflow and return its index.
@@ -159,65 +160,64 @@ int lua_findconstant (char *s)
159 160
160 161
161/* 162/*
163** Traverse symbol table objects
164*/
165void lua_travsymbol (void (*fn)(Object *))
166{
167 int i;
168 for (i=0; i<lua_ntable; i++)
169 fn(&s_object(i));
170}
171
172
173/*
162** Mark an object if it is a string or a unmarked array. 174** Mark an object if it is a string or a unmarked array.
163*/ 175*/
164void lua_markobject (Object *o) 176void lua_markobject (Object *o)
165{ 177{
166 if (tag(o) == T_STRING) 178 if (tag(o) == T_STRING)
167 lua_markstring (svalue(o)) = 1; 179 markstring (svalue(o)) = 1;
168 else if (tag(o) == T_ARRAY && markarray(avalue(o)) == 0) 180 else if (tag(o) == T_ARRAY)
169 lua_hashmark (avalue(o)); 181 lua_hashmark (avalue(o));
170} 182}
171 183
184
172/* 185/*
173** Mark all strings and arrays used by any object stored at symbol table. 186** Garbage collection.
187** Delete all unused strings and arrays.
174*/ 188*/
175static void lua_marktable (void) 189void lua_pack (void)
176{ 190{
177 int i; 191 /* mark stack strings */
178 for (i=0; i<lua_ntable; i++) 192 lua_travstack(lua_markobject);
179 lua_markobject (&s_object(i)); 193
194 /* mark symbol table strings */
195 lua_travsymbol(lua_markobject);
196
197 lua_stringcollector();
198 lua_hashcollector();
199
200 lua_nentity = 0; /* reset counter */
180} 201}
181 202
182/* 203/*
183** Simulate a garbage colection. When string table or array table overflows, 204** Garbage collection to atrings.
184** this function check if all allocated strings and arrays are in use. If 205** Delete all unmarked strings
185** there are unused ones, pack (compress) the tables.
186*/ 206*/
187static void lua_pack (void) 207void lua_stringcollector (void)
188{ 208{
189 lua_markstack (); 209 int i, j;
190 lua_marktable (); 210 for (i=j=0; i<lua_nstring; i++)
191 211 if (markstring(lua_string[i]) == 1)
192 { /* pack string */ 212 {
193 int i, j; 213 lua_string[j++] = lua_string[i];
194 for (i=j=0; i<lua_nstring; i++) 214 markstring(lua_string[i]) = 0;
195 if (lua_markstring(lua_string[i]) == 1) 215 }
196 { 216 else
197 lua_string[j++] = lua_string[i]; 217 {
198 lua_markstring(lua_string[i]) = 0; 218 free (lua_string[i]-1);
199 } 219 }
200 else 220 lua_nstring = j;
201 {
202 free (lua_string[i]-1);
203 }
204 lua_nstring = j;
205 }
206
207 { /* pack array */
208 int i, j;
209 for (i=j=0; i<lua_narray; i++)
210 if (markarray(lua_array[i]) == 1)
211 {
212 lua_array[j++] = lua_array[i];
213 markarray(lua_array[i]) = 0;
214 }
215 else
216 {
217 lua_hashdelete (lua_array[i]);
218 }
219 lua_narray = j;
220 }
221} 221}
222 222
223/* 223/*
@@ -237,7 +237,7 @@ char *lua_createstring (char *s)
237 return lua_string[i]; 237 return lua_string[i];
238 } 238 }
239 239
240 if (lua_nstring >= MAXSTRING-1) 240 if (lua_nentity == lua_block || lua_nstring >= MAXSTRING-1)
241 { 241 {
242 lua_pack (); 242 lua_pack ();
243 if (lua_nstring >= MAXSTRING-1) 243 if (lua_nstring >= MAXSTRING-1)
@@ -247,33 +247,11 @@ char *lua_createstring (char *s)
247 } 247 }
248 } 248 }
249 lua_string[lua_nstring++] = s; 249 lua_string[lua_nstring++] = s;
250 lua_nentity++;
250 return s; 251 return s;
251} 252}
252 253
253/* 254/*
254** Allocate a new array, already created, at array table. The function puts
255** it at the end of the table, checking overflow, and returns its own pointer,
256** or NULL on error.
257*/
258void *lua_createarray (void *a)
259{
260 if (a == NULL) return NULL;
261
262 if (lua_narray >= MAXARRAY-1)
263 {
264 lua_pack ();
265 if (lua_narray >= MAXARRAY-1)
266 {
267 lua_error ("indexed table overflow");
268 return NULL;
269 }
270 }
271 lua_array[lua_narray++] = a;
272 return a;
273}
274
275
276/*
277** Add a file name at file table, checking overflow. This function also set 255** Add a file name at file table, checking overflow. This function also set
278** the external variable "lua_filename" with the function filename set. 256** the external variable "lua_filename" with the function filename set.
279** Return 0 on success or 1 on error. 257** Return 0 on success or 1 on error.
diff --git a/table.h b/table.h
index ca246dc6..17be39e4 100644
--- a/table.h
+++ b/table.h
@@ -1,7 +1,7 @@
1/* 1/*
2** Module to control static tables 2** Module to control static tables
3** TeCGraf - PUC-Rio 3** TeCGraf - PUC-Rio
4** $Id: table.h,v 1.1 1993/12/17 18:41:19 celes Exp roberto $ 4** $Id: table.h,v 1.2 1993/12/22 21:15:16 roberto Exp celes $
5*/ 5*/
6 6
7#ifndef table_h 7#ifndef table_h
@@ -22,17 +22,21 @@ extern Word lua_narray;
22extern char *lua_file[]; 22extern char *lua_file[];
23extern int lua_nfile; 23extern int lua_nfile;
24 24
25#define lua_markstring(s) (*((s)-1)) 25extern Word lua_block;
26extern Word lua_nentity;
26 27
27 28
28int lua_findsymbol (char *s); 29
29int lua_findconstant (char *s); 30int lua_findsymbol (char *s);
30void lua_markobject (Object *o); 31int lua_findconstant (char *s);
31char *lua_createstring (char *s); 32void lua_travsymbol (void (*fn)(Object *));
32void *lua_createarray (void *a); 33void lua_markobject (Object *o);
33int lua_addfile (char *fn); 34void lua_pack (void);
34int lua_delfile (void); 35void lua_stringcollector (void);
35char *lua_filename (void); 36char *lua_createstring (char *s);
36void lua_nextvar (void); 37int lua_addfile (char *fn);
38int lua_delfile (void);
39char *lua_filename (void);
40void lua_nextvar (void);
37 41
38#endif 42#endif