aboutsummaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-07-30 12:18:19 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-07-30 12:18:19 -0300
commit0d529138042563baf260366e19a7aa2c60a07174 (patch)
treeea8699a57a9b26e620a2ed6bc2a11c9e49dee780 /lparser.c
parentb80077b8f3e27a94c6afa895b41a9f8b52c42e61 (diff)
downloadlua-0d529138042563baf260366e19a7aa2c60a07174.tar.gz
lua-0d529138042563baf260366e19a7aa2c60a07174.tar.bz2
lua-0d529138042563baf260366e19a7aa2c60a07174.zip
Change in the syntax of attributes
Attributes changed to posfixed ('x <const>', instead of '<const> x'), and "toclose" renamed to "close". Posfixed attributes seem to make it clearer that it applies to only one variable when there are multiple variables.
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/lparser.c b/lparser.c
index f1d2ce85..2dcd320c 100644
--- a/lparser.c
+++ b/lparser.c
@@ -190,7 +190,7 @@ static int registerlocalvar (LexState *ls, FuncState *fs, TString *varname) {
190** Create a new local variable with the given 'name'. Return its index 190** Create a new local variable with the given 'name'. Return its index
191** in the function. 191** in the function.
192*/ 192*/
193static int new_localvar (LexState *ls, TString *name, int kind) { 193static int new_localvar (LexState *ls, TString *name) {
194 lua_State *L = ls->L; 194 lua_State *L = ls->L;
195 FuncState *fs = ls->fs; 195 FuncState *fs = ls->fs;
196 Dyndata *dyd = ls->dyd; 196 Dyndata *dyd = ls->dyd;
@@ -200,14 +200,14 @@ static int new_localvar (LexState *ls, TString *name, int kind) {
200 luaM_growvector(L, dyd->actvar.arr, dyd->actvar.n + 1, 200 luaM_growvector(L, dyd->actvar.arr, dyd->actvar.n + 1,
201 dyd->actvar.size, Vardesc, USHRT_MAX, "local variables"); 201 dyd->actvar.size, Vardesc, USHRT_MAX, "local variables");
202 var = &dyd->actvar.arr[dyd->actvar.n++]; 202 var = &dyd->actvar.arr[dyd->actvar.n++];
203 var->vd.kind = kind; 203 var->vd.kind = VDKREG; /* default */
204 var->vd.name = name; 204 var->vd.name = name;
205 return dyd->actvar.n - 1 - fs->firstlocal; 205 return dyd->actvar.n - 1 - fs->firstlocal;
206} 206}
207 207
208#define new_localvarliteral(ls,v) \ 208#define new_localvarliteral(ls,v) \
209 new_localvar(ls, \ 209 new_localvar(ls, \
210 luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char)) - 1), VDKREG); 210 luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char)) - 1));
211 211
212 212
213 213
@@ -947,7 +947,7 @@ static void parlist (LexState *ls) {
947 do { 947 do {
948 switch (ls->t.token) { 948 switch (ls->t.token) {
949 case TK_NAME: { /* param -> NAME */ 949 case TK_NAME: { /* param -> NAME */
950 new_localvar(ls, str_checkname(ls), VDKREG); 950 new_localvar(ls, str_checkname(ls));
951 nparams++; 951 nparams++;
952 break; 952 break;
953 } 953 }
@@ -1553,7 +1553,7 @@ static void fornum (LexState *ls, TString *varname, int line) {
1553 new_localvarliteral(ls, "(for state)"); 1553 new_localvarliteral(ls, "(for state)");
1554 new_localvarliteral(ls, "(for state)"); 1554 new_localvarliteral(ls, "(for state)");
1555 new_localvarliteral(ls, "(for state)"); 1555 new_localvarliteral(ls, "(for state)");
1556 new_localvar(ls, varname, VDKREG); 1556 new_localvar(ls, varname);
1557 checknext(ls, '='); 1557 checknext(ls, '=');
1558 exp1(ls); /* initial value */ 1558 exp1(ls); /* initial value */
1559 checknext(ls, ','); 1559 checknext(ls, ',');
@@ -1582,9 +1582,9 @@ static void forlist (LexState *ls, TString *indexname) {
1582 new_localvarliteral(ls, "(for state)"); 1582 new_localvarliteral(ls, "(for state)");
1583 new_localvarliteral(ls, "(for state)"); 1583 new_localvarliteral(ls, "(for state)");
1584 /* create declared variables */ 1584 /* create declared variables */
1585 new_localvar(ls, indexname, VDKREG); 1585 new_localvar(ls, indexname);
1586 while (testnext(ls, ',')) { 1586 while (testnext(ls, ',')) {
1587 new_localvar(ls, str_checkname(ls), VDKREG); 1587 new_localvar(ls, str_checkname(ls));
1588 nvars++; 1588 nvars++;
1589 } 1589 }
1590 checknext(ls, TK_IN); 1590 checknext(ls, TK_IN);
@@ -1708,7 +1708,7 @@ static void localfunc (LexState *ls) {
1708 expdesc b; 1708 expdesc b;
1709 FuncState *fs = ls->fs; 1709 FuncState *fs = ls->fs;
1710 int fvar = fs->nactvar; /* function's variable index */ 1710 int fvar = fs->nactvar; /* function's variable index */
1711 new_localvar(ls, str_checkname(ls), VDKREG); /* new local variable */ 1711 new_localvar(ls, str_checkname(ls)); /* new local variable */
1712 adjustlocalvars(ls, 1); /* enter its scope */ 1712 adjustlocalvars(ls, 1); /* enter its scope */
1713 body(ls, &b, 0, ls->linenumber); /* function created in next register */ 1713 body(ls, &b, 0, ls->linenumber); /* function created in next register */
1714 /* debug information will only see the variable after this point! */ 1714 /* debug information will only see the variable after this point! */
@@ -1723,7 +1723,7 @@ static int getlocalattribute (LexState *ls) {
1723 checknext(ls, '>'); 1723 checknext(ls, '>');
1724 if (strcmp(attr, "const") == 0) 1724 if (strcmp(attr, "const") == 0)
1725 return RDKCONST; /* read-only variable */ 1725 return RDKCONST; /* read-only variable */
1726 else if (strcmp(attr, "toclose") == 0) 1726 else if (strcmp(attr, "close") == 0)
1727 return RDKTOCLOSE; /* to-be-closed variable */ 1727 return RDKTOCLOSE; /* to-be-closed variable */
1728 else 1728 else
1729 luaK_semerror(ls, 1729 luaK_semerror(ls,
@@ -1748,13 +1748,14 @@ static void localstat (LexState *ls) {
1748 FuncState *fs = ls->fs; 1748 FuncState *fs = ls->fs;
1749 int toclose = -1; /* index of to-be-closed variable (if any) */ 1749 int toclose = -1; /* index of to-be-closed variable (if any) */
1750 Vardesc *var; /* last variable */ 1750 Vardesc *var; /* last variable */
1751 int ivar; /* index of last variable */ 1751 int ivar, kind; /* index and kind of last variable */
1752 int nvars = 0; 1752 int nvars = 0;
1753 int nexps; 1753 int nexps;
1754 expdesc e; 1754 expdesc e;
1755 do { 1755 do {
1756 int kind = getlocalattribute(ls); 1756 ivar = new_localvar(ls, str_checkname(ls));
1757 ivar = new_localvar(ls, str_checkname(ls), kind); 1757 kind = getlocalattribute(ls);
1758 getlocalvardesc(fs, ivar)->vd.kind = kind;
1758 if (kind == RDKTOCLOSE) { /* to-be-closed? */ 1759 if (kind == RDKTOCLOSE) { /* to-be-closed? */
1759 if (toclose != -1) /* one already present? */ 1760 if (toclose != -1) /* one already present? */
1760 luaK_semerror(ls, "multiple to-be-closed variables in local list"); 1761 luaK_semerror(ls, "multiple to-be-closed variables in local list");