aboutsummaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/lparser.c b/lparser.c
index 77141e79..a07044b8 100644
--- a/lparser.c
+++ b/lparser.c
@@ -1056,9 +1056,8 @@ static void constructor (LexState *ls, expdesc *t) {
1056/* }====================================================================== */ 1056/* }====================================================================== */
1057 1057
1058 1058
1059static void setvararg (FuncState *fs, int kind) { 1059static void setvararg (FuncState *fs) {
1060 lua_assert(kind & PF_ISVARARG); 1060 fs->f->flag |= PF_ISVARARG;
1061 fs->f->flag |= cast_byte(kind);
1062 luaK_codeABC(fs, OP_VARARGPREP, 0, 0, 0); 1061 luaK_codeABC(fs, OP_VARARGPREP, 0, 0, 0);
1063} 1062}
1064 1063
@@ -1078,12 +1077,12 @@ static void parlist (LexState *ls) {
1078 break; 1077 break;
1079 } 1078 }
1080 case TK_DOTS: { 1079 case TK_DOTS: {
1081 varargk |= PF_ISVARARG; 1080 varargk = 1;
1082 luaX_next(ls); /* skip '...' */ 1081 luaX_next(ls); /* skip '...' */
1083 if (ls->t.token == TK_NAME) { 1082 if (ls->t.token == TK_NAME)
1084 new_varkind(ls, str_checkname(ls), RDKVAVAR); 1083 new_varkind(ls, str_checkname(ls), RDKVAVAR);
1085 varargk |= PF_VAVAR; 1084 else
1086 } 1085 new_localvarliteral(ls, "(vararg table)");
1087 break; 1086 break;
1088 } 1087 }
1089 default: luaX_syntaxerror(ls, "<name> or '...' expected"); 1088 default: luaX_syntaxerror(ls, "<name> or '...' expected");
@@ -1092,10 +1091,9 @@ static void parlist (LexState *ls) {
1092 } 1091 }
1093 adjustlocalvars(ls, nparams); 1092 adjustlocalvars(ls, nparams);
1094 f->numparams = cast_byte(fs->nactvar); 1093 f->numparams = cast_byte(fs->nactvar);
1095 if (varargk != 0) { 1094 if (varargk) {
1096 setvararg(fs, varargk); /* declared vararg */ 1095 setvararg(fs); /* declared vararg */
1097 if (varargk & PF_VAVAR) 1096 adjustlocalvars(ls, 1); /* vararg parameter */
1098 adjustlocalvars(ls, 1); /* vararg parameter */
1099 } 1097 }
1100 /* reserve registers for parameters (plus vararg parameter, if present) */ 1098 /* reserve registers for parameters (plus vararg parameter, if present) */
1101 luaK_reserveregs(fs, fs->nactvar); 1099 luaK_reserveregs(fs, fs->nactvar);
@@ -1287,7 +1285,7 @@ static void simpleexp (LexState *ls, expdesc *v) {
1287 FuncState *fs = ls->fs; 1285 FuncState *fs = ls->fs;
1288 check_condition(ls, fs->f->flag & PF_ISVARARG, 1286 check_condition(ls, fs->f->flag & PF_ISVARARG,
1289 "cannot use '...' outside a vararg function"); 1287 "cannot use '...' outside a vararg function");
1290 init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 0, 1)); 1288 init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, fs->f->numparams, 1));
1291 break; 1289 break;
1292 } 1290 }
1293 case '{' /*}*/: { /* constructor */ 1291 case '{' /*}*/: { /* constructor */
@@ -2153,7 +2151,7 @@ static void mainfunc (LexState *ls, FuncState *fs) {
2153 BlockCnt bl; 2151 BlockCnt bl;
2154 Upvaldesc *env; 2152 Upvaldesc *env;
2155 open_func(ls, fs, &bl); 2153 open_func(ls, fs, &bl);
2156 setvararg(fs, PF_ISVARARG); /* main function is always vararg */ 2154 setvararg(fs); /* main function is always vararg */
2157 env = allocupvalue(fs); /* ...set environment upvalue */ 2155 env = allocupvalue(fs); /* ...set environment upvalue */
2158 env->instack = 1; 2156 env->instack = 1;
2159 env->idx = 0; 2157 env->idx = 0;