aboutsummaryrefslogtreecommitdiff
path: root/lua.stx
diff options
context:
space:
mode:
authorWaldemar Celes <celes@tecgraf.puc-rio.br>1995-04-11 14:56:30 -0300
committerWaldemar Celes <celes@tecgraf.puc-rio.br>1995-04-11 14:56:30 -0300
commit8156604823aa487f4436d33fe89302598faab3db (patch)
tree6ed6e5ec52c397e8e3ce11fec01440fd4287b1ab /lua.stx
parent36b6fdda833d4dd4a866d2c96ac42062b2b29af9 (diff)
downloadlua-8156604823aa487f4436d33fe89302598faab3db.tar.gz
lua-8156604823aa487f4436d33fe89302598faab3db.tar.bz2
lua-8156604823aa487f4436d33fe89302598faab3db.zip
run-time stack now is controled at run time, instead of
compilation time.
Diffstat (limited to 'lua.stx')
-rw-r--r--lua.stx50
1 files changed, 28 insertions, 22 deletions
diff --git a/lua.stx b/lua.stx
index 6a900944..e32686c6 100644
--- a/lua.stx
+++ b/lua.stx
@@ -1,6 +1,6 @@
1%{ 1%{
2 2
3char *rcs_luastx = "$Id: lua.stx,v 3.16 1994/12/27 20:41:11 celes Exp roberto $"; 3char *rcs_luastx = "$Id: lua.stx,v 3.17 1995/01/13 22:11:12 roberto Exp celes $";
4 4
5#include <stdio.h> 5#include <stdio.h>
6#include <stdlib.h> 6#include <stdlib.h>
@@ -41,7 +41,8 @@ static Long varbuffer[MAXVAR]; /* variables in an assignment list;
41 it's long to store negative Word values */ 41 it's long to store negative Word values */
42static int nvarbuffer=0; /* number of variables at a list */ 42static int nvarbuffer=0; /* number of variables at a list */
43 43
44static Word localvar[STACKGAP]; /* store local variable names */ 44#define MAXLOCALS 32
45static Word localvar[MAXLOCALS]; /* store local variable names */
45static int nlocalvar=0; /* number of local variables */ 46static int nlocalvar=0; /* number of local variables */
46 47
47#define MAXFIELDS FIELDS_PER_FLUSH*2 48#define MAXFIELDS FIELDS_PER_FLUSH*2
@@ -103,10 +104,10 @@ static void code_word_at (Byte *p, Word n)
103 104
104static void push_field (Word name) 105static void push_field (Word name)
105{ 106{
106 if (nfields < STACKGAP-1) 107 if (nfields < MAXFIELDS)
107 fields[nfields++] = name; 108 fields[nfields++] = name;
108 else 109 else
109 lua_error ("too many fields in a constructor"); 110 lua_error ("too many fields in nested constructors");
110} 111}
111 112
112static void flush_record (int n) 113static void flush_record (int n)
@@ -135,18 +136,26 @@ static void flush_list (int m, int n)
135 code_byte(n); 136 code_byte(n);
136} 137}
137 138
138static void add_nlocalvar (int n) 139static void add_localvar (Word name)
139{ 140{
140 if (MAX_TEMPS+nlocalvar+MAXVAR+n < STACKGAP) 141 if (nlocalvar < MAXLOCALS)
141 nlocalvar += n; 142 localvar[nlocalvar++] = name;
142 else 143 else
143 lua_error ("too many local variables"); 144 lua_error ("too many local variables");
144} 145}
145 146
146static void incr_nvarbuffer (void) 147static void store_localvar (Word name, int n)
147{ 148{
148 if (nvarbuffer < MAXVAR-1) 149 if (nlocalvar+n < MAXLOCALS)
149 nvarbuffer++; 150 localvar[nlocalvar+n] = name;
151 else
152 lua_error ("too many local variables");
153}
154
155static void add_varbuffer (Long var)
156{
157 if (nvarbuffer < MAXVAR)
158 varbuffer[nvarbuffer++] = var;
150 else 159 else
151 lua_error ("variable buffer overflow"); 160 lua_error ("variable buffer overflow");
152} 161}
@@ -436,8 +445,7 @@ function : FUNCTION NAME
436method : FUNCTION NAME ':' NAME 445method : FUNCTION NAME ':' NAME
437 { 446 {
438 init_function($4); 447 init_function($4);
439 localvar[nlocalvar]=luaI_findsymbolbyname("self"); 448 add_localvar(luaI_findsymbolbyname("self"));
440 add_nlocalvar(1);
441 } 449 }
442 body 450 body
443 { 451 {
@@ -506,9 +514,9 @@ stat1 : IF expr1 THEN PrepJump block PrepJump elsepart END
506 } 514 }
507 | functioncall { code_byte(0); } 515 | functioncall { code_byte(0); }
508 | LOCAL localdeclist decinit 516 | LOCAL localdeclist decinit
509 { add_nlocalvar($2); 517 { nlocalvar += $2;
510 adjust_mult_assign($2, $3, 0); 518 adjust_mult_assign($2, $3, 0);
511 } 519 }
512 ; 520 ;
513 521
514elsepart : /* empty */ 522elsepart : /* empty */
@@ -632,13 +640,11 @@ parlist : /* empty */ { lua_codeadjust(0); }
632 640
633parlist1 : NAME 641parlist1 : NAME
634 { 642 {
635 localvar[nlocalvar]=luaI_findsymbol($1); 643 add_localvar(luaI_findsymbol($1));
636 add_nlocalvar(1);
637 } 644 }
638 | parlist1 ',' NAME 645 | parlist1 ',' NAME
639 { 646 {
640 localvar[nlocalvar]=luaI_findsymbol($3); 647 add_localvar(luaI_findsymbol($3));
641 add_nlocalvar(1);
642 } 648 }
643 ; 649 ;
644 650
@@ -683,12 +689,12 @@ lfieldlist1 : expr1 {$$=1;}
683varlist1 : var 689varlist1 : var
684 { 690 {
685 nvarbuffer = 0; 691 nvarbuffer = 0;
686 varbuffer[nvarbuffer] = $1; incr_nvarbuffer(); 692 add_varbuffer($1);
687 $$ = ($1 == 0) ? 1 : 0; 693 $$ = ($1 == 0) ? 1 : 0;
688 } 694 }
689 | varlist1 ',' var 695 | varlist1 ',' var
690 { 696 {
691 varbuffer[nvarbuffer] = $3; incr_nvarbuffer(); 697 add_varbuffer($3);
692 $$ = ($3 == 0) ? $1 + 1 : $1; 698 $$ = ($3 == 0) ? $1 + 1 : $1;
693 } 699 }
694 ; 700 ;
@@ -720,10 +726,10 @@ singlevar : NAME
720varexp : var { lua_pushvar($1); } 726varexp : var { lua_pushvar($1); }
721 ; 727 ;
722 728
723localdeclist : NAME {localvar[nlocalvar]=luaI_findsymbol($1); $$ = 1;} 729localdeclist : NAME {store_localvar(luaI_findsymbol($1), 0); $$ = 1;}
724 | localdeclist ',' NAME 730 | localdeclist ',' NAME
725 { 731 {
726 localvar[nlocalvar+$1]=luaI_findsymbol($3); 732 store_localvar(luaI_findsymbol($3), $1);
727 $$ = $1+1; 733 $$ = $1+1;
728 } 734 }
729 ; 735 ;