summaryrefslogtreecommitdiff
path: root/lua.stx
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>1995-10-26 12:21:56 -0200
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>1995-10-26 12:21:56 -0200
commit15d48576ea737d51e579f101a870e37f62b81f22 (patch)
treeed2390188cfb5304d366696262ccda593f3e8589 /lua.stx
parent39b071f7b13e6ed6eff4a0f0471d2450a9c48084 (diff)
downloadlua-15d48576ea737d51e579f101a870e37f62b81f22.tar.gz
lua-15d48576ea737d51e579f101a870e37f62b81f22.tar.bz2
lua-15d48576ea737d51e579f101a870e37f62b81f22.zip
functions now may be declared with any "var" as a name;
therefore they do not have a "baptism" name. Changes in debug API to acomodate that.
Diffstat (limited to 'lua.stx')
-rw-r--r--lua.stx124
1 files changed, 60 insertions, 64 deletions
diff --git a/lua.stx b/lua.stx
index 1c9df40b..a2ee9d23 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,6 +1,6 @@
1%{ 1%{
2 2
3char *rcs_luastx = "$Id: lua.stx,v 3.22 1995/10/25 13:05:51 roberto Exp roberto $"; 3char *rcs_luastx = "$Id: lua.stx,v 3.23 1995/10/25 14:33:25 roberto Exp roberto $";
4 4
5#include <stdio.h> 5#include <stdio.h>
6#include <stdlib.h> 6#include <stdlib.h>
@@ -54,6 +54,14 @@ static int nfields=0;
54 54
55/* Internal functions */ 55/* Internal functions */
56 56
57static void yyerror (char *s)
58{
59 static char msg[256];
60 sprintf (msg,"%s near \"%s\" at line %d in file `%s'",
61 s, lua_lasttext (), lua_linenumber, lua_parsedfile);
62 lua_error (msg);
63}
64
57static void code_byte (Byte c) 65static void code_byte (Byte c)
58{ 66{
59 if (pc>maxcurr-2) /* 1 byte free to code HALT of main code */ 67 if (pc>maxcurr-2) /* 1 byte free to code HALT of main code */
@@ -148,6 +156,8 @@ static void add_localvar (Word name)
148 156
149static void store_localvar (Word name, int n) 157static void store_localvar (Word name, int n)
150{ 158{
159 if (*initcode == basepc)
160 yyerror("local variable outside function body");
151 if (nlocalvar+n < MAXLOCALS) 161 if (nlocalvar+n < MAXLOCALS)
152 localvar[nlocalvar+n] = name; 162 localvar[nlocalvar+n] = name;
153 else 163 else
@@ -249,6 +259,20 @@ static void savemain (void)
249 maincode=pc; *initcode=basepc; maxmain=maxcurr; 259 maincode=pc; *initcode=basepc; maxmain=maxcurr;
250} 260}
251 261
262static void init_func (void)
263{
264 if (funcCode == NULL) /* first function */
265 {
266 funcCode = newvector(CODE_BLOCK, Byte);
267 maxcode = CODE_BLOCK;
268 }
269 savemain(); /* save main values */
270 /* set func values */
271 pc=0; basepc=funcCode; maxcurr=maxcode;
272 nlocalvar = 0;
273 luaI_codedebugline(lua_linenumber);
274}
275
252static void codereturn (void) 276static void codereturn (void)
253{ 277{
254 if (nlocalvar == 0) 278 if (nlocalvar == 0)
@@ -300,23 +324,31 @@ static void adjust_mult_assign (int vars, Long exps, int temps)
300 lua_codeadjust(temps); 324 lua_codeadjust(temps);
301} 325}
302 326
303static void lua_codestore (int i) 327static void storesinglevar (Long v)
304{ 328{
305 if (varbuffer[i] > 0) /* global var */ 329 if (v > 0) /* global var */
306 { 330 {
307 code_byte(STOREGLOBAL); 331 code_byte(STOREGLOBAL);
308 code_word(varbuffer[i]-1); 332 code_word(v-1);
309 } 333 }
310 else if (varbuffer[i] < 0) /* local var */ 334 else if (v < 0) /* local var */
311 { 335 {
312 int number = (-varbuffer[i]) - 1; 336 int number = (-v) - 1;
313 if (number < 10) code_byte(STORELOCAL0 + number); 337 if (number < 10) code_byte(STORELOCAL0 + number);
314 else 338 else
315 { 339 {
316 code_byte(STORELOCAL); 340 code_byte(STORELOCAL);
317 code_byte(number); 341 code_byte(number);
318 } 342 }
319 } 343 }
344 else
345 code_byte(STOREINDEXED0);
346}
347
348static void lua_codestore (int i)
349{
350 if (varbuffer[i] != 0) /* global or local var */
351 storesinglevar(varbuffer[i]);
320 else /* indexed var */ 352 else /* indexed var */
321 { 353 {
322 int j; 354 int j;
@@ -352,14 +384,6 @@ static void codeIf (Long thenAdd, Long elseAdd)
352 code_word_at(basepc+thenAdd+1,elseinit-(thenAdd+sizeof(Word)+1)); 384 code_word_at(basepc+thenAdd+1,elseinit-(thenAdd+sizeof(Word)+1));
353} 385}
354 386
355static void yyerror (char *s)
356{
357 static char msg[256];
358 sprintf (msg,"%s near \"%s\" at line %d in file `%s'",
359 s, lua_lasttext (), lua_linenumber, lua_parsedfile);
360 lua_error (msg);
361}
362
363 387
364/* 388/*
365** Parse LUA code. 389** Parse LUA code.
@@ -419,8 +443,8 @@ void lua_parse (TFunc *tf)
419%type <vInt> fieldlist, localdeclist, decinit 443%type <vInt> fieldlist, localdeclist, decinit
420%type <vInt> ffieldlist, ffieldlist1, semicolonpart 444%type <vInt> ffieldlist, ffieldlist1, semicolonpart
421%type <vInt> lfieldlist, lfieldlist1 445%type <vInt> lfieldlist, lfieldlist1
422%type <vInt> functiontoken 446%type <vInt> parlist
423%type <vLong> var, singlevar 447%type <vLong> var, singlevar, funcname
424%type <pFunc> body 448%type <pFunc> body
425 449
426%left AND OR 450%left AND OR
@@ -438,59 +462,29 @@ void lua_parse (TFunc *tf)
438functionlist : /* empty */ 462functionlist : /* empty */
439 | functionlist globalstat 463 | functionlist globalstat
440 | functionlist function 464 | functionlist function
441 | functionlist method
442 ; 465 ;
443 466
444globalstat : stat sc 467globalstat : stat sc
445 | setdebug 468 | setdebug
446 ; 469 ;
447 470
448function : functiontoken NAME body 471function : FUNCTION funcname body
449 { 472 {
450 code_byte(PUSHFUNCTION); 473 code_byte(PUSHFUNCTION);
451 code_code($3); 474 code_code($3);
452 code_byte(STOREGLOBAL); 475 storesinglevar($2);
453 code_word(luaI_findsymbol($2));
454 $3->lineDefined = $1;
455 $3->name1 = $2->ts.str;
456 $3->name2 = NULL;
457 $3->fileName = lua_parsedfile;
458 } 476 }
459 ; 477 ;
460 478
461method : functiontoken NAME methkind NAME body 479funcname : var { $$ =$1; init_func(); }
462 { 480 | varexp ':' NAME
463 /* assign function to table field */
464 lua_pushvar(luaI_findsymbol($2)+1);
465 code_byte(PUSHSTRING);
466 code_word(luaI_findconstant($4));
467 code_byte(PUSHFUNCTION);
468 code_code($5);
469 code_byte(STOREINDEXED0);
470 $5->lineDefined = $1;
471 $5->name1 = $4->ts.str;
472 $5->name2 = $2->ts.str;
473 $5->fileName = lua_parsedfile;
474 }
475 ;
476
477functiontoken : FUNCTION
478 { 481 {
479 if (funcCode == NULL) /* first function */ 482 code_byte(PUSHSTRING);
480 { 483 code_word(luaI_findconstant($3));
481 funcCode = newvector(CODE_BLOCK, Byte); 484 $$ = 0; /* indexed variable */
482 maxcode = CODE_BLOCK; 485 init_func();
483 } 486 add_localvar(luaI_findsymbolbyname("self"));
484 savemain(); /* save main values */
485 /* set func values */
486 pc=0; basepc=funcCode; maxcurr=maxcode;
487 nlocalvar=0;
488 $$ = lua_linenumber;
489 } 487 }
490 ;
491
492methkind : ':' { add_localvar(luaI_findsymbolbyname("self")); }
493 | '.' /* no self */
494 ; 488 ;
495 489
496body : '(' parlist ')' block END 490body : '(' parlist ')' block END
@@ -499,6 +493,8 @@ body : '(' parlist ')' block END
499 $$ = new(TFunc); 493 $$ = new(TFunc);
500 $$->size = pc; 494 $$->size = pc;
501 $$->code = newvector(pc, Byte); 495 $$->code = newvector(pc, Byte);
496 $$->fileName = lua_parsedfile;
497 $$->lineDefined = $2;
502 memcpy($$->code, basepc, pc*sizeof(Byte)); 498 memcpy($$->code, basepc, pc*sizeof(Byte));
503 /* save func values */ 499 /* save func values */
504 funcCode = basepc; maxcode=maxcurr; 500 funcCode = basepc; maxcode=maxcurr;
@@ -674,8 +670,8 @@ exprlist1 : expr { if ($1 != 0) $$ = $1; else $$ = -1; }
674 } 670 }
675 ; 671 ;
676 672
677parlist : /* empty */ { lua_codeadjust(0); } 673parlist : /* empty */ { lua_codeadjust(0); $$ = lua_linenumber; }
678 | parlist1 { lua_codeadjust(0); } 674 | parlist1 { lua_codeadjust(0); $$ = lua_linenumber; }
679 ; 675 ;
680 676
681parlist1 : NAME 677parlist1 : NAME