diff options
Diffstat (limited to 'lstring.c')
-rw-r--r-- | lstring.c | 94 |
1 files changed, 48 insertions, 46 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lstring.c,v 1.26 1999/11/04 17:22:26 roberto Exp roberto $ | 2 | ** $Id: lstring.c,v 1.27 1999/11/10 15:39:35 roberto Exp roberto $ |
3 | ** String table (keeps all strings handled by Lua) | 3 | ** String table (keeps all strings handled by Lua) |
4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
5 | */ | 5 | */ |
@@ -7,6 +7,8 @@ | |||
7 | 7 | ||
8 | #include <string.h> | 8 | #include <string.h> |
9 | 9 | ||
10 | #define LUA_REENTRANT | ||
11 | |||
10 | #include "lmem.h" | 12 | #include "lmem.h" |
11 | #include "lobject.h" | 13 | #include "lobject.h" |
12 | #include "lstate.h" | 14 | #include "lstate.h" |
@@ -15,8 +17,8 @@ | |||
15 | 17 | ||
16 | 18 | ||
17 | 19 | ||
18 | #define gcsizestring(l) numblocks(0, sizeof(TaggedString)+l) | 20 | #define gcsizestring(L, l) numblocks(L, 0, sizeof(TaggedString)+l) |
19 | #define gcsizeudata gcsizestring(0) | 21 | #define gcsizeudata gcsizestring(L, 0) |
20 | 22 | ||
21 | 23 | ||
22 | 24 | ||
@@ -30,9 +32,9 @@ | |||
30 | static TaggedString *init_hash[1] = {NULL}; | 32 | static TaggedString *init_hash[1] = {NULL}; |
31 | 33 | ||
32 | 34 | ||
33 | void luaS_init (void) { | 35 | void luaS_init (lua_State *L) { |
34 | int i; | 36 | int i; |
35 | L->string_root = luaM_newvector(NUM_HASHS, stringtable); | 37 | L->string_root = luaM_newvector(L, NUM_HASHS, stringtable); |
36 | for (i=0; i<NUM_HASHS; i++) { | 38 | for (i=0; i<NUM_HASHS; i++) { |
37 | L->string_root[i].size = 1; | 39 | L->string_root[i].size = 1; |
38 | L->string_root[i].nuse = 0; | 40 | L->string_root[i].nuse = 0; |
@@ -41,15 +43,15 @@ void luaS_init (void) { | |||
41 | } | 43 | } |
42 | 44 | ||
43 | 45 | ||
44 | void luaS_freeall (void) { | 46 | void luaS_freeall (lua_State *L) { |
45 | int i; | 47 | int i; |
46 | for (i=0; i<NUM_HASHS; i++) { | 48 | for (i=0; i<NUM_HASHS; i++) { |
47 | LUA_ASSERT(L->string_root[i].nuse==0, "non-empty string table"); | 49 | LUA_ASSERT(L, L->string_root[i].nuse==0, "non-empty string table"); |
48 | if (L->string_root[i].hash != init_hash) | 50 | if (L->string_root[i].hash != init_hash) |
49 | luaM_free(L->string_root[i].hash); | 51 | luaM_free(L, L->string_root[i].hash); |
50 | } | 52 | } |
51 | luaM_free(L->string_root); | 53 | luaM_free(L, L->string_root); |
52 | LUA_ASSERT(init_hash[0] == NULL, "init_hash corrupted"); | 54 | LUA_ASSERT(L, init_hash[0] == NULL, "init_hash corrupted"); |
53 | } | 55 | } |
54 | 56 | ||
55 | 57 | ||
@@ -61,9 +63,9 @@ static unsigned long hash_s (const char *s, long l) { | |||
61 | } | 63 | } |
62 | 64 | ||
63 | 65 | ||
64 | void luaS_grow (stringtable *tb) { | 66 | void luaS_grow (lua_State *L, stringtable *tb) { |
65 | int ns = luaO_redimension(tb->nuse*2); /* new size */ | 67 | int ns = luaO_redimension(L, tb->nuse*2); /* new size */ |
66 | TaggedString **newhash = luaM_newvector(ns, TaggedString *); | 68 | TaggedString **newhash = luaM_newvector(L, ns, TaggedString *); |
67 | int i; | 69 | int i; |
68 | for (i=0; i<ns; i++) newhash[i] = NULL; | 70 | for (i=0; i<ns; i++) newhash[i] = NULL; |
69 | /* rehash */ | 71 | /* rehash */ |
@@ -77,14 +79,14 @@ void luaS_grow (stringtable *tb) { | |||
77 | p = next; | 79 | p = next; |
78 | } | 80 | } |
79 | } | 81 | } |
80 | luaM_free(tb->hash); | 82 | luaM_free(L, tb->hash); |
81 | tb->size = ns; | 83 | tb->size = ns; |
82 | tb->hash = newhash; | 84 | tb->hash = newhash; |
83 | } | 85 | } |
84 | 86 | ||
85 | 87 | ||
86 | static TaggedString *newone (long l, unsigned long h) { | 88 | static TaggedString *newone (lua_State *L, long l, unsigned long h) { |
87 | TaggedString *ts = (TaggedString *)luaM_malloc( | 89 | TaggedString *ts = (TaggedString *)luaM_malloc(L, |
88 | sizeof(TaggedString)+l*sizeof(char)); | 90 | sizeof(TaggedString)+l*sizeof(char)); |
89 | ts->marked = 0; | 91 | ts->marked = 0; |
90 | ts->nexthash = NULL; | 92 | ts->nexthash = NULL; |
@@ -93,20 +95,20 @@ static TaggedString *newone (long l, unsigned long h) { | |||
93 | } | 95 | } |
94 | 96 | ||
95 | 97 | ||
96 | static TaggedString *newone_s (const char *str, long l, unsigned long h) { | 98 | static TaggedString *newone_s (lua_State *L, const char *str, long l, unsigned long h) { |
97 | TaggedString *ts = newone(l, h); | 99 | TaggedString *ts = newone(L, l, h); |
98 | memcpy(ts->str, str, l); | 100 | memcpy(ts->str, str, l); |
99 | ts->str[l] = 0; /* ending 0 */ | 101 | ts->str[l] = 0; /* ending 0 */ |
100 | ts->u.s.gv = NULL; /* no global value */ | 102 | ts->u.s.gv = NULL; /* no global value */ |
101 | ts->u.s.len = l; | 103 | ts->u.s.len = l; |
102 | ts->constindex = 0; | 104 | ts->constindex = 0; |
103 | L->nblocks += gcsizestring(l); | 105 | L->nblocks += gcsizestring(L, l); |
104 | return ts; | 106 | return ts; |
105 | } | 107 | } |
106 | 108 | ||
107 | 109 | ||
108 | static TaggedString *newone_u (void *buff, int tag, unsigned long h) { | 110 | static TaggedString *newone_u (lua_State *L, void *buff, int tag, unsigned long h) { |
109 | TaggedString *ts = newone(0, h); | 111 | TaggedString *ts = newone(L, 0, h); |
110 | ts->u.d.value = buff; | 112 | ts->u.d.value = buff; |
111 | ts->u.d.tag = (tag == LUA_ANYTAG) ? 0 : tag; | 113 | ts->u.d.tag = (tag == LUA_ANYTAG) ? 0 : tag; |
112 | ts->constindex = -1; /* tag -> this is a userdata */ | 114 | ts->constindex = -1; /* tag -> this is a userdata */ |
@@ -115,15 +117,15 @@ static TaggedString *newone_u (void *buff, int tag, unsigned long h) { | |||
115 | } | 117 | } |
116 | 118 | ||
117 | 119 | ||
118 | static void newentry (stringtable *tb, TaggedString *ts, int h) { | 120 | static void newentry (lua_State *L, stringtable *tb, TaggedString *ts, int h) { |
119 | tb->nuse++; | 121 | tb->nuse++; |
120 | if (tb->nuse >= tb->size) { /* no more room? */ | 122 | if (tb->nuse >= tb->size) { /* no more room? */ |
121 | if (tb->hash == init_hash) { /* cannot change init_hash */ | 123 | if (tb->hash == init_hash) { /* cannot change init_hash */ |
122 | LUA_ASSERT(h==0, "`init_hash' has size 1"); | 124 | LUA_ASSERT(L, h==0, "`init_hash' has size 1"); |
123 | tb->hash = luaM_newvector(1, TaggedString *); /* so, `clone' it */ | 125 | tb->hash = luaM_newvector(L, 1, TaggedString *); /* so, `clone' it */ |
124 | tb->hash[0] = NULL; | 126 | tb->hash[0] = NULL; |
125 | } | 127 | } |
126 | luaS_grow(tb); | 128 | luaS_grow(L, tb); |
127 | h = ts->hash%tb->size; /* new hash position */ | 129 | h = ts->hash%tb->size; /* new hash position */ |
128 | } | 130 | } |
129 | ts->nexthash = tb->hash[h]; /* chain new entry */ | 131 | ts->nexthash = tb->hash[h]; /* chain new entry */ |
@@ -131,7 +133,7 @@ static void newentry (stringtable *tb, TaggedString *ts, int h) { | |||
131 | } | 133 | } |
132 | 134 | ||
133 | 135 | ||
134 | TaggedString *luaS_newlstr (const char *str, long l) { | 136 | TaggedString *luaS_newlstr (lua_State *L, const char *str, long l) { |
135 | unsigned long h = hash_s(str, l); | 137 | unsigned long h = hash_s(str, l); |
136 | stringtable *tb = &L->string_root[h%NUM_HASHSTR]; | 138 | stringtable *tb = &L->string_root[h%NUM_HASHSTR]; |
137 | int h1 = h%tb->size; | 139 | int h1 = h%tb->size; |
@@ -141,14 +143,14 @@ TaggedString *luaS_newlstr (const char *str, long l) { | |||
141 | return ts; | 143 | return ts; |
142 | } | 144 | } |
143 | /* not found */ | 145 | /* not found */ |
144 | ts = newone_s(str, l, h); /* create new entry */ | 146 | ts = newone_s(L, str, l, h); /* create new entry */ |
145 | newentry(tb, ts, h1); /* insert it on table */ | 147 | newentry(L, tb, ts, h1); /* insert it on table */ |
146 | return ts; | 148 | return ts; |
147 | } | 149 | } |
148 | 150 | ||
149 | 151 | ||
150 | TaggedString *luaS_createudata (void *udata, int tag) { | 152 | TaggedString *luaS_createudata (lua_State *L, void *udata, int tag) { |
151 | unsigned long h = IntPoint(udata); | 153 | unsigned long h = IntPoint(L, udata); |
152 | stringtable *tb = &L->string_root[(h%NUM_HASHUDATA)+NUM_HASHSTR]; | 154 | stringtable *tb = &L->string_root[(h%NUM_HASHUDATA)+NUM_HASHSTR]; |
153 | int h1 = h%tb->size; | 155 | int h1 = h%tb->size; |
154 | TaggedString *ts; | 156 | TaggedString *ts; |
@@ -157,38 +159,38 @@ TaggedString *luaS_createudata (void *udata, int tag) { | |||
157 | return ts; | 159 | return ts; |
158 | } | 160 | } |
159 | /* not found */ | 161 | /* not found */ |
160 | ts = newone_u(udata, tag, h); | 162 | ts = newone_u(L, udata, tag, h); |
161 | newentry(tb, ts, h1); | 163 | newentry(L, tb, ts, h1); |
162 | return ts; | 164 | return ts; |
163 | } | 165 | } |
164 | 166 | ||
165 | 167 | ||
166 | TaggedString *luaS_new (const char *str) { | 168 | TaggedString *luaS_new (lua_State *L, const char *str) { |
167 | return luaS_newlstr(str, strlen(str)); | 169 | return luaS_newlstr(L, str, strlen(str)); |
168 | } | 170 | } |
169 | 171 | ||
170 | TaggedString *luaS_newfixedstring (const char *str) { | 172 | TaggedString *luaS_newfixedstring (lua_State *L, const char *str) { |
171 | TaggedString *ts = luaS_new(str); | 173 | TaggedString *ts = luaS_new(L, str); |
172 | if (ts->marked == 0) ts->marked = FIXMARK; /* avoid GC */ | 174 | if (ts->marked == 0) ts->marked = FIXMARK; /* avoid GC */ |
173 | return ts; | 175 | return ts; |
174 | } | 176 | } |
175 | 177 | ||
176 | 178 | ||
177 | void luaS_free (TaggedString *t) { | 179 | void luaS_free (lua_State *L, TaggedString *t) { |
178 | if (t->constindex == -1) /* is userdata? */ | 180 | if (t->constindex == -1) /* is userdata? */ |
179 | L->nblocks -= gcsizeudata; | 181 | L->nblocks -= gcsizeudata; |
180 | else { /* is string */ | 182 | else { /* is string */ |
181 | L->nblocks -= gcsizestring(t->u.s.len); | 183 | L->nblocks -= gcsizestring(L, t->u.s.len); |
182 | luaM_free(t->u.s.gv); | 184 | luaM_free(L, t->u.s.gv); |
183 | } | 185 | } |
184 | luaM_free(t); | 186 | luaM_free(L, t); |
185 | } | 187 | } |
186 | 188 | ||
187 | 189 | ||
188 | GlobalVar *luaS_assertglobal (TaggedString *ts) { | 190 | GlobalVar *luaS_assertglobal (lua_State *L, TaggedString *ts) { |
189 | GlobalVar *gv = ts->u.s.gv; | 191 | GlobalVar *gv = ts->u.s.gv; |
190 | if (!gv) { /* no global value yet? */ | 192 | if (!gv) { /* no global value yet? */ |
191 | gv = luaM_new(GlobalVar); | 193 | gv = luaM_new(L, GlobalVar); |
192 | gv->value.ttype = LUA_T_NIL; /* initial value */ | 194 | gv->value.ttype = LUA_T_NIL; /* initial value */ |
193 | gv->name = ts; | 195 | gv->name = ts; |
194 | gv->next = L->rootglobal; /* chain in global list */ | 196 | gv->next = L->rootglobal; /* chain in global list */ |
@@ -199,13 +201,13 @@ GlobalVar *luaS_assertglobal (TaggedString *ts) { | |||
199 | } | 201 | } |
200 | 202 | ||
201 | 203 | ||
202 | GlobalVar *luaS_assertglobalbyname (const char *name) { | 204 | GlobalVar *luaS_assertglobalbyname (lua_State *L, const char *name) { |
203 | return luaS_assertglobal(luaS_new(name)); | 205 | return luaS_assertglobal(L, luaS_new(L, name)); |
204 | } | 206 | } |
205 | 207 | ||
206 | 208 | ||
207 | int luaS_globaldefined (const char *name) { | 209 | int luaS_globaldefined (lua_State *L, const char *name) { |
208 | TaggedString *ts = luaS_new(name); | 210 | TaggedString *ts = luaS_new(L, name); |
209 | return ts->u.s.gv && ts->u.s.gv->value.ttype != LUA_T_NIL; | 211 | return ts->u.s.gv && ts->u.s.gv->value.ttype != LUA_T_NIL; |
210 | } | 212 | } |
211 | 213 | ||