aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1994-11-09 16:07:38 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1994-11-09 16:07:38 -0200
commitb8bfa9628d565da245f73172a7c4d1f6247fa3b9 (patch)
tree16eef95c6d348ed2b64f7af006bceb1e34832c4a
parentdabe09518fd1509597e55d9f2819c418eabd82c0 (diff)
downloadlua-b8bfa9628d565da245f73172a7c4d1f6247fa3b9.tar.gz
lua-b8bfa9628d565da245f73172a7c4d1f6247fa3b9.tar.bz2
lua-b8bfa9628d565da245f73172a7c4d1f6247fa3b9.zip
because lua_error does a longjmp, there is no need to a variable
'err'. lua_parse has a different interface, to allow the free of the main block even if compilation fails. small changes in the debug system.
-rw-r--r--lua.stx105
1 files changed, 36 insertions, 69 deletions
diff --git a/lua.stx b/lua.stx
index 7e5a9508..92e7f6b8 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,6 +1,6 @@
1%{ 1%{
2 2
3char *rcs_luastx = "$Id: lua.stx,v 3.2 1994/11/03 22:32:42 roberto Exp $"; 3char *rcs_luastx = "$Id: lua.stx,v 3.3 1994/11/06 15:35:04 roberto Exp roberto $";
4 4
5#include <stdio.h> 5#include <stdio.h>
6#include <stdlib.h> 6#include <stdlib.h>
@@ -12,7 +12,9 @@ char *rcs_luastx = "$Id: lua.stx,v 3.2 1994/11/03 22:32:42 roberto Exp $";
12#include "table.h" 12#include "table.h"
13#include "lua.h" 13#include "lua.h"
14 14
15#ifndef LISTING
15#define LISTING 0 16#define LISTING 0
17#endif
16 18
17#ifndef CODE_BLOCK 19#ifndef CODE_BLOCK
18#define CODE_BLOCK 256 20#define CODE_BLOCK 256
@@ -21,7 +23,7 @@ static Long maxcode;
21static Long maxmain; 23static Long maxmain;
22static Long maxcurr ; 24static Long maxcurr ;
23static Byte *code = NULL; 25static Byte *code = NULL;
24static Byte *initcode; 26static Byte **initcode;
25static Byte *basepc; 27static Byte *basepc;
26static Long maincode; 28static Long maincode;
27static Long pc; 29static Long pc;
@@ -37,7 +39,6 @@ static int nlocalvar=0; /* number of local variables */
37#define MAXFIELDS FIELDS_PER_FLUSH*2 39#define MAXFIELDS FIELDS_PER_FLUSH*2
38static Word fields[MAXFIELDS]; /* fieldnames to be flushed */ 40static Word fields[MAXFIELDS]; /* fieldnames to be flushed */
39static int nfields=0; 41static int nfields=0;
40static int err; /* flag to indicate error */
41 42
42/* Internal functions */ 43/* Internal functions */
43 44
@@ -48,10 +49,7 @@ static void code_byte (Byte c)
48 maxcurr *= 2; 49 maxcurr *= 2;
49 basepc = (Byte *)realloc(basepc, maxcurr*sizeof(Byte)); 50 basepc = (Byte *)realloc(basepc, maxcurr*sizeof(Byte));
50 if (basepc == NULL) 51 if (basepc == NULL)
51 {
52 lua_error ("not enough memory"); 52 lua_error ("not enough memory");
53 err = 1;
54 }
55 } 53 }
56 basepc[pc++] = c; 54 basepc[pc++] = c;
57} 55}
@@ -97,10 +95,7 @@ static void push_field (Word name)
97 if (nfields < STACKGAP-1) 95 if (nfields < STACKGAP-1)
98 fields[nfields++] = name; 96 fields[nfields++] = name;
99 else 97 else
100 {
101 lua_error ("too many fields in a constructor"); 98 lua_error ("too many fields in a constructor");
102 err = 1;
103 }
104} 99}
105 100
106static void flush_record (int n) 101static void flush_record (int n)
@@ -125,10 +120,7 @@ static void flush_list (int m, int n)
125 code_byte(m); 120 code_byte(m);
126 } 121 }
127 else 122 else
128 {
129 lua_error ("list constructor too long"); 123 lua_error ("list constructor too long");
130 err = 1;
131 }
132 code_byte(n); 124 code_byte(n);
133} 125}
134 126
@@ -137,10 +129,7 @@ static void add_nlocalvar (int n)
137 if (MAX_TEMPS+nlocalvar+MAXVAR+n < STACKGAP) 129 if (MAX_TEMPS+nlocalvar+MAXVAR+n < STACKGAP)
138 nlocalvar += n; 130 nlocalvar += n;
139 else 131 else
140 {
141 lua_error ("too many local variables"); 132 lua_error ("too many local variables");
142 err = 1;
143 }
144} 133}
145 134
146static void incr_nvarbuffer (void) 135static void incr_nvarbuffer (void)
@@ -148,10 +137,7 @@ static void incr_nvarbuffer (void)
148 if (nvarbuffer < MAXVAR-1) 137 if (nvarbuffer < MAXVAR-1)
149 nvarbuffer++; 138 nvarbuffer++;
150 else 139 else
151 {
152 lua_error ("variable buffer overflow"); 140 lua_error ("variable buffer overflow");
153 err = 1;
154 }
155} 141}
156 142
157static void code_number (float f) 143static void code_number (float f)
@@ -184,10 +170,7 @@ static void init_function (void)
184 { 170 {
185 code = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); 171 code = (Byte *) calloc(CODE_BLOCK, sizeof(Byte));
186 if (code == NULL) 172 if (code == NULL)
187 {
188 lua_error("not enough memory"); 173 lua_error("not enough memory");
189 err = 1;
190 }
191 maxcode = CODE_BLOCK; 174 maxcode = CODE_BLOCK;
192 } 175 }
193} 176}
@@ -242,12 +225,12 @@ static void init_function (void)
242functionlist : /* empty */ 225functionlist : /* empty */
243 | functionlist 226 | functionlist
244 { 227 {
245 pc=maincode; basepc=initcode; maxcurr=maxmain; 228 pc=maincode; basepc=*initcode; maxcurr=maxmain;
246 nlocalvar=0; 229 nlocalvar=0;
247 } 230 }
248 stat sc 231 stat sc
249 { 232 {
250 maincode=pc; initcode=basepc; maxmain=maxcurr; 233 maincode=pc; *initcode=basepc; maxmain=maxcurr;
251 } 234 }
252 | functionlist function 235 | functionlist function
253 | functionlist method 236 | functionlist method
@@ -266,7 +249,7 @@ function : FUNCTION NAME
266 if (lua_debug) 249 if (lua_debug)
267 { 250 {
268 code_byte(SETFUNCTION); 251 code_byte(SETFUNCTION);
269 code_code((Byte *)lua_file[lua_nfile-1]); 252 code_code((Byte *)strdup(lua_file[lua_nfile-1]));
270 code_word($<vWord>3); 253 code_word($<vWord>3);
271 } 254 }
272 lua_codeadjust (0); 255 lua_codeadjust (0);
@@ -278,10 +261,7 @@ function : FUNCTION NAME
278 s_tag($<vWord>3) = LUA_T_FUNCTION; 261 s_tag($<vWord>3) = LUA_T_FUNCTION;
279 s_bvalue($<vWord>3) = calloc (pc, sizeof(Byte)); 262 s_bvalue($<vWord>3) = calloc (pc, sizeof(Byte));
280 if (s_bvalue($<vWord>3) == NULL) 263 if (s_bvalue($<vWord>3) == NULL)
281 { 264 lua_error("not enough memory");
282 lua_error("not enough memory");
283 err = 1;
284 }
285 memcpy (s_bvalue($<vWord>3), basepc, pc*sizeof(Byte)); 265 memcpy (s_bvalue($<vWord>3), basepc, pc*sizeof(Byte));
286 code = basepc; maxcode=maxcurr; 266 code = basepc; maxcode=maxcurr;
287#if LISTING 267#if LISTING
@@ -304,7 +284,7 @@ method : FUNCTION NAME { $<vWord>$ = lua_findsymbol($2); } ':' NAME
304 if (lua_debug) 284 if (lua_debug)
305 { 285 {
306 code_byte(SETFUNCTION); 286 code_byte(SETFUNCTION);
307 code_code((Byte *)lua_file[lua_nfile-1]); 287 code_code((Byte *)strdup(lua_file[lua_nfile-1]));
308 code_word($<vWord>6); 288 code_word($<vWord>6);
309 } 289 }
310 lua_codeadjust (0); 290 lua_codeadjust (0);
@@ -316,17 +296,14 @@ method : FUNCTION NAME { $<vWord>$ = lua_findsymbol($2); } ':' NAME
316 codereturn(); 296 codereturn();
317 b = calloc (pc, sizeof(Byte)); 297 b = calloc (pc, sizeof(Byte));
318 if (b == NULL) 298 if (b == NULL)
319 { 299 lua_error("not enough memory");
320 lua_error("not enough memory");
321 err = 1;
322 }
323 memcpy (b, basepc, pc*sizeof(Byte)); 300 memcpy (b, basepc, pc*sizeof(Byte));
324 code = basepc; maxcode=maxcurr; 301 code = basepc; maxcode=maxcurr;
325#if LISTING 302#if LISTING
326 PrintCode(code,code+pc); 303 PrintCode(code,code+pc);
327#endif 304#endif
328 /* assign function to table field */ 305 /* assign function to table field */
329 pc=maincode; basepc=initcode; maxcurr=maxmain; 306 pc=maincode; basepc=*initcode; maxcurr=maxmain;
330 nlocalvar=0; 307 nlocalvar=0;
331 308
332 lua_pushvar($<vWord>3+1); 309 lua_pushvar($<vWord>3+1);
@@ -336,7 +313,7 @@ method : FUNCTION NAME { $<vWord>$ = lua_findsymbol($2); } ':' NAME
336 code_code(b); 313 code_code(b);
337 code_byte(STOREINDEXED0); 314 code_byte(STOREINDEXED0);
338 315
339 maincode=pc; initcode=basepc; maxmain=maxcurr; 316 maincode=pc; *initcode=basepc; maxmain=maxcurr;
340 } 317 }
341 ; 318 ;
342 319
@@ -344,18 +321,13 @@ statlist : /* empty */
344 | statlist stat sc 321 | statlist stat sc
345 ; 322 ;
346 323
347stat : { 324stat : { codedebugline(); } stat1 ;
348 if (lua_debug)
349 {
350 code_byte(SETLINE); code_word(lua_linenumber);
351 }
352 }
353 stat1
354 325
355sc : /* empty */ | ';' ; 326sc : /* empty */ | ';' ;
356 327
328cond : { codedebugline(); } expr1 ;
357 329
358stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END 330stat1 : IF cond THEN PrepJump block PrepJump elsepart END
359 { 331 {
360 { 332 {
361 Long elseinit = $6+sizeof(Word)+1; 333 Long elseinit = $6+sizeof(Word)+1;
@@ -374,7 +346,7 @@ stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END
374 } 346 }
375 } 347 }
376 348
377 | WHILE {$<vLong>$=pc;} expr1 DO PrepJump block PrepJump END 349 | WHILE {$<vLong>$=pc;} cond DO PrepJump block PrepJump END
378 350
379 { 351 {
380 basepc[$5] = IFFJMP; 352 basepc[$5] = IFFJMP;
@@ -403,7 +375,7 @@ stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END
403 lua_codeadjust (0); 375 lua_codeadjust (0);
404 } 376 }
405 } 377 }
406 | functioncall { code_byte(0); } 378 | functioncall { code_byte(0); }
407 | LOCAL localdeclist decinit 379 | LOCAL localdeclist decinit
408 { add_nlocalvar($2); 380 { add_nlocalvar($2);
409 adjust_mult_assign($2, $3, 0); 381 adjust_mult_assign($2, $3, 0);
@@ -443,7 +415,7 @@ block : {$<vInt>$ = nlocalvar;} statlist ret
443 ; 415 ;
444 416
445ret : /* empty */ 417ret : /* empty */
446 | { if (lua_debug){code_byte(SETLINE);code_word(lua_linenumber);}} 418 | { codedebugline(); }
447 RETURN exprlist sc 419 RETURN exprlist sc
448 { 420 {
449 if ($3 < 0) code_byte(MULT_RET); 421 if ($3 < 0) code_byte(MULT_RET);
@@ -486,14 +458,7 @@ expr : '(' expr ')' { $$ = $2; }
486 $$ = 1; 458 $$ = 1;
487 } 459 }
488 | NIL {code_byte(PUSHNIL); $$ = 1; } 460 | NIL {code_byte(PUSHNIL); $$ = 1; }
489 | functioncall 461 | functioncall { $$ = 0; }
490 {
491 $$ = 0;
492 if (lua_debug)
493 {
494 code_byte(SETLINE); code_word(lua_linenumber);
495 }
496 }
497 | NOT expr1 { code_byte(NOTOP); $$ = 1;} 462 | NOT expr1 { code_byte(NOTOP); $$ = 1;}
498 | expr1 AND PrepJump {code_byte(POP); } expr1 463 | expr1 AND PrepJump {code_byte(POP); } expr1
499 { 464 {
@@ -723,6 +688,15 @@ static void codereturn (void)
723 } 688 }
724} 689}
725 690
691static void codedebugline (void)
692{
693 if (lua_debug)
694 {
695 code_byte(SETLINE);
696 code_word(lua_linenumber);
697 }
698}
699
726static void adjust_mult_assign (int vars, int exps, int temps) 700static void adjust_mult_assign (int vars, int exps, int temps)
727{ 701{
728 if (exps < 0) 702 if (exps < 0)
@@ -781,7 +755,6 @@ void yyerror (char *s)
781 sprintf (msg,"%s near \"%s\" at line %d in file \"%s\"", 755 sprintf (msg,"%s near \"%s\" at line %d in file \"%s\"",
782 s, lua_lasttext (), lua_linenumber, lua_filename()); 756 s, lua_lasttext (), lua_linenumber, lua_filename());
783 lua_error (msg); 757 lua_error (msg);
784 err = 1;
785} 758}
786 759
787int yywrap (void) 760int yywrap (void)
@@ -791,27 +764,21 @@ int yywrap (void)
791 764
792 765
793/* 766/*
794** Parse LUA code and returns global statements. 767** Parse LUA code.
795*/ 768*/
796Byte *lua_parse (void) 769void lua_parse (Byte **code)
797{ 770{
798 Byte *init = initcode = (Byte *) calloc(CODE_BLOCK, sizeof(Byte)); 771 initcode = code;
772 *initcode = (Byte *) calloc(CODE_BLOCK, sizeof(Byte));
799 maincode = 0; 773 maincode = 0;
800 maxmain = CODE_BLOCK; 774 maxmain = CODE_BLOCK;
801 if (init == NULL) 775 if (*initcode == NULL) lua_error("not enough memory");
802 { 776 if (yyparse ()) lua_error("parse error");
803 lua_error("not enough memory"); 777 (*initcode)[maincode++] = RETCODE0;
804 return NULL;
805 }
806 err = 0;
807 if (yyparse () || (err==1)) return NULL;
808 initcode[maincode++] = RETCODE0;
809 init = initcode;
810#if LISTING 778#if LISTING
811{ static void PrintCode (Byte *code, Byte *end); 779{ static void PrintCode (Byte *code, Byte *end);
812 PrintCode(init,init+maincode); } 780 PrintCode(*initcode,*initcode+maincode); }
813#endif 781#endif
814 return init;
815} 782}
816 783
817 784