aboutsummaryrefslogtreecommitdiff
path: root/table.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1994-11-23 12:32:00 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1994-11-23 12:32:00 -0200
commitd490555ec9d5efb886211f735694d4e7dd0c166d (patch)
treef9b75cdc3a6d4132dddc884280ae218a7f9beb5c /table.c
parentad0ec203f60df5e2f8a3b294c9e8c1014280b8f1 (diff)
downloadlua-d490555ec9d5efb886211f735694d4e7dd0c166d.tar.gz
lua-d490555ec9d5efb886211f735694d4e7dd0c166d.tar.bz2
lua-d490555ec9d5efb886211f735694d4e7dd0c166d.zip
garbage collection tag for strings organized in struct TaggedString
Diffstat (limited to 'table.c')
-rw-r--r--table.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/table.c b/table.c
index cac27add..2a3bb213 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 2.21 1994/11/18 19:27:38 roberto Exp roberto $"; 6char *rcs_table="$Id: table.c,v 2.22 1994/11/21 21:41:09 roberto Exp roberto $";
7 7
8#include <string.h> 8#include <string.h>
9 9
@@ -17,13 +17,15 @@ char *rcs_table="$Id: table.c,v 2.21 1994/11/18 19:27:38 roberto Exp roberto $";
17#include "fallback.h" 17#include "fallback.h"
18 18
19 19
20#define MAX_WORD 0xFFFD
21
20#define BUFFER_BLOCK 256 22#define BUFFER_BLOCK 256
21 23
22Symbol *lua_table; 24Symbol *lua_table;
23static Word lua_ntable = 0; 25static Word lua_ntable = 0;
24static Long lua_maxsymbol = 0; 26static Long lua_maxsymbol = 0;
25 27
26char **lua_constant; 28TaggedString **lua_constant;
27static Word lua_nconstant = 0; 29static Word lua_nconstant = 0;
28static Long lua_maxconstant = 0; 30static Long lua_maxconstant = 0;
29 31
@@ -79,7 +81,7 @@ static void lua_initsymbol (void)
79void lua_initconstant (void) 81void lua_initconstant (void)
80{ 82{
81 lua_maxconstant = BUFFER_BLOCK; 83 lua_maxconstant = BUFFER_BLOCK;
82 lua_constant = newvector(lua_maxconstant, char *); 84 lua_constant = newvector(lua_maxconstant, TaggedString *);
83} 85}
84 86
85 87
@@ -92,7 +94,7 @@ int luaI_findsymbol (TreeNode *t)
92{ 94{
93 if (lua_table == NULL) 95 if (lua_table == NULL)
94 lua_initsymbol(); 96 lua_initsymbol();
95 if (t->varindex == UNMARKED_STRING) 97 if (t->varindex == NOT_USED)
96 { 98 {
97 if (lua_ntable == lua_maxsymbol) 99 if (lua_ntable == lua_maxsymbol)
98 { 100 {
@@ -124,17 +126,17 @@ int luaI_findconstant (TreeNode *t)
124{ 126{
125 if (lua_constant == NULL) 127 if (lua_constant == NULL)
126 lua_initconstant(); 128 lua_initconstant();
127 if (t->constindex == UNMARKED_STRING) 129 if (t->constindex == NOT_USED)
128 { 130 {
129 if (lua_nconstant == lua_maxconstant) 131 if (lua_nconstant == lua_maxconstant)
130 { 132 {
131 lua_maxconstant *= 2; 133 lua_maxconstant *= 2;
132 if (lua_maxconstant > MAX_WORD) 134 if (lua_maxconstant > MAX_WORD)
133 lua_error("constant table overflow"); 135 lua_error("constant table overflow");
134 lua_constant = growvector(lua_constant, lua_maxconstant, char*); 136 lua_constant = growvector(lua_constant, lua_maxconstant, TaggedString *);
135 } 137 }
136 t->constindex = lua_nconstant; 138 t->constindex = lua_nconstant;
137 lua_constant[lua_nconstant] = t->str; 139 lua_constant[lua_nconstant] = &(t->ts);
138 lua_nconstant++; 140 lua_nconstant++;
139 } 141 }
140 return t->constindex; 142 return t->constindex;
@@ -157,10 +159,10 @@ void lua_travsymbol (void (*fn)(Object *))
157*/ 159*/
158void lua_markobject (Object *o) 160void lua_markobject (Object *o)
159{ 161{
160 if (tag(o) == LUA_T_STRING && indexstring(svalue(o)) == UNMARKED_STRING) 162 if (tag(o) == LUA_T_STRING && !tsvalue(o)->marked)
161 indexstring(svalue(o)) = MARKED_STRING; 163 tsvalue(o)->marked = 1;
162 else if (tag(o) == LUA_T_ARRAY) 164 else if (tag(o) == LUA_T_ARRAY)
163 lua_hashmark (avalue(o)); 165 lua_hashmark (avalue(o));
164} 166}
165 167
166 168
@@ -247,7 +249,7 @@ static void lua_nextvar (void)
247 { 249 {
248 Object name; 250 Object name;
249 tag(&name) = LUA_T_STRING; 251 tag(&name) = LUA_T_STRING;
250 svalue(&name) = next->str; 252 tsvalue(&name) = &(next->ts);
251 luaI_pushobject(&name); 253 luaI_pushobject(&name);
252 luaI_pushobject(&s_object(next->varindex)); 254 luaI_pushobject(&s_object(next->varindex));
253 } 255 }