diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-02-12 15:32:40 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1996-02-12 15:32:40 -0300 |
| commit | 41259bff31dbb904edfb8070006ccb15577f8f04 (patch) | |
| tree | 664bf9cbe6394e9074435ecf2bd710712b4537c3 /table.c | |
| parent | afaa98a666acd5f596b50f56bb288815838c096e (diff) | |
| download | lua-41259bff31dbb904edfb8070006ccb15577f8f04.tar.gz lua-41259bff31dbb904edfb8070006ccb15577f8f04.tar.bz2 lua-41259bff31dbb904edfb8070006ccb15577f8f04.zip | |
BIG CHANGE: new data structure for constants, strings and globals, using
an array of hash tables for all them.
Diffstat (limited to 'table.c')
| -rw-r--r-- | table.c | 26 |
1 files changed, 16 insertions, 10 deletions
| @@ -3,7 +3,7 @@ | |||
| 3 | ** Module to control static tables | 3 | ** Module to control static tables |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_table="$Id: table.c,v 2.43 1996/01/26 14:04:32 roberto Exp roberto $"; | 6 | char *rcs_table="$Id: table.c,v 2.44 1996/01/26 18:03:19 roberto Exp $"; |
| 7 | 7 | ||
| 8 | /*#include <string.h>*/ | 8 | /*#include <string.h>*/ |
| 9 | 9 | ||
| @@ -85,7 +85,7 @@ void lua_initconstant (void) | |||
| 85 | ** Given a name, search it at symbol table and return its index. If not | 85 | ** Given a name, search it at symbol table and return its index. If not |
| 86 | ** found, allocate it. | 86 | ** found, allocate it. |
| 87 | */ | 87 | */ |
| 88 | Word luaI_findsymbol (TreeNode *t) | 88 | Word luaI_findsymbol (TaggedString *t) |
| 89 | { | 89 | { |
| 90 | if (lua_table == NULL) | 90 | if (lua_table == NULL) |
| 91 | lua_initsymbol(); | 91 | lua_initsymbol(); |
| @@ -111,7 +111,7 @@ Word luaI_findsymbol (TreeNode *t) | |||
| 111 | 111 | ||
| 112 | Word luaI_findsymbolbyname (char *name) | 112 | Word luaI_findsymbolbyname (char *name) |
| 113 | { | 113 | { |
| 114 | return luaI_findsymbol(lua_constcreate(name)); | 114 | return luaI_findsymbol(luaI_createfixedstring(name)); |
| 115 | } | 115 | } |
| 116 | 116 | ||
| 117 | 117 | ||
| @@ -119,7 +119,7 @@ Word luaI_findsymbolbyname (char *name) | |||
| 119 | ** Given a tree node, check it is has a correspondent constant index. If not, | 119 | ** Given a tree node, check it is has a correspondent constant index. If not, |
| 120 | ** allocate it. | 120 | ** allocate it. |
| 121 | */ | 121 | */ |
| 122 | Word luaI_findconstant (TreeNode *t) | 122 | Word luaI_findconstant (TaggedString *t) |
| 123 | { | 123 | { |
| 124 | if (lua_constant == NULL) | 124 | if (lua_constant == NULL) |
| 125 | lua_initconstant(); | 125 | lua_initconstant(); |
| @@ -135,7 +135,7 @@ Word luaI_findconstant (TreeNode *t) | |||
| 135 | lua_constant = growvector(lua_constant, lua_maxconstant, TaggedString *); | 135 | lua_constant = growvector(lua_constant, lua_maxconstant, TaggedString *); |
| 136 | } | 136 | } |
| 137 | t->constindex = lua_nconstant; | 137 | t->constindex = lua_nconstant; |
| 138 | lua_constant[lua_nconstant] = &(t->ts); | 138 | lua_constant[lua_nconstant] = t; |
| 139 | lua_nconstant++; | 139 | lua_nconstant++; |
| 140 | } | 140 | } |
| 141 | return t->constindex; | 141 | return t->constindex; |
| @@ -144,7 +144,13 @@ Word luaI_findconstant (TreeNode *t) | |||
| 144 | 144 | ||
| 145 | Word luaI_findconstantbyname (char *name) | 145 | Word luaI_findconstantbyname (char *name) |
| 146 | { | 146 | { |
| 147 | return luaI_findconstant(lua_constcreate(name)); | 147 | return luaI_findconstant(luaI_createfixedstring(name)); |
| 148 | } | ||
| 149 | |||
| 150 | TaggedString *lua_constcreate(char *name) | ||
| 151 | { | ||
| 152 | int i = luaI_findconstantbyname(name); | ||
| 153 | return lua_constant[i]; | ||
| 148 | } | 154 | } |
| 149 | 155 | ||
| 150 | 156 | ||
| @@ -156,7 +162,7 @@ static char *lua_travsymbol (int (*fn)(Object *)) | |||
| 156 | Word i; | 162 | Word i; |
| 157 | for (i=0; i<lua_ntable; i++) | 163 | for (i=0; i<lua_ntable; i++) |
| 158 | if (fn(&s_object(i))) | 164 | if (fn(&s_object(i))) |
| 159 | return lua_table[i].varname->ts.str; | 165 | return lua_table[i].varname->str; |
| 160 | return NULL; | 166 | return NULL; |
| 161 | } | 167 | } |
| 162 | 168 | ||
| @@ -165,7 +171,7 @@ static char *lua_travsymbol (int (*fn)(Object *)) | |||
| 165 | ** Mark an object if it is a string or a unmarked array. | 171 | ** Mark an object if it is a string or a unmarked array. |
| 166 | */ | 172 | */ |
| 167 | int lua_markobject (Object *o) | 173 | int lua_markobject (Object *o) |
| 168 | { | 174 | {/* if already marked, does not change mark value */ |
| 169 | if (tag(o) == LUA_T_STRING && !tsvalue(o)->marked) | 175 | if (tag(o) == LUA_T_STRING && !tsvalue(o)->marked) |
| 170 | tsvalue(o)->marked = 1; | 176 | tsvalue(o)->marked = 1; |
| 171 | else if (tag(o) == LUA_T_ARRAY) | 177 | else if (tag(o) == LUA_T_ARRAY) |
| @@ -235,10 +241,10 @@ static void lua_nextvar (void) | |||
| 235 | } | 241 | } |
| 236 | else | 242 | else |
| 237 | { | 243 | { |
| 238 | TreeNode *t = lua_table[next].varname; | 244 | TaggedString *t = lua_table[next].varname; |
| 239 | Object name; | 245 | Object name; |
| 240 | tag(&name) = LUA_T_STRING; | 246 | tag(&name) = LUA_T_STRING; |
| 241 | tsvalue(&name) = &(t->ts); | 247 | tsvalue(&name) = t; |
| 242 | luaI_pushobject(&name); | 248 | luaI_pushobject(&name); |
| 243 | luaI_pushobject(&s_object(next)); | 249 | luaI_pushobject(&s_object(next)); |
| 244 | } | 250 | } |
