diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1994-11-14 19:40:14 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1994-11-14 19:40:14 -0200 |
commit | 86b35cf4f6a824880239069d0afe282e95806aaa (patch) | |
tree | 78352c354fc6befe1af900606cb84b23a40235e0 | |
parent | 3b7a36653b5da227502ec5a3c677b6a351af67be (diff) | |
download | lua-86b35cf4f6a824880239069d0afe282e95806aaa.tar.gz lua-86b35cf4f6a824880239069d0afe282e95806aaa.tar.bz2 lua-86b35cf4f6a824880239069d0afe282e95806aaa.zip |
unification of symbol tree and constant tree
-rw-r--r-- | inout.c | 6 | ||||
-rw-r--r-- | lex.c | 24 | ||||
-rw-r--r-- | lua.stx | 141 | ||||
-rw-r--r-- | table.c | 48 | ||||
-rw-r--r-- | table.h | 9 | ||||
-rw-r--r-- | tree.c | 69 | ||||
-rw-r--r-- | tree.h | 17 |
7 files changed, 131 insertions, 183 deletions
@@ -5,7 +5,7 @@ | |||
5 | ** Also provides some predefined lua functions. | 5 | ** Also provides some predefined lua functions. |
6 | */ | 6 | */ |
7 | 7 | ||
8 | char *rcs_inout="$Id: inout.c,v 2.9 1994/11/08 20:06:15 roberto Exp roberto $"; | 8 | char *rcs_inout="$Id: inout.c,v 2.10 1994/11/09 18:09:22 roberto Exp roberto $"; |
9 | 9 | ||
10 | #include <stdio.h> | 10 | #include <stdio.h> |
11 | #include <stdlib.h> | 11 | #include <stdlib.h> |
@@ -150,12 +150,12 @@ void lua_reportbug (char *s) | |||
150 | { | 150 | { |
151 | sprintf (strchr(msg,0), | 151 | sprintf (strchr(msg,0), |
152 | "\n\tin statement begining at line %d in function \"%s\" of file \"%s\"", | 152 | "\n\tin statement begining at line %d in function \"%s\" of file \"%s\"", |
153 | lua_debugline, lua_varname(funcstack[nfuncstack-1].function), | 153 | lua_debugline, lua_constant[funcstack[nfuncstack-1].function], |
154 | funcstack[nfuncstack-1].file); | 154 | funcstack[nfuncstack-1].file); |
155 | sprintf (strchr(msg,0), "\n\tactive stack\n"); | 155 | sprintf (strchr(msg,0), "\n\tactive stack\n"); |
156 | for (i=nfuncstack-1; i>=0; i--) | 156 | for (i=nfuncstack-1; i>=0; i--) |
157 | sprintf (strchr(msg,0), "\t-> function \"%s\" of file \"%s\"\n", | 157 | sprintf (strchr(msg,0), "\t-> function \"%s\" of file \"%s\"\n", |
158 | lua_varname(funcstack[i].function), | 158 | lua_constant[funcstack[i].function], |
159 | funcstack[i].file); | 159 | funcstack[i].file); |
160 | } | 160 | } |
161 | else | 161 | else |
@@ -1,4 +1,4 @@ | |||
1 | char *rcs_lex = "$Id: lex.c,v 2.9 1994/11/03 17:09:20 roberto Exp roberto $"; | 1 | char *rcs_lex = "$Id: lex.c,v 2.10 1994/11/13 14:39:04 roberto Exp roberto $"; |
2 | 2 | ||
3 | 3 | ||
4 | #include <ctype.h> | 4 | #include <ctype.h> |
@@ -7,6 +7,8 @@ char *rcs_lex = "$Id: lex.c,v 2.9 1994/11/03 17:09:20 roberto Exp roberto $"; | |||
7 | #include <stdlib.h> | 7 | #include <stdlib.h> |
8 | #include <string.h> | 8 | #include <string.h> |
9 | 9 | ||
10 | #include "tree.h" | ||
11 | #include "table.h" | ||
10 | #include "opcode.h" | 12 | #include "opcode.h" |
11 | #include "inout.h" | 13 | #include "inout.h" |
12 | #include "y.tab.h" | 14 | #include "y.tab.h" |
@@ -19,9 +21,8 @@ char *rcs_lex = "$Id: lex.c,v 2.9 1994/11/03 17:09:20 roberto Exp roberto $"; | |||
19 | #define save_and_next() { save(current); next(); } | 21 | #define save_and_next() { save(current); next(); } |
20 | 22 | ||
21 | static int current; | 23 | static int current; |
22 | static char yytext[2][256]; | 24 | static char yytext[256]; |
23 | static char *yytextLast; | 25 | static char *yytextLast; |
24 | static int currentText = 0; | ||
25 | 26 | ||
26 | static Input input; | 27 | static Input input; |
27 | 28 | ||
@@ -34,7 +35,7 @@ void lua_setinput (Input fn) | |||
34 | char *lua_lasttext (void) | 35 | char *lua_lasttext (void) |
35 | { | 36 | { |
36 | *yytextLast = 0; | 37 | *yytextLast = 0; |
37 | return yytext[currentText]; | 38 | return yytext; |
38 | } | 39 | } |
39 | 40 | ||
40 | 41 | ||
@@ -87,10 +88,9 @@ static int findReserved (char *name) | |||
87 | int yylex (void) | 88 | int yylex (void) |
88 | { | 89 | { |
89 | float a; | 90 | float a; |
90 | currentText = !currentText; | ||
91 | while (1) | 91 | while (1) |
92 | { | 92 | { |
93 | yytextLast = yytext[currentText]; | 93 | yytextLast = yytext; |
94 | #if 0 | 94 | #if 0 |
95 | fprintf(stderr,"'%c' %d\n",current,current); | 95 | fprintf(stderr,"'%c' %d\n",current,current); |
96 | #endif | 96 | #endif |
@@ -110,12 +110,12 @@ int yylex (void) | |||
110 | while (isalnum(current) || current == '_') | 110 | while (isalnum(current) || current == '_') |
111 | save_and_next(); | 111 | save_and_next(); |
112 | *yytextLast = 0; | 112 | *yytextLast = 0; |
113 | if (lua_strcmp(yytext[currentText], "debug") == 0) | 113 | if (lua_strcmp(yytext, "debug") == 0) |
114 | { | 114 | { |
115 | yylval.vInt = 1; | 115 | yylval.vInt = 1; |
116 | return DEBUG; | 116 | return DEBUG; |
117 | } | 117 | } |
118 | else if (lua_strcmp(yytext[currentText], "nodebug") == 0) | 118 | else if (lua_strcmp(yytext, "nodebug") == 0) |
119 | { | 119 | { |
120 | yylval.vInt = 0; | 120 | yylval.vInt = 0; |
121 | return DEBUG; | 121 | return DEBUG; |
@@ -179,7 +179,7 @@ int yylex (void) | |||
179 | } | 179 | } |
180 | next(); /* skip the delimiter */ | 180 | next(); /* skip the delimiter */ |
181 | *yytextLast = 0; | 181 | *yytextLast = 0; |
182 | yylval.pChar = yytext[currentText]; | 182 | yylval.vWord = luaI_findconstant(lua_constcreate(yytext)); |
183 | return STRING; | 183 | return STRING; |
184 | } | 184 | } |
185 | 185 | ||
@@ -200,9 +200,9 @@ int yylex (void) | |||
200 | int res; | 200 | int res; |
201 | do { save_and_next(); } while (isalnum(current) || current == '_'); | 201 | do { save_and_next(); } while (isalnum(current) || current == '_'); |
202 | *yytextLast = 0; | 202 | *yytextLast = 0; |
203 | res = findReserved(yytext[currentText]); | 203 | res = findReserved(yytext); |
204 | if (res) return res; | 204 | if (res) return res; |
205 | yylval.pChar = yytext[currentText]; | 205 | yylval.pNode = lua_constcreate(yytext); |
206 | return NAME; | 206 | return NAME; |
207 | } | 207 | } |
208 | 208 | ||
@@ -266,7 +266,7 @@ fraction: | |||
266 | default: /* also end of file */ | 266 | default: /* also end of file */ |
267 | { | 267 | { |
268 | save_and_next(); | 268 | save_and_next(); |
269 | return yytext[currentText][0]; | 269 | return yytext[0]; |
270 | } | 270 | } |
271 | } | 271 | } |
272 | } | 272 | } |
@@ -1,6 +1,6 @@ | |||
1 | %{ | 1 | %{ |
2 | 2 | ||
3 | char *rcs_luastx = "$Id: lua.stx,v 3.4 1994/11/09 18:07:38 roberto Exp roberto $"; | 3 | char *rcs_luastx = "$Id: lua.stx,v 3.5 1994/11/13 14:54:18 roberto Exp roberto $"; |
4 | 4 | ||
5 | #include <stdio.h> | 5 | #include <stdio.h> |
6 | #include <stdlib.h> | 6 | #include <stdlib.h> |
@@ -9,6 +9,7 @@ char *rcs_luastx = "$Id: lua.stx,v 3.4 1994/11/09 18:07:38 roberto Exp roberto $ | |||
9 | #include "opcode.h" | 9 | #include "opcode.h" |
10 | #include "hash.h" | 10 | #include "hash.h" |
11 | #include "inout.h" | 11 | #include "inout.h" |
12 | #include "tree.h" | ||
12 | #include "table.h" | 13 | #include "table.h" |
13 | #include "lua.h" | 14 | #include "lua.h" |
14 | 15 | ||
@@ -40,6 +41,7 @@ static int nlocalvar=0; /* number of local variables */ | |||
40 | static Word fields[MAXFIELDS]; /* fieldnames to be flushed */ | 41 | static Word fields[MAXFIELDS]; /* fieldnames to be flushed */ |
41 | static int nfields=0; | 42 | static int nfields=0; |
42 | 43 | ||
44 | |||
43 | /* Internal functions */ | 45 | /* Internal functions */ |
44 | 46 | ||
45 | static void code_byte (Byte c) | 47 | static void code_byte (Byte c) |
@@ -164,17 +166,6 @@ static void code_number (float f) | |||
164 | } | 166 | } |
165 | } | 167 | } |
166 | 168 | ||
167 | static void init_function (void) | ||
168 | { | ||
169 | if (funcCode == NULL) /* first function */ | ||
170 | { | ||
171 | funcCode = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); | ||
172 | if (funcCode == NULL) | ||
173 | lua_error("not enough memory"); | ||
174 | maxcode = CODE_BLOCK; | ||
175 | } | ||
176 | } | ||
177 | |||
178 | 169 | ||
179 | %} | 170 | %} |
180 | 171 | ||
@@ -187,6 +178,7 @@ static void init_function (void) | |||
187 | Word vWord; | 178 | Word vWord; |
188 | Long vLong; | 179 | Long vLong; |
189 | Byte *pByte; | 180 | Byte *pByte; |
181 | TreeNode *pNode; | ||
190 | } | 182 | } |
191 | 183 | ||
192 | %start functionlist | 184 | %start functionlist |
@@ -198,8 +190,8 @@ static void init_function (void) | |||
198 | %token LOCAL | 190 | %token LOCAL |
199 | %token FUNCTION | 191 | %token FUNCTION |
200 | %token <vFloat> NUMBER | 192 | %token <vFloat> NUMBER |
201 | %token <pChar> STRING | 193 | %token <vWord> STRING |
202 | %token <pChar> NAME | 194 | %token <pNode> NAME |
203 | %token <vInt> DEBUG | 195 | %token <vInt> DEBUG |
204 | 196 | ||
205 | %type <vLong> PrepJump | 197 | %type <vLong> PrepJump |
@@ -208,7 +200,7 @@ static void init_function (void) | |||
208 | %type <vInt> ffieldlist1 | 200 | %type <vInt> ffieldlist1 |
209 | %type <vInt> lfieldlist1 | 201 | %type <vInt> lfieldlist1 |
210 | %type <vLong> var, singlevar | 202 | %type <vLong> var, singlevar |
211 | 203 | %type <pByte> body | |
212 | 204 | ||
213 | %left AND OR | 205 | %left AND OR |
214 | %left EQ NE '>' '<' LE GE | 206 | %left EQ NE '>' '<' LE GE |
@@ -239,84 +231,54 @@ functionlist : /* empty */ | |||
239 | 231 | ||
240 | function : FUNCTION NAME | 232 | function : FUNCTION NAME |
241 | { | 233 | { |
242 | init_function(); | 234 | init_function($2); |
243 | pc=0; basepc=funcCode; maxcurr=maxcode; | ||
244 | nlocalvar=0; | ||
245 | $<vWord>$ = lua_findsymbol($2); | ||
246 | } | ||
247 | '(' parlist ')' | ||
248 | { | ||
249 | if (lua_debug) | ||
250 | { | ||
251 | code_byte(SETFUNCTION); | ||
252 | code_code((Byte *)strdup(lua_file[lua_nfile-1])); | ||
253 | code_word($<vWord>3); | ||
254 | } | ||
255 | lua_codeadjust (0); | ||
256 | } | 235 | } |
257 | block | 236 | body |
258 | END | ||
259 | { | 237 | { |
260 | codereturn(); | 238 | Word func = luaI_findsymbol($2); |
261 | s_tag($<vWord>3) = LUA_T_FUNCTION; | 239 | s_tag(func) = LUA_T_FUNCTION; |
262 | s_bvalue($<vWord>3) = calloc (pc, sizeof(Byte)); | 240 | s_bvalue(func) = $4; |
263 | if (s_bvalue($<vWord>3) == NULL) | ||
264 | lua_error("not enough memory"); | ||
265 | memcpy (s_bvalue($<vWord>3), basepc, pc*sizeof(Byte)); | ||
266 | funcCode = basepc; maxcode=maxcurr; | ||
267 | #if LISTING | 241 | #if LISTING |
268 | PrintCode(funcCode,funcCode+pc); | 242 | PrintCode(funcCode,funcCode+pc); |
269 | #endif | 243 | #endif |
270 | } | 244 | } |
271 | ; | 245 | ; |
272 | 246 | ||
273 | method : FUNCTION NAME { $<vWord>$ = lua_findsymbol($2); } ':' NAME | 247 | method : FUNCTION NAME ':' NAME |
274 | { | 248 | { |
275 | init_function(); | 249 | init_function($4); |
276 | pc=0; basepc=funcCode; maxcurr=maxcode; | 250 | localvar[nlocalvar]=luaI_findsymbolbyname("self"); |
277 | nlocalvar=0; | ||
278 | localvar[nlocalvar]=lua_findsymbol("self"); /* self param. */ | ||
279 | add_nlocalvar(1); | 251 | add_nlocalvar(1); |
280 | $<vWord>$ = lua_findconstant($5); | ||
281 | } | ||
282 | '(' parlist ')' | ||
283 | { | ||
284 | if (lua_debug) | ||
285 | { | ||
286 | code_byte(SETFUNCTION); | ||
287 | code_code((Byte *)strdup(lua_file[lua_nfile-1])); | ||
288 | code_word($<vWord>6); | ||
289 | } | ||
290 | lua_codeadjust (0); | ||
291 | } | 252 | } |
292 | block | 253 | body |
293 | END | ||
294 | { | 254 | { |
295 | Byte *b; | ||
296 | codereturn(); | ||
297 | b = calloc (pc, sizeof(Byte)); | ||
298 | if (b == NULL) | ||
299 | lua_error("not enough memory"); | ||
300 | memcpy (b, basepc, pc*sizeof(Byte)); | ||
301 | funcCode = basepc; maxcode=maxcurr; | ||
302 | #if LISTING | 255 | #if LISTING |
303 | PrintCode(funcCode,funcCode+pc); | 256 | PrintCode(funcCode,funcCode+pc); |
304 | #endif | 257 | #endif |
305 | /* assign function to table field */ | 258 | /* assign function to table field */ |
306 | pc=maincode; basepc=*initcode; maxcurr=maxmain; | 259 | pc=maincode; basepc=*initcode; maxcurr=maxmain; |
307 | nlocalvar=0; | 260 | nlocalvar=0; |
308 | 261 | lua_pushvar(luaI_findsymbol($2)+1); | |
309 | lua_pushvar($<vWord>3+1); | ||
310 | code_byte(PUSHSTRING); | 262 | code_byte(PUSHSTRING); |
311 | code_word($<vWord>6); | 263 | code_word(luaI_findconstant($4)); |
312 | code_byte(PUSHFUNCTION); | 264 | code_byte(PUSHFUNCTION); |
313 | code_code(b); | 265 | code_code($6); |
314 | code_byte(STOREINDEXED0); | 266 | code_byte(STOREINDEXED0); |
315 | |||
316 | maincode=pc; *initcode=basepc; maxmain=maxcurr; | 267 | maincode=pc; *initcode=basepc; maxmain=maxcurr; |
317 | } | 268 | } |
318 | ; | 269 | ; |
319 | 270 | ||
271 | body : '(' parlist ')' block END | ||
272 | { | ||
273 | codereturn(); | ||
274 | $$ = calloc (pc, sizeof(Byte)); | ||
275 | if ($$ == NULL) | ||
276 | lua_error("not enough memory"); | ||
277 | memcpy ($$, basepc, pc*sizeof(Byte)); | ||
278 | funcCode = basepc; maxcode=maxcurr; | ||
279 | } | ||
280 | ; | ||
281 | |||
320 | statlist : /* empty */ | 282 | statlist : /* empty */ |
321 | | statlist stat sc | 283 | | statlist stat sc |
322 | ; | 284 | ; |
@@ -454,7 +416,7 @@ expr : '(' expr ')' { $$ = $2; } | |||
454 | | STRING | 416 | | STRING |
455 | { | 417 | { |
456 | code_byte(PUSHSTRING); | 418 | code_byte(PUSHSTRING); |
457 | code_word(lua_findconstant($1)); | 419 | code_word($1); |
458 | $$ = 1; | 420 | $$ = 1; |
459 | } | 421 | } |
460 | | NIL {code_byte(PUSHNIL); $$ = 1; } | 422 | | NIL {code_byte(PUSHNIL); $$ = 1; } |
@@ -493,7 +455,7 @@ funcvalue : varexp { $$ = 0; } | |||
493 | | varexp ':' NAME | 455 | | varexp ':' NAME |
494 | { | 456 | { |
495 | code_byte(PUSHSTRING); | 457 | code_byte(PUSHSTRING); |
496 | code_word(lua_findconstant($3)); | 458 | code_word(luaI_findconstant($3)); |
497 | code_byte(PUSHSELF); | 459 | code_byte(PUSHSELF); |
498 | $$ = 1; | 460 | $$ = 1; |
499 | } | 461 | } |
@@ -516,18 +478,18 @@ exprlist1 : expr { if ($1 == 0) $$ = -1; else $$ = 1; } | |||
516 | } | 478 | } |
517 | ; | 479 | ; |
518 | 480 | ||
519 | parlist : /* empty */ | 481 | parlist : /* empty */ { lua_codeadjust(0); } |
520 | | parlist1 | 482 | | parlist1 { lua_codeadjust(0); } |
521 | ; | 483 | ; |
522 | 484 | ||
523 | parlist1 : NAME | 485 | parlist1 : NAME |
524 | { | 486 | { |
525 | localvar[nlocalvar]=lua_findsymbol($1); | 487 | localvar[nlocalvar]=luaI_findsymbol($1); |
526 | add_nlocalvar(1); | 488 | add_nlocalvar(1); |
527 | } | 489 | } |
528 | | parlist1 ',' NAME | 490 | | parlist1 ',' NAME |
529 | { | 491 | { |
530 | localvar[nlocalvar]=lua_findsymbol($3); | 492 | localvar[nlocalvar]=luaI_findsymbol($3); |
531 | add_nlocalvar(1); | 493 | add_nlocalvar(1); |
532 | } | 494 | } |
533 | ; | 495 | ; |
@@ -555,9 +517,9 @@ ffieldlist1 : ffield {$$=1;} | |||
555 | } | 517 | } |
556 | ; | 518 | ; |
557 | 519 | ||
558 | ffield : NAME {$<vWord>$ = lua_findconstant($1);} '=' expr1 | 520 | ffield : NAME '=' expr1 |
559 | { | 521 | { |
560 | push_field($<vWord>2); | 522 | push_field(luaI_findconstant($1)); |
561 | } | 523 | } |
562 | ; | 524 | ; |
563 | 525 | ||
@@ -591,14 +553,14 @@ var : singlevar { $$ = $1; } | |||
591 | | varexp '.' NAME | 553 | | varexp '.' NAME |
592 | { | 554 | { |
593 | code_byte(PUSHSTRING); | 555 | code_byte(PUSHSTRING); |
594 | code_word(lua_findconstant($3)); | 556 | code_word(luaI_findconstant($3)); |
595 | $$ = 0; /* indexed variable */ | 557 | $$ = 0; /* indexed variable */ |
596 | } | 558 | } |
597 | ; | 559 | ; |
598 | 560 | ||
599 | singlevar : NAME | 561 | singlevar : NAME |
600 | { | 562 | { |
601 | Word s = lua_findsymbol($1); | 563 | Word s = luaI_findsymbol($1); |
602 | int local = lua_localname (s); | 564 | int local = lua_localname (s); |
603 | if (local == -1) /* global var */ | 565 | if (local == -1) /* global var */ |
604 | $$ = s + 1; /* return positive value */ | 566 | $$ = s + 1; /* return positive value */ |
@@ -610,10 +572,10 @@ singlevar : NAME | |||
610 | varexp : var { lua_pushvar($1); } | 572 | varexp : var { lua_pushvar($1); } |
611 | ; | 573 | ; |
612 | 574 | ||
613 | localdeclist : NAME {localvar[nlocalvar]=lua_findsymbol($1); $$ = 1;} | 575 | localdeclist : NAME {localvar[nlocalvar]=luaI_findsymbol($1); $$ = 1;} |
614 | | localdeclist ',' NAME | 576 | | localdeclist ',' NAME |
615 | { | 577 | { |
616 | localvar[nlocalvar+$1]=lua_findsymbol($3); | 578 | localvar[nlocalvar+$1]=luaI_findsymbol($3); |
617 | $$ = $1+1; | 579 | $$ = $1+1; |
618 | } | 580 | } |
619 | ; | 581 | ; |
@@ -676,6 +638,25 @@ static void lua_codeadjust (int n) | |||
676 | } | 638 | } |
677 | } | 639 | } |
678 | 640 | ||
641 | static void init_function (TreeNode *func) | ||
642 | { | ||
643 | if (funcCode == NULL) /* first function */ | ||
644 | { | ||
645 | funcCode = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); | ||
646 | if (funcCode == NULL) | ||
647 | lua_error("not enough memory"); | ||
648 | maxcode = CODE_BLOCK; | ||
649 | } | ||
650 | pc=0; basepc=funcCode; maxcurr=maxcode; | ||
651 | nlocalvar=0; | ||
652 | if (lua_debug) | ||
653 | { | ||
654 | code_byte(SETFUNCTION); | ||
655 | code_code((Byte *)strdup(lua_file[lua_nfile-1])); | ||
656 | code_word(luaI_findconstant(func)); | ||
657 | } | ||
658 | } | ||
659 | |||
679 | static void codereturn (void) | 660 | static void codereturn (void) |
680 | { | 661 | { |
681 | if (lua_debug) code_byte(RESET); | 662 | if (lua_debug) code_byte(RESET); |
@@ -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.15 1994/11/10 20:41:37 roberto Exp roberto $"; | 6 | char *rcs_table="$Id: table.c,v 2.16 1994/11/11 14:00:08 roberto Exp roberto $"; |
7 | 7 | ||
8 | #include <stdlib.h> | 8 | #include <stdlib.h> |
9 | #include <string.h> | 9 | #include <string.h> |
@@ -51,23 +51,23 @@ static void lua_initsymbol (void) | |||
51 | lua_table = (Symbol *) calloc(lua_maxsymbol, sizeof(Symbol)); | 51 | lua_table = (Symbol *) calloc(lua_maxsymbol, sizeof(Symbol)); |
52 | if (lua_table == NULL) | 52 | if (lua_table == NULL) |
53 | lua_error ("symbol table: not enough memory"); | 53 | lua_error ("symbol table: not enough memory"); |
54 | n = lua_findsymbol("next"); | 54 | n = luaI_findsymbolbyname("next"); |
55 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_next; | 55 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_next; |
56 | n = lua_findsymbol("nextvar"); | 56 | n = luaI_findsymbolbyname("nextvar"); |
57 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_nextvar; | 57 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_nextvar; |
58 | n = lua_findsymbol("type"); | 58 | n = luaI_findsymbolbyname("type"); |
59 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = luaI_type; | 59 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = luaI_type; |
60 | n = lua_findsymbol("tonumber"); | 60 | n = luaI_findsymbolbyname("tonumber"); |
61 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_obj2number; | 61 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_obj2number; |
62 | n = lua_findsymbol("print"); | 62 | n = luaI_findsymbolbyname("print"); |
63 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_print; | 63 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_print; |
64 | n = lua_findsymbol("dofile"); | 64 | n = luaI_findsymbolbyname("dofile"); |
65 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_internaldofile; | 65 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_internaldofile; |
66 | n = lua_findsymbol("dostring"); | 66 | n = luaI_findsymbolbyname("dostring"); |
67 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_internaldostring; | 67 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = lua_internaldostring; |
68 | n = lua_findsymbol("setfallback"); | 68 | n = luaI_findsymbolbyname("setfallback"); |
69 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = luaI_setfallback; | 69 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = luaI_setfallback; |
70 | n = lua_findsymbol("error"); | 70 | n = luaI_findsymbolbyname("error"); |
71 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = luaI_error; | 71 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = luaI_error; |
72 | } | 72 | } |
73 | 73 | ||
@@ -89,13 +89,11 @@ void lua_initconstant (void) | |||
89 | ** found, allocate it. | 89 | ** found, allocate it. |
90 | ** On error, return -1. | 90 | ** On error, return -1. |
91 | */ | 91 | */ |
92 | int lua_findsymbol (char *s) | 92 | int luaI_findsymbol (TreeNode *t) |
93 | { | 93 | { |
94 | char *n; | ||
95 | if (lua_table == NULL) | 94 | if (lua_table == NULL) |
96 | lua_initsymbol(); | 95 | lua_initsymbol(); |
97 | n = lua_varcreate(s); | 96 | if (t->varindex == UNMARKED_STRING) |
98 | if (indexstring(n) == UNMARKED_STRING) | ||
99 | { | 97 | { |
100 | if (lua_ntable == lua_maxsymbol) | 98 | if (lua_ntable == lua_maxsymbol) |
101 | { | 99 | { |
@@ -106,11 +104,17 @@ int lua_findsymbol (char *s) | |||
106 | if (lua_table == NULL) | 104 | if (lua_table == NULL) |
107 | lua_error ("symbol table: not enough memory"); | 105 | lua_error ("symbol table: not enough memory"); |
108 | } | 106 | } |
109 | indexstring(n) = lua_ntable; | 107 | t->varindex = lua_ntable; |
110 | s_tag(lua_ntable) = LUA_T_NIL; | 108 | s_tag(lua_ntable) = LUA_T_NIL; |
111 | lua_ntable++; | 109 | lua_ntable++; |
112 | } | 110 | } |
113 | return indexstring(n); | 111 | return t->varindex; |
112 | } | ||
113 | |||
114 | |||
115 | int luaI_findsymbolbyname (char *name) | ||
116 | { | ||
117 | return luaI_findsymbol(lua_constcreate(name)); | ||
114 | } | 118 | } |
115 | 119 | ||
116 | 120 | ||
@@ -119,13 +123,11 @@ int lua_findsymbol (char *s) | |||
119 | ** found, allocate it. | 123 | ** found, allocate it. |
120 | ** On error, return -1. | 124 | ** On error, return -1. |
121 | */ | 125 | */ |
122 | int lua_findconstant (char *s) | 126 | int luaI_findconstant (TreeNode *t) |
123 | { | 127 | { |
124 | char *n; | ||
125 | if (lua_constant == NULL) | 128 | if (lua_constant == NULL) |
126 | lua_initconstant(); | 129 | lua_initconstant(); |
127 | n = lua_constcreate(s); | 130 | if (t->constindex == UNMARKED_STRING) |
128 | if (indexstring(n) == UNMARKED_STRING) | ||
129 | { | 131 | { |
130 | if (lua_nconstant == lua_maxconstant) | 132 | if (lua_nconstant == lua_maxconstant) |
131 | { | 133 | { |
@@ -136,11 +138,11 @@ int lua_findconstant (char *s) | |||
136 | if (lua_constant == NULL) | 138 | if (lua_constant == NULL) |
137 | lua_error ("constant table: not enough memory"); | 139 | lua_error ("constant table: not enough memory"); |
138 | } | 140 | } |
139 | indexstring(n) = lua_nconstant; | 141 | t->constindex = lua_nconstant; |
140 | lua_constant[lua_nconstant] = n; | 142 | lua_constant[lua_nconstant] = t->str; |
141 | lua_nconstant++; | 143 | lua_nconstant++; |
142 | } | 144 | } |
143 | return indexstring(n); | 145 | return t->constindex; |
144 | } | 146 | } |
145 | 147 | ||
146 | 148 | ||
@@ -1,12 +1,14 @@ | |||
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.3 1994/10/17 19:03:23 celes Exp roberto $ | 4 | ** $Id: table.h,v 2.4 1994/11/03 21:48:36 roberto Exp roberto $ |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #ifndef table_h | 7 | #ifndef table_h |
8 | #define table_h | 8 | #define table_h |
9 | 9 | ||
10 | #include "tree.h" | ||
11 | |||
10 | extern Symbol *lua_table; | 12 | extern Symbol *lua_table; |
11 | extern char **lua_constant; | 13 | extern char **lua_constant; |
12 | 14 | ||
@@ -19,8 +21,9 @@ extern Word lua_recovered; | |||
19 | 21 | ||
20 | 22 | ||
21 | void lua_initconstant (void); | 23 | void lua_initconstant (void); |
22 | int lua_findsymbol (char *s); | 24 | int luaI_findsymbolbyname (char *name); |
23 | int lua_findconstant (char *s); | 25 | int luaI_findsymbol (TreeNode *t); |
26 | int luaI_findconstant (TreeNode *t); | ||
24 | void lua_travsymbol (void (*fn)(Object *)); | 27 | void lua_travsymbol (void (*fn)(Object *)); |
25 | void lua_markobject (Object *o); | 28 | void lua_markobject (Object *o); |
26 | void lua_pack (void); | 29 | void lua_pack (void); |
@@ -3,7 +3,7 @@ | |||
3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
4 | */ | 4 | */ |
5 | 5 | ||
6 | char *rcs_tree="$Id: tree.c,v 1.2 1994/10/18 17:36:11 celes Exp roberto $"; | 6 | char *rcs_tree="$Id: tree.c,v 1.3 1994/11/10 20:41:37 roberto Exp roberto $"; |
7 | 7 | ||
8 | 8 | ||
9 | #include <stdlib.h> | 9 | #include <stdlib.h> |
@@ -17,22 +17,13 @@ char *rcs_tree="$Id: tree.c,v 1.2 1994/10/18 17:36:11 celes Exp roberto $"; | |||
17 | #define lua_strcmp(a,b) (a[0]<b[0]?(-1):(a[0]>b[0]?(1):strcmp(a,b))) | 17 | #define lua_strcmp(a,b) (a[0]<b[0]?(-1):(a[0]>b[0]?(1):strcmp(a,b))) |
18 | 18 | ||
19 | 19 | ||
20 | typedef struct TreeNode | ||
21 | { | ||
22 | struct TreeNode *right; | ||
23 | struct TreeNode *left; | ||
24 | Word index; | ||
25 | char str[1]; /* \0 byte already reserved */ | ||
26 | } TreeNode; | ||
27 | |||
28 | static TreeNode *string_root = NULL; | 20 | static TreeNode *string_root = NULL; |
29 | static TreeNode *constant_root = NULL; | 21 | static TreeNode *constant_root = NULL; |
30 | static TreeNode *variable_root = NULL; | ||
31 | 22 | ||
32 | /* | 23 | /* |
33 | ** Insert a new string/constant/variable at the tree. | 24 | ** Insert a new string/constant/variable at the tree. |
34 | */ | 25 | */ |
35 | static char *tree_create (TreeNode **node, char *str, int *created) | 26 | static TreeNode *tree_create (TreeNode **node, char *str, int *created) |
36 | { | 27 | { |
37 | if (*node == NULL) | 28 | if (*node == NULL) |
38 | { | 29 | { |
@@ -41,9 +32,9 @@ static char *tree_create (TreeNode **node, char *str, int *created) | |||
41 | lua_error("not enough memory"); | 32 | lua_error("not enough memory"); |
42 | (*node)->left = (*node)->right = NULL; | 33 | (*node)->left = (*node)->right = NULL; |
43 | strcpy((*node)->str, str); | 34 | strcpy((*node)->str, str); |
44 | (*node)->index = UNMARKED_STRING; | 35 | (*node)->varindex = (*node)->constindex = UNMARKED_STRING; |
45 | *created = 1; | 36 | *created = 1; |
46 | return (*node)->str; | 37 | return *node; |
47 | } | 38 | } |
48 | else | 39 | else |
49 | { | 40 | { |
@@ -53,35 +44,28 @@ static char *tree_create (TreeNode **node, char *str, int *created) | |||
53 | else if (c > 0) | 44 | else if (c > 0) |
54 | return tree_create(&(*node)->right, str, created); | 45 | return tree_create(&(*node)->right, str, created); |
55 | else | 46 | else |
56 | return (*node)->str; | 47 | return *node; |
57 | } | 48 | } |
58 | } | 49 | } |
59 | 50 | ||
60 | char *lua_strcreate (char *str) | 51 | char *lua_strcreate (char *str) |
61 | { | 52 | { |
62 | int created=0; | 53 | int created=0; |
63 | char *s = tree_create(&string_root, str, &created); | 54 | TreeNode *t = tree_create(&string_root, str, &created); |
64 | if (created) | 55 | if (created) |
65 | { | 56 | { |
66 | if (lua_nentity == lua_block) lua_pack (); | 57 | if (lua_nentity == lua_block) lua_pack (); |
67 | lua_nentity++; | 58 | lua_nentity++; |
68 | } | 59 | } |
69 | return s; | 60 | return t->str; |
70 | } | 61 | } |
71 | 62 | ||
72 | char *lua_constcreate (char *str) | 63 | TreeNode *lua_constcreate (char *str) |
73 | { | 64 | { |
74 | int created; | 65 | int created; |
75 | return tree_create(&constant_root, str, &created); | 66 | return tree_create(&constant_root, str, &created); |
76 | } | 67 | } |
77 | 68 | ||
78 | char *lua_varcreate (char *str) | ||
79 | { | ||
80 | int created; | ||
81 | return tree_create(&variable_root, str, &created); | ||
82 | } | ||
83 | |||
84 | |||
85 | 69 | ||
86 | /* | 70 | /* |
87 | ** Free a node of the tree | 71 | ** Free a node of the tree |
@@ -141,14 +125,14 @@ static TreeNode *lua_travcollector (TreeNode *r) | |||
141 | if (r == NULL) return NULL; | 125 | if (r == NULL) return NULL; |
142 | r->right = lua_travcollector(r->right); | 126 | r->right = lua_travcollector(r->right); |
143 | r->left = lua_travcollector(r->left); | 127 | r->left = lua_travcollector(r->left); |
144 | if (r->index == UNMARKED_STRING) | 128 | if (r->constindex == UNMARKED_STRING) |
145 | { | 129 | { |
146 | ++lua_recovered; | 130 | ++lua_recovered; |
147 | return lua_strfree(r); | 131 | return lua_strfree(r); |
148 | } | 132 | } |
149 | else | 133 | else |
150 | { | 134 | { |
151 | r->index = UNMARKED_STRING; | 135 | r->constindex = UNMARKED_STRING; |
152 | return r; | 136 | return r; |
153 | } | 137 | } |
154 | } | 138 | } |
@@ -168,18 +152,6 @@ void lua_strcollector (void) | |||
168 | */ | 152 | */ |
169 | static TreeNode *tree_next (TreeNode *node, char *str) | 153 | static TreeNode *tree_next (TreeNode *node, char *str) |
170 | { | 154 | { |
171 | #if 0 | ||
172 | if (node == NULL) return NULL; | ||
173 | if (str == NULL || lua_strcmp(str, node->str) < 0) | ||
174 | { | ||
175 | TreeNode *result = tree_next(node->left, str); | ||
176 | return result == NULL ? node : result; | ||
177 | } | ||
178 | else | ||
179 | { | ||
180 | return tree_next(node->right, str); | ||
181 | } | ||
182 | #else | ||
183 | if (node == NULL) return NULL; | 155 | if (node == NULL) return NULL; |
184 | else if (str == NULL) return node; | 156 | else if (str == NULL) return node; |
185 | else | 157 | else |
@@ -195,30 +167,11 @@ static TreeNode *tree_next (TreeNode *node, char *str) | |||
195 | else | 167 | else |
196 | return tree_next(node->right, str); | 168 | return tree_next(node->right, str); |
197 | } | 169 | } |
198 | #endif | ||
199 | } | 170 | } |
200 | 171 | ||
201 | char *lua_varnext (char *n) | 172 | char *lua_varnext (char *n) |
202 | { | 173 | { |
203 | TreeNode *result = tree_next(variable_root, n); | 174 | TreeNode *result = tree_next(constant_root, n); |
204 | return result != NULL ? result->str : NULL; | 175 | return result != NULL ? result->str : NULL; |
205 | } | 176 | } |
206 | 177 | ||
207 | |||
208 | /* | ||
209 | ** Given an id, find the string with exaustive search | ||
210 | */ | ||
211 | static char *tree_name (TreeNode *node, Word index) | ||
212 | { | ||
213 | if (node == NULL) return NULL; | ||
214 | if (node->index == index) return node->str; | ||
215 | else | ||
216 | { | ||
217 | char *result = tree_name(node->left, index); | ||
218 | return result != NULL ? result : tree_name(node->right, index); | ||
219 | } | ||
220 | } | ||
221 | char *lua_varname (Word index) | ||
222 | { | ||
223 | return tree_name(variable_root, index); | ||
224 | } | ||
@@ -1,7 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | ** tree.h | 2 | ** tree.h |
3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
4 | ** $Id: $ | 4 | ** $Id: tree.h,v 1.1 1994/07/19 21:24:17 celes Exp roberto $ |
5 | */ | 5 | */ |
6 | 6 | ||
7 | #ifndef tree_h | 7 | #ifndef tree_h |
@@ -14,14 +14,23 @@ | |||
14 | #define MARKED_STRING 0xFFFE | 14 | #define MARKED_STRING 0xFFFE |
15 | #define MAX_WORD 0xFFFD | 15 | #define MAX_WORD 0xFFFD |
16 | 16 | ||
17 | |||
18 | typedef struct TreeNode | ||
19 | { | ||
20 | struct TreeNode *right; | ||
21 | struct TreeNode *left; | ||
22 | Word varindex; /* if this is a symbol */ | ||
23 | Word constindex; /* if this is a constant; also used for garbage collection */ | ||
24 | char str[1]; /* \0 byte already reserved */ | ||
25 | } TreeNode; | ||
26 | |||
27 | |||
17 | #define indexstring(s) (*(((Word *)s)-1)) | 28 | #define indexstring(s) (*(((Word *)s)-1)) |
18 | 29 | ||
19 | 30 | ||
20 | char *lua_strcreate (char *str); | 31 | char *lua_strcreate (char *str); |
21 | char *lua_constcreate (char *str); | 32 | TreeNode *lua_constcreate (char *str); |
22 | char *lua_varcreate (char *str); | ||
23 | void lua_strcollector (void); | 33 | void lua_strcollector (void); |
24 | char *lua_varnext (char *n); | 34 | char *lua_varnext (char *n); |
25 | char *lua_varname (Word index); | ||
26 | 35 | ||
27 | #endif | 36 | #endif |