diff options
Diffstat (limited to 'lparser.c')
| -rw-r--r-- | lparser.c | 24 |
1 files changed, 11 insertions, 13 deletions
| @@ -1056,9 +1056,8 @@ static void constructor (LexState *ls, expdesc *t) { | |||
| 1056 | /* }====================================================================== */ | 1056 | /* }====================================================================== */ |
| 1057 | 1057 | ||
| 1058 | 1058 | ||
| 1059 | static void setvararg (FuncState *fs, int kind) { | 1059 | static 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; |
