aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2003-07-29 15:51:00 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2003-07-29 15:51:00 -0300
commite89945aaa1f42cb41f401c44c56ed0c4a98004c6 (patch)
treee6c10116e2250192f6f462613b3e85404c8e9edc
parentd407d3fe0eb44b9bad0b5f37e55400b8eeb095ec (diff)
downloadlua-e89945aaa1f42cb41f401c44c56ed0c4a98004c6.tar.gz
lua-e89945aaa1f42cb41f401c44c56ed0c4a98004c6.tar.bz2
lua-e89945aaa1f42cb41f401c44c56ed0c4a98004c6.zip
syntax `...=var' changed to `var=...'
-rw-r--r--lparser.c45
1 files changed, 20 insertions, 25 deletions
diff --git a/lparser.c b/lparser.c
index 01161f7a..33d0344e 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lparser.c,v 1.213 2003/07/09 20:11:30 roberto Exp roberto $ 2** $Id: lparser.c,v 1.214 2003/07/28 18:31:20 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*/
@@ -264,23 +264,6 @@ static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) {
264} 264}
265 265
266 266
267static void code_params (LexState *ls, int nparams, TString *dots) {
268 FuncState *fs = ls->fs;
269 Proto *f = fs->f;
270 adjustlocalvars(ls, nparams);
271 luaX_checklimit(ls, fs->nactvar, MAXPARAMS, "parameters");
272 f->numparams = fs->nactvar;
273 if (!dots)
274 f->is_vararg = 0;
275 else {
276 f->is_vararg = 1;
277 new_localvar(ls, dots, 0);
278 adjustlocalvars(ls, 1);
279 }
280 luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */
281}
282
283
284static void enterblock (FuncState *fs, BlockCnt *bl, int isbreakable) { 267static void enterblock (FuncState *fs, BlockCnt *bl, int isbreakable) {
285 bl->breaklist = NO_JUMP; 268 bl->breaklist = NO_JUMP;
286 bl->isbreakable = isbreakable; 269 bl->isbreakable = isbreakable;
@@ -529,23 +512,35 @@ static void constructor (LexState *ls, expdesc *t) {
529 512
530static void parlist (LexState *ls) { 513static void parlist (LexState *ls) {
531 /* parlist -> [ param { `,' param } ] */ 514 /* parlist -> [ param { `,' param } ] */
515 FuncState *fs = ls->fs;
516 Proto *f = fs->f;
532 int nparams = 0; 517 int nparams = 0;
533 TString *dots = NULL; 518 f->is_vararg = 0;
534 if (ls->t.token != ')') { /* is `parlist' not empty? */ 519 if (ls->t.token != ')') { /* is `parlist' not empty? */
535 do { 520 do {
536 switch (ls->t.token) { 521 switch (ls->t.token) {
537 case TK_NAME: new_localvar(ls, str_checkname(ls), nparams++); break; 522 case TK_NAME: { /* param -> NAME [ `=' `...' ] */
538 case TK_DOTS: { 523 new_localvar(ls, str_checkname(ls), nparams++);
524 if (testnext(ls, '=')) {
525 check(ls, TK_DOTS);
526 f->is_vararg = 1;
527 }
528 break;
529 }
530 case TK_DOTS: { /* param -> `...' */
539 next(ls); 531 next(ls);
540 dots = (testnext(ls, '=')) ? str_checkname(ls) : 532 /* use `arg' as default name */
541 luaS_new(ls->L, "arg"); 533 new_localvar(ls, luaS_new(ls->L, "arg"), nparams++);
534 f->is_vararg = 1;
542 break; 535 break;
543 } 536 }
544 default: luaX_syntaxerror(ls, "<name> or `...' expected"); 537 default: luaX_syntaxerror(ls, "<name> or `...' expected");
545 } 538 }
546 } while (!dots && testnext(ls, ',')); 539 } while (!f->is_vararg && testnext(ls, ','));
547 } 540 }
548 code_params(ls, nparams, dots); 541 adjustlocalvars(ls, nparams);
542 f->numparams = fs->nactvar - f->is_vararg;
543 luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */
549} 544}
550 545
551 546