aboutsummaryrefslogtreecommitdiff
path: root/lparser.c
diff options
context:
space:
mode:
Diffstat (limited to 'lparser.c')
-rw-r--r--lparser.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/lparser.c b/lparser.c
index f7e78793..8b909f3d 100644
--- a/lparser.c
+++ b/lparser.c
@@ -289,7 +289,7 @@ static void check_readonly (LexState *ls, expdesc *e) {
289 varname = ls->dyd->actvar.arr[e->u.info].vd.name; 289 varname = ls->dyd->actvar.arr[e->u.info].vd.name;
290 break; 290 break;
291 } 291 }
292 case VLOCAL: { 292 case VLOCAL: case VVARGVAR: {
293 Vardesc *vardesc = getlocalvardesc(fs, e->u.var.vidx); 293 Vardesc *vardesc = getlocalvardesc(fs, e->u.var.vidx);
294 if (vardesc->vd.kind != VDKREG) /* not a regular variable? */ 294 if (vardesc->vd.kind != VDKREG) /* not a regular variable? */
295 varname = vardesc->vd.name; 295 varname = vardesc->vd.name;
@@ -426,8 +426,11 @@ static int searchvar (FuncState *fs, TString *n, expdesc *var) {
426 else if (eqstr(n, vd->vd.name)) { /* found? */ 426 else if (eqstr(n, vd->vd.name)) { /* found? */
427 if (vd->vd.kind == RDKCTC) /* compile-time constant? */ 427 if (vd->vd.kind == RDKCTC) /* compile-time constant? */
428 init_exp(var, VCONST, fs->firstlocal + i); 428 init_exp(var, VCONST, fs->firstlocal + i);
429 else /* local variable */ 429 else { /* local variable */
430 init_var(fs, var, i); 430 init_var(fs, var, i);
431 if (vd->vd.kind == RDKVAVAR) /* vararg parameter? */
432 var->k = VVARGVAR;
433 }
431 return cast_int(var->k); 434 return cast_int(var->k);
432 } 435 }
433 } 436 }
@@ -467,8 +470,13 @@ static void marktobeclosed (FuncState *fs) {
467static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { 470static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {
468 int v = searchvar(fs, n, var); /* look up variables at current level */ 471 int v = searchvar(fs, n, var); /* look up variables at current level */
469 if (v >= 0) { /* found? */ 472 if (v >= 0) { /* found? */
470 if (v == VLOCAL && !base) 473 if (!base) {
471 markupval(fs, var->u.var.vidx); /* local will be used as an upval */ 474 if (var->k == VVARGVAR) /* vararg parameter? */
475 luaK_vapar2local(fs, var); /* change it to a regular local */
476 if (var->k == VLOCAL)
477 markupval(fs, var->u.var.vidx); /* will be used as an upvalue */
478 }
479 /* else nothing else to be done */
472 } 480 }
473 else { /* not found at current level; try upvalues */ 481 else { /* not found at current level; try upvalues */
474 int idx = searchupvalue(fs, n); /* try existing upvalues */ 482 int idx = searchupvalue(fs, n); /* try existing upvalues */
@@ -1066,8 +1074,8 @@ static void parlist (LexState *ls) {
1066 varargk |= PF_ISVARARG; 1074 varargk |= PF_ISVARARG;
1067 luaX_next(ls); 1075 luaX_next(ls);
1068 if (testnext(ls, '=')) { 1076 if (testnext(ls, '=')) {
1069 new_varkind(ls, str_checkname(ls), RDKVATAB); 1077 new_varkind(ls, str_checkname(ls), RDKVAVAR);
1070 varargk |= PF_VATAB; 1078 varargk |= PF_VAVAR;
1071 } 1079 }
1072 break; 1080 break;
1073 } 1081 }
@@ -1079,10 +1087,10 @@ static void parlist (LexState *ls) {
1079 f->numparams = cast_byte(fs->nactvar); 1087 f->numparams = cast_byte(fs->nactvar);
1080 if (varargk != 0) { 1088 if (varargk != 0) {
1081 setvararg(fs, varargk); /* declared vararg */ 1089 setvararg(fs, varargk); /* declared vararg */
1082 if (varargk & PF_VATAB) 1090 if (varargk & PF_VAVAR)
1083 adjustlocalvars(ls, 1); /* vararg table */ 1091 adjustlocalvars(ls, 1); /* vararg parameter */
1084 } 1092 }
1085 /* reserve registers for parameters (and vararg variable, if present) */ 1093 /* reserve registers for parameters (plus vararg parameter, if present) */
1086 luaK_reserveregs(fs, fs->nactvar); 1094 luaK_reserveregs(fs, fs->nactvar);
1087} 1095}
1088 1096