aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-07-30 19:00:50 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1997-07-30 19:00:50 -0300
commit0892f0e5b75c51f1fee07276a3ba13301b83409e (patch)
tree9f3b9ec92f26c05a85c826ffc5f803fda2f48867
parent1d7857bc635c0bfe7c5b1f325d31feb7660e9a5a (diff)
downloadlua-0892f0e5b75c51f1fee07276a3ba13301b83409e.tar.gz
lua-0892f0e5b75c51f1fee07276a3ba13301b83409e.tar.bz2
lua-0892f0e5b75c51f1fee07276a3ba13301b83409e.zip
BIG CHANGE: functions have their own "constant table".
-rw-r--r--func.c46
-rw-r--r--func.h10
-rw-r--r--inout.c8
-rw-r--r--inout.h5
-rw-r--r--lex.c17
-rw-r--r--lua.stx281
-rw-r--r--opcode.c96
-rw-r--r--opcode.h12
-rw-r--r--table.c60
-rw-r--r--table.h10
-rw-r--r--tree.c4
-rw-r--r--tree.h6
12 files changed, 278 insertions, 277 deletions
diff --git a/func.c b/func.c
index 1cf5b1e7..a78122da 100644
--- a/func.c
+++ b/func.c
@@ -11,6 +11,14 @@
11static TFunc *function_root = NULL; 11static TFunc *function_root = NULL;
12 12
13 13
14static void luaI_insertfunction (TFunc *f)
15{
16 lua_pack();
17 f->next = function_root;
18 function_root = f;
19 f->marked = 0;
20}
21
14/* 22/*
15** Initialize TFunc struct 23** Initialize TFunc struct
16*/ 24*/
@@ -21,29 +29,23 @@ void luaI_initTFunc (TFunc *f)
21 f->code = NULL; 29 f->code = NULL;
22 f->lineDefined = 0; 30 f->lineDefined = 0;
23 f->fileName = lua_parsedfile; 31 f->fileName = lua_parsedfile;
32 f->consts = NULL;
33 f->nconsts = 0;
24 f->locvars = NULL; 34 f->locvars = NULL;
35 luaI_insertfunction(f);
25} 36}
26 37
27/*
28** Insert function in list for GC
29*/
30void luaI_insertfunction (TFunc *f)
31{
32 lua_pack();
33 f->next = function_root;
34 function_root = f;
35 f->marked = 0;
36}
37 38
38 39
39/* 40/*
40** Free function 41** Free function
41*/ 42*/
42void luaI_freefunc (TFunc *f) 43static void luaI_freefunc (TFunc *f)
43{ 44{
44 luaI_free (f->code); 45 luaI_free(f->code);
45 luaI_free (f->locvars); 46 luaI_free(f->locvars);
46 luaI_free (f); 47 luaI_free(f->consts);
48 luaI_free(f);
47} 49}
48 50
49 51
@@ -56,6 +58,20 @@ void luaI_funcfree (TFunc *l)
56 } 58 }
57} 59}
58 60
61
62void luaI_funcmark (TFunc *f)
63{
64 f->marked = 1;
65 if (!f->fileName->marked)
66 f->fileName->marked = 1;
67 if (f->consts) {
68 int i;
69 for (i=0; i<f->nconsts; i++)
70 lua_markobject(&f->consts[i]);
71 }
72}
73
74
59/* 75/*
60** Garbage collection function. 76** Garbage collection function.
61*/ 77*/
@@ -92,7 +108,7 @@ void lua_funcinfo (lua_Object func, char **filename, int *linedefined)
92 TObject *f = luaI_Address(func); 108 TObject *f = luaI_Address(func);
93 if (f->ttype == LUA_T_MARK || f->ttype == LUA_T_FUNCTION) 109 if (f->ttype == LUA_T_MARK || f->ttype == LUA_T_FUNCTION)
94 { 110 {
95 *filename = f->value.tf->fileName; 111 *filename = f->value.tf->fileName->str;
96 *linedefined = f->value.tf->lineDefined; 112 *linedefined = f->value.tf->lineDefined;
97 } 113 }
98 else if (f->ttype == LUA_T_CMARK || f->ttype == LUA_T_CFUNCTION) 114 else if (f->ttype == LUA_T_CMARK || f->ttype == LUA_T_CFUNCTION)
diff --git a/func.h b/func.h
index 14f6554c..5af43056 100644
--- a/func.h
+++ b/func.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: func.h,v 1.10 1997/07/29 19:44:02 roberto Exp roberto $ 2** $Id: func.h,v 1.11 1997/07/29 20:38:45 roberto Exp roberto $
3*/ 3*/
4 4
5#ifndef func_h 5#ifndef func_h
@@ -25,16 +25,16 @@ typedef struct TFunc
25 int marked; 25 int marked;
26 Byte *code; 26 Byte *code;
27 int lineDefined; 27 int lineDefined;
28 char *fileName; 28 TaggedString *fileName;
29 struct TObject *consts;
30 int nconsts;
29 LocVar *locvars; 31 LocVar *locvars;
30} TFunc; 32} TFunc;
31 33
32TFunc *luaI_funccollector (long *cont); 34TFunc *luaI_funccollector (long *cont);
33void luaI_funcfree (TFunc *l); 35void luaI_funcfree (TFunc *l);
34void luaI_insertfunction (TFunc *f); 36void luaI_funcmark (TFunc *f);
35
36void luaI_initTFunc (TFunc *f); 37void luaI_initTFunc (TFunc *f);
37void luaI_freefunc (TFunc *f);
38 38
39char *luaI_getlocalname (TFunc *func, int local_number, int line); 39char *luaI_getlocalname (TFunc *func, int local_number, int line);
40 40
diff --git a/inout.c b/inout.c
index ad46f5bd..0a05c9c4 100644
--- a/inout.c
+++ b/inout.c
@@ -5,7 +5,7 @@
5** Also provides some predefined lua functions. 5** Also provides some predefined lua functions.
6*/ 6*/
7 7
8char *rcs_inout="$Id: inout.c,v 2.70 1997/07/07 21:05:51 roberto Exp roberto $"; 8char *rcs_inout="$Id: inout.c,v 2.71 1997/07/29 13:33:15 roberto Exp roberto $";
9 9
10#include <stdio.h> 10#include <stdio.h>
11#include <string.h> 11#include <string.h>
@@ -27,7 +27,7 @@ char *rcs_inout="$Id: inout.c,v 2.70 1997/07/07 21:05:51 roberto Exp roberto $";
27 27
28/* Exported variables */ 28/* Exported variables */
29Word lua_linenumber; 29Word lua_linenumber;
30char *lua_parsedfile; 30TaggedString *lua_parsedfile;
31 31
32 32
33char *luaI_typenames[] = { /* ORDER LUA_T */ 33char *luaI_typenames[] = { /* ORDER LUA_T */
@@ -40,7 +40,7 @@ char *luaI_typenames[] = { /* ORDER LUA_T */
40 40
41void luaI_setparsedfile (char *name) 41void luaI_setparsedfile (char *name)
42{ 42{
43 lua_parsedfile = luaI_createfixedstring(name)->str; 43 lua_parsedfile = luaI_createstring(name);
44} 44}
45 45
46 46
@@ -399,7 +399,7 @@ void luaI_predefine (void)
399 s_ttype(n) = LUA_T_CFUNCTION; s_fvalue(n) = int_funcs[i].func; 399 s_ttype(n) = LUA_T_CFUNCTION; s_fvalue(n) = int_funcs[i].func;
400 } 400 }
401 n = luaI_findsymbolbyname("_VERSION"); 401 n = luaI_findsymbolbyname("_VERSION");
402 s_ttype(n) = LUA_T_STRING; s_tsvalue(n) = lua_createstring(LUA_VERSION); 402 s_ttype(n) = LUA_T_STRING; s_tsvalue(n) = luaI_createstring(LUA_VERSION);
403} 403}
404 404
405 405
diff --git a/inout.h b/inout.h
index 77e85978..c3dccdf1 100644
--- a/inout.h
+++ b/inout.h
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: inout.h,v 1.19 1997/06/18 20:35:49 roberto Exp roberto $ 2** $Id: inout.h,v 1.20 1997/06/19 18:04:34 roberto Exp roberto $
3*/ 3*/
4 4
5 5
@@ -7,12 +7,13 @@
7#define inout_h 7#define inout_h
8 8
9#include "types.h" 9#include "types.h"
10#include "tree.h"
10#include <stdio.h> 11#include <stdio.h>
11 12
12 13
13extern Word lua_linenumber; 14extern Word lua_linenumber;
14extern Word lua_debugline; 15extern Word lua_debugline;
15extern char *lua_parsedfile; 16extern TaggedString *lua_parsedfile;
16 17
17void luaI_setparsedfile (char *name); 18void luaI_setparsedfile (char *name);
18 19
diff --git a/lex.c b/lex.c
index a1ffbbee..81cbe527 100644
--- a/lex.c
+++ b/lex.c
@@ -1,4 +1,4 @@
1char *rcs_lex = "$Id: lex.c,v 3.6 1997/07/01 19:32:41 roberto Exp roberto $"; 1char *rcs_lex = "$Id: lex.c,v 3.7 1997/07/29 13:33:15 roberto Exp roberto $";
2 2
3 3
4#include <ctype.h> 4#include <ctype.h>
@@ -62,7 +62,7 @@ void lua_setinput (ZIO *z)
62static void luaI_auxsyntaxerror (char *s) 62static void luaI_auxsyntaxerror (char *s)
63{ 63{
64 luaL_verror("%s;\n> at line %d in file %s", 64 luaL_verror("%s;\n> at line %d in file %s",
65 s, lua_linenumber, lua_parsedfile); 65 s, lua_linenumber, lua_parsedfile->str);
66} 66}
67 67
68static void luaI_auxsynterrbf (char *s, char *token) 68static void luaI_auxsynterrbf (char *s, char *token)
@@ -70,7 +70,7 @@ static void luaI_auxsynterrbf (char *s, char *token)
70 if (token[0] == 0) 70 if (token[0] == 0)
71 token = "<eof>"; 71 token = "<eof>";
72 luaL_verror("%s;\n> last token read: \"%s\" at line %d in file %s", 72 luaL_verror("%s;\n> last token read: \"%s\" at line %d in file %s",
73 s, token, lua_linenumber, lua_parsedfile); 73 s, token, lua_linenumber, lua_parsedfile->str);
74} 74}
75 75
76void luaI_syntaxerror (char *s) 76void luaI_syntaxerror (char *s)
@@ -110,7 +110,7 @@ void luaI_addReserved (void)
110 int i; 110 int i;
111 for (i=0; i<RESERVEDSIZE; i++) 111 for (i=0; i<RESERVEDSIZE; i++)
112 { 112 {
113 TaggedString *ts = lua_createstring(reserved[i].name); 113 TaggedString *ts = luaI_createstring(reserved[i].name);
114 ts->marked = reserved[i].token; /* reserved word (always > 255) */ 114 ts->marked = reserved[i].token; /* reserved word (always > 255) */
115 } 115 }
116} 116}
@@ -273,7 +273,7 @@ static int read_long_string (char *yytext, int buffsize)
273 } endloop: 273 } endloop:
274 save_and_next(); /* pass the second ']' */ 274 save_and_next(); /* pass the second ']' */
275 yytext[tokensize-2] = 0; /* erases ']]' */ 275 yytext[tokensize-2] = 0; /* erases ']]' */
276 luaY_lval.vWord = luaI_findconstantbyname(yytext+2); 276 luaY_lval.pTStr = luaI_createtempstring(yytext+2);
277 yytext[tokensize-2] = ']'; /* restores ']]' */ 277 yytext[tokensize-2] = ']'; /* restores ']]' */
278 save(0); 278 save(0);
279 return STRING; 279 return STRING;
@@ -368,7 +368,7 @@ int luaY_lex (void)
368 } 368 }
369 next(); /* skip delimiter */ 369 next(); /* skip delimiter */
370 save(0); 370 save(0);
371 luaY_lval.vWord = luaI_findconstantbyname(yytext+1); 371 luaY_lval.pTStr = luaI_createtempstring(yytext+1);
372 tokensize--; 372 tokensize--;
373 save(del); save(0); /* restore delimiter */ 373 save(del); save(0); /* restore delimiter */
374 return STRING; 374 return STRING;
@@ -454,11 +454,10 @@ int luaY_lex (void)
454 save_and_next(); 454 save_and_next();
455 } while (isalnum((unsigned char)current) || current == '_'); 455 } while (isalnum((unsigned char)current) || current == '_');
456 save(0); 456 save(0);
457 ts = lua_createstring(yytext); 457 ts = luaI_createtempstring(yytext);
458 if (ts->marked > 2) 458 if (ts->marked > 255)
459 return ts->marked; /* reserved word */ 459 return ts->marked; /* reserved word */
460 luaY_lval.pTStr = ts; 460 luaY_lval.pTStr = ts;
461 ts->marked = 2; /* avoid GC */
462 return NAME; 461 return NAME;
463 } 462 }
464 } 463 }
diff --git a/lua.stx b/lua.stx
index 9f6e56f3..66b27e14 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,10 +1,8 @@
1%{ 1%{
2 2
3char *rcs_luastx = "$Id: lua.stx,v 3.47 1997/06/19 17:46:12 roberto Exp roberto $"; 3char *rcs_luastx = "$Id: lua.stx,v 3.48 1997/07/29 20:38:45 roberto Exp roberto $";
4 4
5#include <stdio.h>
6#include <stdlib.h> 5#include <stdlib.h>
7#include <string.h>
8 6
9#include "luadebug.h" 7#include "luadebug.h"
10#include "luamem.h" 8#include "luamem.h"
@@ -40,6 +38,7 @@ struct State {
40 int pc; /* next position to code */ 38 int pc; /* next position to code */
41 TaggedString *localvar[MAXLOCALS]; /* store local variable names */ 39 TaggedString *localvar[MAXLOCALS]; /* store local variable names */
42 int nlocalvar; /* number of active local variables */ 40 int nlocalvar; /* number of active local variables */
41 int maxconsts; /* size of consts vector */
43 int nvars; /* total number of local variables (for debugging information) */ 42 int nvars; /* total number of local variables (for debugging information) */
44 int maxvars; /* = -1 if no debug information */ 43 int maxvars; /* = -1 if no debug information */
45} stateMain, stateFunc, *currState; 44} stateMain, stateFunc, *currState;
@@ -69,41 +68,106 @@ static void check_space (int i)
69 Byte, codeEM, MAX_INT); 68 Byte, codeEM, MAX_INT);
70} 69}
71 70
71
72static void code_byte (Byte c) 72static void code_byte (Byte c)
73{ 73{
74 check_space(1); 74 check_space(1);
75 currState->f->code[currState->pc++] = c; 75 currState->f->code[currState->pc++] = c;
76} 76}
77 77
78static void code_float (real n) 78
79static void code_word_at (int pc, int n)
79{ 80{
80 check_space(sizeof(real)); 81 Word w = n;
81 memcpy(currState->f->code+currState->pc, &n, sizeof(real)); 82 if (w != n)
82 currState->pc += sizeof(real); 83 yyerror("block too big");
84 currState->f->code[pc] = n&0xFF;
85 currState->f->code[pc+1] = n>>8;
83} 86}
84 87
85static void code_code (TFunc *tf) 88static void code_word (int n)
86{ 89{
87 check_space(sizeof(TFunc *)); 90 code_byte(n&0xFF);
88 memcpy(currState->f->code+currState->pc, &tf, sizeof(TFunc *)); 91 code_byte(n>>8);
89 currState->pc += sizeof(TFunc *);
90} 92}
91 93
92static void code_word_at (int pc, int n) 94static void code_constant (int c)
93{ 95{
94 Word w = n; 96 if (c <= 255) {
95 if (w != n) 97 code_byte(PUSHCONSTANTB);
96 yyerror("block too big"); 98 code_byte(c);
97 memcpy(currState->f->code+pc, &w, sizeof(Word)); 99 }
100 else {
101 code_byte(PUSHCONSTANT);
102 code_word(c);
103 }
104}
105
106
107static int next_constant (void)
108{
109 if (currState->f->nconsts >= currState->maxconsts) {
110 currState->maxconsts =
111 growvector(&currState->f->consts, currState->maxconsts,
112 TObject, constantEM, MAX_WORD);
113 }
114 return currState->f->nconsts++;
115}
116
117
118static int string_constant (TaggedString *s)
119{
120 int c = s->u.s.constindex;
121 if (!(0 <= c && c < currState->f->nconsts &&
122 ttype(&currState->f->consts[c]) == LUA_T_STRING &&
123 tsvalue(&currState->f->consts[c]) == s)) {
124 c = next_constant();
125 ttype(&currState->f->consts[c]) = LUA_T_STRING;
126 tsvalue(&currState->f->consts[c]) = s;
127 s->u.s.constindex = c; /* hint for next time */
128 luaI_releasestring(s);
129 }
130 return c;
98} 131}
99 132
100static void code_word (Word n) 133
134static void code_string (TaggedString *s)
101{ 135{
102 check_space(sizeof(Word)); 136 int c = string_constant(s);
103 memcpy(currState->f->code+currState->pc, &n, sizeof(Word)); 137 code_constant(c);
104 currState->pc += sizeof(Word);
105} 138}
106 139
140static void code_float (real n)
141{
142 int c = next_constant();
143 ttype(&currState->f->consts[c]) = LUA_T_NUMBER;
144 nvalue(&currState->f->consts[c]) = n;
145 code_constant(c);
146}
147
148
149static void code_number (float f)
150{
151 Word i;
152 if (f >= 0 && f <= (float)MAX_WORD && (float)(i=(Word)f) == f) {
153 /* f has an (short) integer value */
154 if (i <= 2) code_byte(PUSH0 + i);
155 else if (i <= 255)
156 {
157 code_byte(PUSHBYTE);
158 code_byte(i);
159 }
160 else
161 {
162 code_byte(PUSHWORD);
163 code_word(i);
164 }
165 }
166 else
167 code_float(f);
168}
169
170
107static void flush_record (int n) 171static void flush_record (int n)
108{ 172{
109 if (n == 0) return; 173 if (n == 0) return;
@@ -149,6 +213,7 @@ static void luaI_unregisterlocalvar (int line)
149 213
150static void store_localvar (TaggedString *name, int n) 214static void store_localvar (TaggedString *name, int n)
151{ 215{
216 luaI_fixstring(name); /* local var names cannot be GC */
152 if (currState->nlocalvar+n < MAXLOCALS) 217 if (currState->nlocalvar+n < MAXLOCALS)
153 currState->localvar[currState->nlocalvar+n] = name; 218 currState->localvar[currState->nlocalvar+n] = name;
154 else 219 else
@@ -170,40 +235,6 @@ static void add_varbuffer (Long var)
170 yyerror ("variable buffer overflow"); 235 yyerror ("variable buffer overflow");
171} 236}
172 237
173static void code_string (Word w)
174{
175 code_byte(PUSHSTRING);
176 code_word(w);
177}
178
179static void code_constant (TaggedString *s)
180{
181 code_string(luaI_findconstant(s));
182}
183
184static void code_number (float f)
185{
186 Word i;
187 if (f >= 0 && f <= (float)MAX_WORD && (float)(i=(Word)f) == f) {
188 /* f has an (short) integer value */
189 if (i <= 2) code_byte(PUSH0 + i);
190 else if (i <= 255)
191 {
192 code_byte(PUSHBYTE);
193 code_byte(i);
194 }
195 else
196 {
197 code_byte(PUSHWORD);
198 code_word(i);
199 }
200 }
201 else
202 {
203 code_byte(PUSHFLOAT);
204 code_float(f);
205 }
206}
207 238
208/* 239/*
209** Search a local name and if find return its index. If do not find return -1 240** Search a local name and if find return its index. If do not find return -1
@@ -256,55 +287,6 @@ static void lua_codeadjust (int n)
256} 287}
257 288
258 289
259static void init_state (TFunc *f)
260{
261 luaI_initTFunc(f);
262 currState->nlocalvar = 0;
263 currState->f = f;
264 currState->pc = 0;
265 currState->codesize = CODE_BLOCK;
266 f->code = newvector(CODE_BLOCK, Byte);
267 if (lua_debug) {
268 currState->nvars = 0;
269 currState->maxvars = 0;
270 }
271 else
272 currState->maxvars = -1; /* flag no debug information */
273}
274
275
276static void init_func (void)
277{
278 currState = &stateFunc;
279 init_state(new(TFunc));
280 luaI_codedebugline(lua_linenumber);
281}
282
283
284static void codereturn (void)
285{
286 if (currState->nlocalvar == 0)
287 code_byte(RETCODE0);
288 else
289 {
290 code_byte(RETCODE);
291 code_byte(currState->nlocalvar);
292 }
293}
294
295
296static void close_func (void)
297{
298 codereturn();
299 code_byte(ENDCODE);
300 currState->f->code = shrinkvector(currState->f->code, currState->pc, Byte);
301 if (currState->maxvars != -1) { /* debug information? */
302 luaI_registerlocalvar(NULL, -1); /* flag end of vector */
303 currState->f->locvars = shrinkvector(currState->f->locvars,
304 currState->nvars, LocVar);
305 }
306}
307
308 290
309void luaI_codedebugline (int line) 291void luaI_codedebugline (int line)
310{ 292{
@@ -350,7 +332,7 @@ static int close_parlist (int dots)
350 else { 332 else {
351 code_byte(VARARGS); 333 code_byte(VARARGS);
352 code_byte(currState->nlocalvar); 334 code_byte(currState->nlocalvar);
353 add_localvar(luaI_createfixedstring("arg")); 335 add_localvar(luaI_createstring("arg"));
354 } 336 }
355 return lua_linenumber; 337 return lua_linenumber;
356} 338}
@@ -423,6 +405,65 @@ static void code_shortcircuit (int pc, Byte jmp)
423} 405}
424 406
425 407
408static void init_state (TFunc *f)
409{
410 currState->nlocalvar = 0;
411 currState->f = f;
412 currState->pc = 0;
413 currState->codesize = CODE_BLOCK;
414 f->code = newvector(CODE_BLOCK, Byte);
415 currState->maxconsts = 0;
416 if (lua_debug) {
417 currState->nvars = 0;
418 currState->maxvars = 0;
419 }
420 else
421 currState->maxvars = -1; /* flag no debug information */
422}
423
424
425static void init_func (Long v)
426{
427 TFunc *f = new(TFunc);
428 int c = next_constant();
429 ttype(&currState->f->consts[c]) = LUA_T_FUNCTION;
430 currState->f->consts[c].value.tf = f;
431 code_constant(c);
432 storesinglevar(v);
433 currState = &stateFunc;
434 luaI_initTFunc(f);
435 init_state(f);
436 luaI_codedebugline(lua_linenumber);
437}
438
439
440static void codereturn (void)
441{
442 if (currState->nlocalvar == 0)
443 code_byte(RETCODE0);
444 else
445 {
446 code_byte(RETCODE);
447 code_byte(currState->nlocalvar);
448 }
449}
450
451
452static void close_func (void)
453{
454 codereturn();
455 code_byte(ENDCODE);
456 currState->f->code = shrinkvector(currState->f->code, currState->pc, Byte);
457 currState->f->consts = shrinkvector(currState->f->consts,
458 currState->f->nconsts, TObject);
459 if (currState->maxvars != -1) { /* debug information? */
460 luaI_registerlocalvar(NULL, -1); /* flag end of vector */
461 currState->f->locvars = shrinkvector(currState->f->locvars,
462 currState->nvars, LocVar);
463 }
464}
465
466
426/* 467/*
427** Parse LUA code. 468** Parse LUA code.
428*/ 469*/
@@ -444,9 +485,7 @@ void lua_parse (TFunc *tf)
444 int vInt; 485 int vInt;
445 float vFloat; 486 float vFloat;
446 char *pChar; 487 char *pChar;
447 Word vWord;
448 Long vLong; 488 Long vLong;
449 TFunc *pFunc;
450 TaggedString *pTStr; 489 TaggedString *pTStr;
451} 490}
452 491
@@ -460,8 +499,7 @@ void lua_parse (TFunc *tf)
460%token FUNCTION 499%token FUNCTION
461%token DOTS 500%token DOTS
462%token <vFloat> NUMBER 501%token <vFloat> NUMBER
463%token <vWord> STRING 502%token <pTStr> NAME STRING
464%token <pTStr> NAME
465 503
466%type <vLong> PrepJump 504%type <vLong> PrepJump
467%type <vLong> exprlist, exprlist1 /* if > 0, points to function return 505%type <vLong> exprlist, exprlist1 /* if > 0, points to function return
@@ -473,8 +511,7 @@ void lua_parse (TFunc *tf)
473%type <vInt> ffieldlist, ffieldlist1, semicolonpart 511%type <vInt> ffieldlist, ffieldlist1, semicolonpart
474%type <vInt> lfieldlist, lfieldlist1 512%type <vInt> lfieldlist, lfieldlist1
475%type <vInt> parlist, parlist1, par 513%type <vInt> parlist, parlist1, par
476%type <vLong> var, singlevar, funcname 514%type <vLong> var, singlevar
477%type <pFunc> body
478 515
479%left AND OR 516%left AND OR
480%left EQ NE '>' '<' LE GE 517%left EQ NE '>' '<' LE GE
@@ -495,28 +532,21 @@ chunklist : /* empty */
495 ; 532 ;
496 533
497function : FUNCTION funcname body 534function : FUNCTION funcname body
498 {
499 code_byte(PUSHFUNCTION);
500 code_code($3);
501 storesinglevar($2);
502 }
503 ; 535 ;
504 536
505funcname : var { $$ =$1; init_func(); } 537funcname : var { init_func($1); }
506 | varexp ':' NAME 538 | varexp ':' NAME
507 { 539 {
508 code_constant($3); 540 code_string($3);
509 $$ = 0; /* indexed variable */ 541 init_func(0); /* indexed variable */
510 init_func(); 542 add_localvar(luaI_createstring("self"));
511 add_localvar(luaI_createfixedstring("self"));
512 } 543 }
513 ; 544 ;
514 545
515body : '(' parlist ')' block END 546body : '(' parlist ')' block END
516 { 547 {
517 close_func(); 548 close_func();
518 $$ = currState->f; 549 currState->f->lineDefined = $2;
519 $$->lineDefined = $2;
520 currState = &stateMain; /* change back to main code */ 550 currState = &stateMain; /* change back to main code */
521 } 551 }
522 ; 552 ;
@@ -658,7 +688,7 @@ funcvalue : varexp { $$ = 0; }
658 | varexp ':' NAME 688 | varexp ':' NAME
659 { 689 {
660 code_byte(PUSHSELF); 690 code_byte(PUSHSELF);
661 code_word(luaI_findconstant($3)); 691 code_word(string_constant($3));
662 $$ = 1; 692 $$ = 1;
663 } 693 }
664 ; 694 ;
@@ -735,7 +765,7 @@ ffield : ffieldkey '=' expr1
735 ; 765 ;
736 766
737ffieldkey : '[' expr1 ']' 767ffieldkey : '[' expr1 ']'
738 | NAME { code_constant($1); } 768 | NAME { code_string($1); }
739 ; 769 ;
740 770
741lfieldlist : /* empty */ { $$ = 0; } 771lfieldlist : /* empty */ { $$ = 0; }
@@ -771,7 +801,7 @@ var : singlevar { $$ = $1; }
771 } 801 }
772 | varexp '.' NAME 802 | varexp '.' NAME
773 { 803 {
774 code_constant($3); 804 code_string($3);
775 $$ = 0; /* indexed variable */ 805 $$ = 0; /* indexed variable */
776 } 806 }
777 ; 807 ;
@@ -783,6 +813,7 @@ singlevar : NAME
783 $$ = luaI_findsymbol($1)+1; /* return positive value */ 813 $$ = luaI_findsymbol($1)+1; /* return positive value */
784 else 814 else
785 $$ = -(local+1); /* return negative value */ 815 $$ = -(local+1); /* return negative value */
816 luaI_fixstring($1); /* cannot GC variable names */
786 } 817 }
787 ; 818 ;
788 819
diff --git a/opcode.c b/opcode.c
index 3de1745b..505e6c45 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 4.18 1997/07/29 13:35:06 roberto Exp roberto $"; 6char *rcs_opcode="$Id: opcode.c,v 4.19 1997/07/29 21:11:10 roberto Exp roberto $";
7 7
8#include <setjmp.h> 8#include <setjmp.h>
9#include <stdio.h> 9#include <stdio.h>
@@ -26,6 +26,9 @@ char *rcs_opcode="$Id: opcode.c,v 4.18 1997/07/29 13:35:06 roberto Exp roberto $
26#define tostring(o) ((ttype(o) != LUA_T_STRING) && (lua_tostring(o) != 0)) 26#define tostring(o) ((ttype(o) != LUA_T_STRING) && (lua_tostring(o) != 0))
27 27
28 28
29#define get_word(w,pc) {w=*pc+(*(pc+1)<<8); pc+=2;}
30
31
29#define STACK_SIZE 128 32#define STACK_SIZE 128
30 33
31#ifndef STACK_LIMIT 34#ifndef STACK_LIMIT
@@ -69,7 +72,7 @@ lua_LHFunction lua_linehook = NULL;
69lua_CHFunction lua_callhook = NULL; 72lua_CHFunction lua_callhook = NULL;
70 73
71 74
72static StkId lua_execute (Byte *pc, StkId base); 75static StkId lua_execute (TFunc *func, StkId base);
73static void do_call (StkId base, int nResults); 76static void do_call (StkId base, int nResults);
74 77
75 78
@@ -169,7 +172,7 @@ static int lua_tostring (TObject *obj)
169 sprintf (s, "%d", i); 172 sprintf (s, "%d", i);
170 else 173 else
171 sprintf (s, "%g", nvalue(obj)); 174 sprintf (s, "%g", nvalue(obj));
172 tsvalue(obj) = lua_createstring(s); 175 tsvalue(obj) = luaI_createstring(s);
173 ttype(obj) = LUA_T_STRING; 176 ttype(obj) = LUA_T_STRING;
174 return 0; 177 return 0;
175 } 178 }
@@ -267,7 +270,8 @@ static void callHook (StkId base, lua_Type type, int isreturn)
267 { 270 {
268 TObject *f = stack+base-1; 271 TObject *f = stack+base-1;
269 if (type == LUA_T_MARK) 272 if (type == LUA_T_MARK)
270 (*lua_callhook)(Ref(f), f->value.tf->fileName, f->value.tf->lineDefined); 273 (*lua_callhook)(Ref(f), f->value.tf->fileName->str,
274 f->value.tf->lineDefined);
271 else 275 else
272 (*lua_callhook)(Ref(f), "(C)", -1); 276 (*lua_callhook)(Ref(f), "(C)", -1);
273 } 277 }
@@ -324,7 +328,7 @@ static void do_call (StkId base, int nResults)
324 } 328 }
325 else if (ttype(func) == LUA_T_FUNCTION) { 329 else if (ttype(func) == LUA_T_FUNCTION) {
326 ttype(func) = LUA_T_MARK; 330 ttype(func) = LUA_T_MARK;
327 firstResult = lua_execute(func->value.tf->code, base); 331 firstResult = lua_execute(func->value.tf, base);
328 } 332 }
329 else { /* func is not a function */ 333 else { /* func is not a function */
330 /* Check the tag method for invalid functions */ 334 /* Check the tag method for invalid functions */
@@ -630,14 +634,17 @@ int luaI_dorun (TFunc *tf)
630 634
631int lua_domain (void) 635int lua_domain (void)
632{ 636{
633 TFunc tf;
634 int status; 637 int status;
638 TFunc *tf = new(TFunc);
635 jmp_buf myErrorJmp; 639 jmp_buf myErrorJmp;
636 jmp_buf *oldErr = errorJmp; 640 jmp_buf *oldErr = errorJmp;
637 errorJmp = &myErrorJmp; 641 errorJmp = &myErrorJmp;
638 luaI_initTFunc(&tf); 642 luaI_initTFunc(tf);
643 adjustC(1); /* one slot for the pseudo-function */
644 stack[CLS_current.base].ttype = LUA_T_FUNCTION;
645 stack[CLS_current.base].value.tf = tf;
639 if (setjmp(myErrorJmp) == 0) { 646 if (setjmp(myErrorJmp) == 0) {
640 lua_parse(&tf); 647 lua_parse(tf);
641 status = 0; 648 status = 0;
642 } 649 }
643 else { 650 else {
@@ -645,9 +652,8 @@ int lua_domain (void)
645 status = 1; 652 status = 1;
646 } 653 }
647 if (status == 0) 654 if (status == 0)
648 status = luaI_dorun(&tf); 655 status = do_protectedrun(MULT_RET);
649 errorJmp = oldErr; 656 errorJmp = oldErr;
650 luaI_free(tf.code);
651 return status; 657 return status;
652} 658}
653 659
@@ -952,7 +958,7 @@ void lua_pushstring (char *s)
952 ttype(top) = LUA_T_NIL; 958 ttype(top) = LUA_T_NIL;
953 else 959 else
954 { 960 {
955 tsvalue(top) = lua_createstring(s); 961 tsvalue(top) = luaI_createstring(s);
956 ttype(top) = LUA_T_STRING; 962 ttype(top) = LUA_T_STRING;
957 } 963 }
958 incr_top; 964 incr_top;
@@ -1088,7 +1094,7 @@ static void adjust_varargs (StkId first_extra_arg)
1088 /* store counter in field "n" */ { 1094 /* store counter in field "n" */ {
1089 TObject index, extra; 1095 TObject index, extra;
1090 ttype(&index) = LUA_T_STRING; 1096 ttype(&index) = LUA_T_STRING;
1091 tsvalue(&index) = lua_createstring("n"); 1097 tsvalue(&index) = luaI_createstring("n");
1092 ttype(&extra) = LUA_T_NUMBER; 1098 ttype(&extra) = LUA_T_NUMBER;
1093 nvalue(&extra) = nvararg; 1099 nvalue(&extra) = nvararg;
1094 *(lua_hashdefine(avalue(&arg), &index)) = extra; 1100 *(lua_hashdefine(avalue(&arg), &index)) = extra;
@@ -1104,8 +1110,9 @@ static void adjust_varargs (StkId first_extra_arg)
1104** [stack+base,top). Returns n such that the the results are between 1110** [stack+base,top). Returns n such that the the results are between
1105** [stack+n,top). 1111** [stack+n,top).
1106*/ 1112*/
1107static StkId lua_execute (Byte *pc, StkId base) 1113static StkId lua_execute (TFunc *func, StkId base)
1108{ 1114{
1115 Byte *pc = func->code;
1109 if (lua_callhook) 1116 if (lua_callhook)
1110 callHook (base, LUA_T_MARK, 0); 1117 callHook (base, LUA_T_MARK, 0);
1111 while (1) 1118 while (1)
@@ -1133,35 +1140,6 @@ static StkId lua_execute (Byte *pc, StkId base)
1133 } 1140 }
1134 break; 1141 break;
1135 1142
1136 case PUSHFLOAT:
1137 {
1138 real num;
1139 get_float(num,pc);
1140 ttype(top) = LUA_T_NUMBER; nvalue(top) = num;
1141 incr_top;
1142 }
1143 break;
1144
1145 case PUSHSTRING:
1146 {
1147 Word w;
1148 get_word(w,pc);
1149 ttype(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w];
1150 incr_top;
1151 }
1152 break;
1153
1154 case PUSHFUNCTION:
1155 {
1156 TFunc *f;
1157 get_code(f,pc);
1158 luaI_insertfunction(f); /* may take part in GC */
1159 top->ttype = LUA_T_FUNCTION;
1160 top->value.tf = f;
1161 incr_top;
1162 }
1163 break;
1164
1165 case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: 1143 case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2:
1166 case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: 1144 case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5:
1167 case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: 1145 case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8:
@@ -1187,7 +1165,7 @@ static StkId lua_execute (Byte *pc, StkId base)
1187 TObject receiver = *(top-1); 1165 TObject receiver = *(top-1);
1188 Word w; 1166 Word w;
1189 get_word(w,pc); 1167 get_word(w,pc);
1190 ttype(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w]; 1168 *top = func->consts[w];
1191 incr_top; 1169 incr_top;
1192 pushsubscript(); 1170 pushsubscript();
1193 *top = receiver; 1171 *top = receiver;
@@ -1195,6 +1173,20 @@ static StkId lua_execute (Byte *pc, StkId base)
1195 break; 1173 break;
1196 } 1174 }
1197 1175
1176 case PUSHCONSTANTB: {
1177 *top = func->consts[*pc++];
1178 incr_top;
1179 break;
1180 }
1181
1182 case PUSHCONSTANT: {
1183 Word w;
1184 get_word(w,pc);
1185 *top = func->consts[w];
1186 incr_top;
1187 break;
1188 }
1189
1198 case STORELOCAL0: case STORELOCAL1: case STORELOCAL2: 1190 case STORELOCAL0: case STORELOCAL1: case STORELOCAL2:
1199 case STORELOCAL3: case STORELOCAL4: case STORELOCAL5: 1191 case STORELOCAL3: case STORELOCAL4: case STORELOCAL5:
1200 case STORELOCAL6: case STORELOCAL7: case STORELOCAL8: 1192 case STORELOCAL6: case STORELOCAL7: case STORELOCAL8:
@@ -1241,22 +1233,6 @@ static StkId lua_execute (Byte *pc, StkId base)
1241 } 1233 }
1242 break; 1234 break;
1243 1235
1244 case STORERECORD: /* opcode obsolete: supersed by STOREMAP */
1245 {
1246 int n = *(pc++);
1247 TObject *arr = top-n-1;
1248 while (n)
1249 {
1250 Word w;
1251 get_word(w,pc);
1252 ttype(top) = LUA_T_STRING; tsvalue(top) = lua_constant[w];
1253 *(lua_hashdefine (avalue(arr), top)) = *(top-1);
1254 top--;
1255 n--;
1256 }
1257 }
1258 break;
1259
1260 case STOREMAP: { 1236 case STOREMAP: {
1261 int n = *(pc++); 1237 int n = *(pc++);
1262 TObject *arr = top-(2*n)-1; 1238 TObject *arr = top-(2*n)-1;
@@ -1382,7 +1358,7 @@ static StkId lua_execute (Byte *pc, StkId base)
1382 if (tostring(l) || tostring(r)) 1358 if (tostring(l) || tostring(r))
1383 call_binTM(IM_CONCAT, "unexpected type for concatenation"); 1359 call_binTM(IM_CONCAT, "unexpected type for concatenation");
1384 else { 1360 else {
1385 tsvalue(l) = lua_createstring(lua_strconc(svalue(l),svalue(r))); 1361 tsvalue(l) = luaI_createstring(lua_strconc(svalue(l),svalue(r)));
1386 --top; 1362 --top;
1387 } 1363 }
1388 } 1364 }
diff --git a/opcode.h b/opcode.h
index d4a73dce..386cec36 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 3.35 1997/07/04 14:55:37 roberto Exp roberto $ 3** $Id: opcode.h,v 3.36 1997/07/29 20:38:06 roberto Exp roberto $
4*/ 4*/
5 5
6#ifndef opcode_h 6#ifndef opcode_h
@@ -47,9 +47,6 @@ PUSH1,/* - 1.0 */
47PUSH2,/* - 2.0 */ 47PUSH2,/* - 2.0 */
48PUSHBYTE,/* b - (float)b */ 48PUSHBYTE,/* b - (float)b */
49PUSHWORD,/* w - (float)w */ 49PUSHWORD,/* w - (float)w */
50PUSHFLOAT,/* f - f */
51PUSHSTRING,/* w - STR[w] */
52PUSHFUNCTION,/* p - FUN(p) */
53PUSHLOCAL0,/* - LOC[0] */ 50PUSHLOCAL0,/* - LOC[0] */
54PUSHLOCAL1,/* - LOC[1] */ 51PUSHLOCAL1,/* - LOC[1] */
55PUSHLOCAL2,/* - LOC[2] */ 52PUSHLOCAL2,/* - LOC[2] */
@@ -111,6 +108,8 @@ RETCODE,/* b - - */
111SETLINE,/* w - - LINE=w */ 108SETLINE,/* w - - LINE=w */
112VARARGS,/* b v_b...v_1 {v_1...v_b;n=b} */ 109VARARGS,/* b v_b...v_1 {v_1...v_b;n=b} */
113STOREMAP,/* b v_b k_b ...v_1 k_1 t - t[k_i]=v_i */ 110STOREMAP,/* b v_b k_b ...v_1 k_1 t - t[k_i]=v_i */
111PUSHCONSTANTB,/*b - const[b] */
112PUSHCONSTANT,/* w - const[w] */
114ENDCODE = 127 113ENDCODE = 127
115} OpCode; 114} OpCode;
116 115
@@ -153,11 +152,6 @@ typedef struct TObject
153#define s_fvalue(i) (fvalue(&s_object(i))) 152#define s_fvalue(i) (fvalue(&s_object(i)))
154#define s_uvalue(i) (uvalue(&s_object(i))) 153#define s_uvalue(i) (uvalue(&s_object(i)))
155 154
156#define get_word(code,pc) {memcpy(&code, pc, sizeof(Word)); pc+=sizeof(Word);}
157#define get_float(code,pc){memcpy(&code, pc, sizeof(real)); pc+=sizeof(real);}
158#define get_code(code,pc) {memcpy(&code, pc, sizeof(TFunc *)); \
159 pc+=sizeof(TFunc *);}
160
161 155
162/* Exported functions */ 156/* Exported functions */
163void lua_parse (TFunc *tf); /* from "lua.stx" module */ 157void lua_parse (TFunc *tf); /* from "lua.stx" module */
diff --git a/table.c b/table.c
index 47ecd2e2..7420f68e 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.72 1997/06/17 18:09:31 roberto Exp roberto $"; 6char *rcs_table="$Id: table.c,v 2.73 1997/07/07 16:44:26 roberto Exp roberto $";
7 7
8#include "luamem.h" 8#include "luamem.h"
9#include "auxlib.h" 9#include "auxlib.h"
@@ -24,14 +24,17 @@ Symbol *lua_table = NULL;
24Word lua_ntable = 0; 24Word lua_ntable = 0;
25static Long lua_maxsymbol = 0; 25static Long lua_maxsymbol = 0;
26 26
27TaggedString **lua_constant = NULL;
28Word lua_nconstant = 0;
29static Long lua_maxconstant = 0;
30
31 27
32#define GARBAGE_BLOCK 100 28#define GARBAGE_BLOCK 100
33 29
34 30
31static TaggedString *luaI_createfixedstring (char *name)
32{
33 TaggedString *ts = luaI_createstring(name);
34 luaI_fixstring(ts);
35 return ts;
36}
37
35void luaI_initsymbol (void) 38void luaI_initsymbol (void)
36{ 39{
37 lua_maxsymbol = BUFFER_BLOCK; 40 lua_maxsymbol = BUFFER_BLOCK;
@@ -40,16 +43,11 @@ void luaI_initsymbol (void)
40} 43}
41 44
42 45
43/*
44** Initialise constant table with pre-defined constants
45*/
46void luaI_initconstant (void) 46void luaI_initconstant (void)
47{ 47{
48 lua_maxconstant = BUFFER_BLOCK; 48 /* pre-register mem error messages, to avoid loop when error arises */
49 lua_constant = newvector(lua_maxconstant, TaggedString *); 49 luaI_createfixedstring(tableEM);
50 /* pre-register mem error messages, to avoid loop when error arises */ 50 luaI_createfixedstring(memEM);
51 luaI_findconstantbyname(tableEM);
52 luaI_findconstantbyname(memEM);
53} 51}
54 52
55 53
@@ -79,35 +77,25 @@ Word luaI_findsymbolbyname (char *name)
79} 77}
80 78
81 79
82/* 80void luaI_releasestring (TaggedString *t)
83** Given a tree node, check it is has a correspondent constant index. If not,
84** allocate it.
85*/
86Word luaI_findconstant (TaggedString *t)
87{ 81{
88 if (t->u.s.constindex == NOT_USED) 82 if (t->marked == 2) /* string has temporary mark? */
89 { 83 t->marked = 0;
90 if (lua_nconstant == lua_maxconstant)
91 lua_maxconstant = growvector(&lua_constant, lua_maxconstant, TaggedString *,
92 constantEM, MAX_WORD);
93 t->u.s.constindex = lua_nconstant;
94 lua_constant[lua_nconstant] = t;
95 lua_nconstant++;
96 }
97 return t->u.s.constindex;
98} 84}
99 85
100 86
101Word luaI_findconstantbyname (char *name) 87void luaI_fixstring (TaggedString *t)
102{ 88{
103 return luaI_findconstant(luaI_createfixedstring(name)); 89 if (t->marked < 3)
90 t->marked = 3; /* avoid GC */
104} 91}
105 92
106TaggedString *luaI_createfixedstring (char *name) 93
94TaggedString *luaI_createtempstring (char *name)
107{ 95{
108 TaggedString *ts = lua_createstring(name); 96 TaggedString *ts = luaI_createstring(name);
109 if (!ts->marked) 97 if (!ts->marked)
110 ts->marked = 2; /* avoid GC */ 98 ts->marked = 2; /* avoid (temporarily) GC */
111 return ts; 99 return ts;
112} 100}
113 101
@@ -131,9 +119,6 @@ static char *lua_travsymbol (int (*fn)(TObject *))
131} 119}
132 120
133 121
134/*
135** Mark an object if it is a string or a unmarked array.
136*/
137int lua_markobject (TObject *o) 122int lua_markobject (TObject *o)
138{/* if already marked, does not change mark value */ 123{/* if already marked, does not change mark value */
139 if (ttype(o) == LUA_T_USERDATA || 124 if (ttype(o) == LUA_T_USERDATA ||
@@ -143,7 +128,7 @@ int lua_markobject (TObject *o)
143 lua_hashmark (avalue(o)); 128 lua_hashmark (avalue(o));
144 else if ((o->ttype == LUA_T_FUNCTION || o->ttype == LUA_T_MARK) 129 else if ((o->ttype == LUA_T_FUNCTION || o->ttype == LUA_T_MARK)
145 && !o->value.tf->marked) 130 && !o->value.tf->marked)
146 o->value.tf->marked = 1; 131 luaI_funcmark(o->value.tf);
147 return 0; 132 return 0;
148} 133}
149 134
@@ -208,6 +193,7 @@ long lua_collectgarbage (long limit)
208 luaI_hashfree(freetable); 193 luaI_hashfree(freetable);
209 luaI_strfree(freestr); 194 luaI_strfree(freestr);
210 luaI_funcfree(freefunc); 195 luaI_funcfree(freefunc);
196/*printf("total %d coletados %d\n", (int)gc_nentity, (int)recovered);*/
211 return recovered; 197 return recovered;
212} 198}
213 199
diff --git a/table.h b/table.h
index 99d6fe91..93d549f9 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 2.24 1997/04/07 14:48:53 roberto Exp roberto $ 4** $Id: table.h,v 2.25 1997/05/26 14:42:36 roberto Exp roberto $
5*/ 5*/
6 6
7#ifndef table_h 7#ifndef table_h
@@ -19,18 +19,16 @@ typedef struct
19 19
20extern Symbol *lua_table; 20extern Symbol *lua_table;
21extern Word lua_ntable; 21extern Word lua_ntable;
22extern TaggedString **lua_constant;
23extern Word lua_nconstant;
24 22
25void luaI_initsymbol (void); 23void luaI_initsymbol (void);
26void luaI_initconstant (void); 24void luaI_initconstant (void);
27Word luaI_findsymbolbyname (char *name); 25Word luaI_findsymbolbyname (char *name);
28Word luaI_findsymbol (TaggedString *t); 26Word luaI_findsymbol (TaggedString *t);
29Word luaI_findconstant (TaggedString *t);
30Word luaI_findconstantbyname (char *name);
31int luaI_globaldefined (char *name); 27int luaI_globaldefined (char *name);
32void luaI_nextvar (void); 28void luaI_nextvar (void);
33TaggedString *luaI_createfixedstring (char *str); 29TaggedString *luaI_createtempstring (char *name);
30void luaI_releasestring (TaggedString *t);
31void luaI_fixstring (TaggedString *t);
34int lua_markobject (TObject *o); 32int lua_markobject (TObject *o);
35int luaI_ismarked (TObject *o); 33int luaI_ismarked (TObject *o);
36void lua_pack (void); 34void lua_pack (void);
diff --git a/tree.c b/tree.c
index 360d2159..aea613c3 100644
--- a/tree.c
+++ b/tree.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_tree="$Id: tree.c,v 1.27 1997/06/09 17:28:14 roberto Exp roberto $"; 6char *rcs_tree="$Id: tree.c,v 1.28 1997/06/11 14:24:40 roberto Exp roberto $";
7 7
8 8
9#include <string.h> 9#include <string.h>
@@ -149,7 +149,7 @@ TaggedString *luaI_createudata (void *udata, int tag)
149 return insert(udata, tag, &string_root[(unsigned)udata%NUM_HASHS]); 149 return insert(udata, tag, &string_root[(unsigned)udata%NUM_HASHS]);
150} 150}
151 151
152TaggedString *lua_createstring (char *str) 152TaggedString *luaI_createstring (char *str)
153{ 153{
154 return insert(str, LUA_T_STRING, &string_root[(unsigned)str[0]%NUM_HASHS]); 154 return insert(str, LUA_T_STRING, &string_root[(unsigned)str[0]%NUM_HASHS]);
155} 155}
diff --git a/tree.h b/tree.h
index 0b501918..c898bb20 100644
--- a/tree.h
+++ b/tree.h
@@ -1,7 +1,7 @@
1/* 1/*
2** tree.h 2** tree.h
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4** $Id: tree.h,v 1.17 1997/05/14 18:38:29 roberto Exp roberto $ 4** $Id: tree.h,v 1.18 1997/06/09 17:28:14 roberto Exp roberto $
5*/ 5*/
6 6
7#ifndef tree_h 7#ifndef tree_h
@@ -19,7 +19,7 @@ typedef struct TaggedString
19 union { 19 union {
20 struct { 20 struct {
21 Word varindex; /* != NOT_USED if this is a symbol */ 21 Word varindex; /* != NOT_USED if this is a symbol */
22 Word constindex; /* != NOT_USED if this is a constant */ 22 Word constindex; /* hint to reuse constant indexes */
23 } s; 23 } s;
24 void *v; /* if this is a userdata, here is its value */ 24 void *v; /* if this is a userdata, here is its value */
25 } u; 25 } u;
@@ -29,7 +29,7 @@ typedef struct TaggedString
29} TaggedString; 29} TaggedString;
30 30
31 31
32TaggedString *lua_createstring (char *str); 32TaggedString *luaI_createstring (char *str);
33TaggedString *luaI_createudata (void *udata, int tag); 33TaggedString *luaI_createudata (void *udata, int tag);
34TaggedString *luaI_strcollector (long *cont); 34TaggedString *luaI_strcollector (long *cont);
35void luaI_strfree (TaggedString *l); 35void luaI_strfree (TaggedString *l);