diff options
Diffstat (limited to 'lparser.c')
| -rw-r--r-- | lparser.c | 26 |
1 files changed, 17 insertions, 9 deletions
| @@ -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) { | |||
| 467 | static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) { | 470 | static 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 | ||
