diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-05-13 10:04:33 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2017-05-13 10:04:33 -0300 |
commit | 5c8770f8969a73cf4ca503f54c2217f76de62e04 (patch) | |
tree | d5dac87490011d117277d94c81f6f2fd47b1b094 /lparser.c | |
parent | 7647d5d13d016f114dac4be0b9da62d502eab400 (diff) | |
download | lua-5c8770f8969a73cf4ca503f54c2217f76de62e04.tar.gz lua-5c8770f8969a73cf4ca503f54c2217f76de62e04.tar.bz2 lua-5c8770f8969a73cf4ca503f54c2217f76de62e04.zip |
back to old-style vararg system (with vararg table collecting extra
arguments)
Diffstat (limited to 'lparser.c')
-rw-r--r-- | lparser.c | 11 |
1 files changed, 10 insertions, 1 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lparser.c,v 2.157 2017/04/28 20:57:45 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 2.158 2017/04/29 18:09:17 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 | */ |
@@ -766,7 +766,12 @@ static void parlist (LexState *ls) { | |||
766 | } | 766 | } |
767 | case TK_DOTS: { /* param -> '...' */ | 767 | case TK_DOTS: { /* param -> '...' */ |
768 | luaX_next(ls); | 768 | luaX_next(ls); |
769 | if (testnext(ls, '=')) | ||
770 | new_localvar(ls, str_checkname(ls)); | ||
771 | else | ||
772 | new_localvarliteral(ls, "_ARG"); | ||
769 | f->is_vararg = 1; /* declared vararg */ | 773 | f->is_vararg = 1; /* declared vararg */ |
774 | nparams++; | ||
770 | break; | 775 | break; |
771 | } | 776 | } |
772 | default: luaX_syntaxerror(ls, "<name> or '...' expected"); | 777 | default: luaX_syntaxerror(ls, "<name> or '...' expected"); |
@@ -1622,6 +1627,10 @@ static void mainfunc (LexState *ls, FuncState *fs) { | |||
1622 | expdesc v; | 1627 | expdesc v; |
1623 | open_func(ls, fs, &bl); | 1628 | open_func(ls, fs, &bl); |
1624 | fs->f->is_vararg = 1; /* main function is always declared vararg */ | 1629 | fs->f->is_vararg = 1; /* main function is always declared vararg */ |
1630 | fs->f->numparams = 1; | ||
1631 | new_localvarliteral(ls, "_ARG"); | ||
1632 | adjustlocalvars(ls, 1); | ||
1633 | luaK_reserveregs(fs, 1); /* reserve register for vararg */ | ||
1625 | init_exp(&v, VLOCAL, 0); /* create and... */ | 1634 | init_exp(&v, VLOCAL, 0); /* create and... */ |
1626 | newupvalue(fs, ls->envn, &v); /* ...set environment upvalue */ | 1635 | newupvalue(fs, ls->envn, &v); /* ...set environment upvalue */ |
1627 | luaX_next(ls); /* read first token */ | 1636 | luaX_next(ls); /* read first token */ |