aboutsummaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2003-05-14 09:32:46 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2003-05-14 09:32:46 -0300
commit5cc448386adad1da2901e381481e4129034b692b (patch)
treea2280f9646958471eed8a271579a804faf93407c /lparser.c
parentc116dcb92b2ee36ef5c4541a88e73540837f1057 (diff)
downloadlua-5cc448386adad1da2901e381481e4129034b692b.tar.gz
lua-5cc448386adad1da2901e381481e4129034b692b.tar.bz2
lua-5cc448386adad1da2901e381481e4129034b692b.zip
new syntax: `... [= name]'
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c38
1 files changed, 22 insertions, 16 deletions
diff --git a/lparser.c b/lparser.c
index ffbe49d9..cc491888 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.208 2003/04/03 13:35:34 roberto Exp roberto $ 2** $Id: lparser.c,v 1.209 2003/05/13 20:15:59 roberto Exp roberto $
3** Lua Parser 3** Lua Parser
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -173,12 +173,6 @@ static void new_localvarstr (LexState *ls, const char *name, int n) {
173} 173}
174 174
175 175
176static void create_local (LexState *ls, const char *name) {
177 new_localvarstr(ls, name, 0);
178 adjustlocalvars(ls, 1);
179}
180
181
182static int indexupvalue (FuncState *fs, TString *name, expdesc *v) { 176static int indexupvalue (FuncState *fs, TString *name, expdesc *v) {
183 int i; 177 int i;
184 Proto *f = fs->f; 178 Proto *f = fs->f;
@@ -267,14 +261,19 @@ static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) {
267} 261}
268 262
269 263
270static void code_params (LexState *ls, int nparams, int dots) { 264static void code_params (LexState *ls, int nparams, TString *dots) {
271 FuncState *fs = ls->fs; 265 FuncState *fs = ls->fs;
266 Proto *f = fs->f;
272 adjustlocalvars(ls, nparams); 267 adjustlocalvars(ls, nparams);
273 luaX_checklimit(ls, fs->nactvar, MAXPARAMS, "parameters"); 268 luaX_checklimit(ls, fs->nactvar, MAXPARAMS, "parameters");
274 fs->f->numparams = cast(lu_byte, fs->nactvar); 269 f->numparams = cast(lu_byte, fs->nactvar);
275 fs->f->is_vararg = cast(lu_byte, dots); 270 if (!dots)
276 if (dots) 271 f->is_vararg = 0;
277 create_local(ls, "arg"); 272 else {
273 f->is_vararg = 1;
274 new_localvar(ls, dots, 0);
275 adjustlocalvars(ls, 1);
276 }
278 luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */ 277 luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */
279} 278}
280 279
@@ -528,12 +527,17 @@ static void constructor (LexState *ls, expdesc *t) {
528static void parlist (LexState *ls) { 527static void parlist (LexState *ls) {
529 /* parlist -> [ param { `,' param } ] */ 528 /* parlist -> [ param { `,' param } ] */
530 int nparams = 0; 529 int nparams = 0;
531 int dots = 0; 530 TString *dots = NULL;
532 if (ls->t.token != ')') { /* is `parlist' not empty? */ 531 if (ls->t.token != ')') { /* is `parlist' not empty? */
533 do { 532 do {
534 switch (ls->t.token) { 533 switch (ls->t.token) {
535 case TK_DOTS: dots = 1; next(ls); break;
536 case TK_NAME: new_localvar(ls, str_checkname(ls), nparams++); break; 534 case TK_NAME: new_localvar(ls, str_checkname(ls), nparams++); break;
535 case TK_DOTS: {
536 next(ls);
537 dots = (testnext(ls, '=')) ? str_checkname(ls) :
538 luaS_new(ls->L, "arg");
539 break;
540 }
537 default: luaX_syntaxerror(ls, "<name> or `...' expected"); 541 default: luaX_syntaxerror(ls, "<name> or `...' expected");
538 } 542 }
539 } while (!dots && testnext(ls, ',')); 543 } while (!dots && testnext(ls, ','));
@@ -548,8 +552,10 @@ static void body (LexState *ls, expdesc *e, int needself, int line) {
548 open_func(ls, &new_fs); 552 open_func(ls, &new_fs);
549 new_fs.f->lineDefined = line; 553 new_fs.f->lineDefined = line;
550 check(ls, '('); 554 check(ls, '(');
551 if (needself) 555 if (needself) {
552 create_local(ls, "self"); 556 new_localvarstr(ls, "self", 0);
557 adjustlocalvars(ls, 1);
558 }
553 parlist(ls); 559 parlist(ls);
554 check(ls, ')'); 560 check(ls, ')');
555 chunk(ls); 561 chunk(ls);