|
@@ -165,6 +165,9 @@ static int registerlocalvar (LexState *ls, TString *varname) {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+** Create a new local variable with the given 'name'.
|
|
|
|
+*/
|
|
static void new_localvar (LexState *ls, TString *name) {
|
|
static void new_localvar (LexState *ls, TString *name) {
|
|
FuncState *fs = ls->fs;
|
|
FuncState *fs = ls->fs;
|
|
Dyndata *dyd = ls->dyd;
|
|
Dyndata *dyd = ls->dyd;
|
|
@@ -176,13 +179,8 @@ static void new_localvar (LexState *ls, TString *name) {
|
|
dyd->actvar.arr[dyd->actvar.n++].idx = cast(short, reg);
|
|
dyd->actvar.arr[dyd->actvar.n++].idx = cast(short, reg);
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
-static void new_localvarliteral_ (LexState *ls, const char *name, size_t sz) {
|
|
|
|
- new_localvar(ls, luaX_newstring(ls, name, sz));
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
#define new_localvarliteral(ls,v) \
|
|
#define new_localvarliteral(ls,v) \
|
|
- new_localvarliteral_(ls, "" v, (sizeof(v)/sizeof(char))-1)
|
|
|
|
|
|
+ new_localvar(ls, luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char)) - 1));
|
|
|
|
|
|
|
|
|
|
static LocVar *getlocvar (FuncState *fs, int i) {
|
|
static LocVar *getlocvar (FuncState *fs, int i) {
|
|
@@ -192,6 +190,9 @@ static LocVar *getlocvar (FuncState *fs, int i) {
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+/*
|
|
|
|
+** Start the scope for the last 'nvars' created variables.
|
|
|
|
+*/
|
|
static void adjustlocalvars (LexState *ls, int nvars) {
|
|
static void adjustlocalvars (LexState *ls, int nvars) {
|
|
FuncState *fs = ls->fs;
|
|
FuncState *fs = ls->fs;
|
|
fs->nactvar = cast_byte(fs->nactvar + nvars);
|
|
fs->nactvar = cast_byte(fs->nactvar + nvars);
|
|
@@ -1357,7 +1358,6 @@ static void forbody (LexState *ls, int base, int line, int nvars, int kind) {
|
|
BlockCnt bl;
|
|
BlockCnt bl;
|
|
FuncState *fs = ls->fs;
|
|
FuncState *fs = ls->fs;
|
|
int prep, endfor;
|
|
int prep, endfor;
|
|
- adjustlocalvars(ls, 3); /* control variables */
|
|
|
|
checknext(ls, TK_DO);
|
|
checknext(ls, TK_DO);
|
|
prep = luaK_codeABx(fs, forprep[kind], base, 0);
|
|
prep = luaK_codeABx(fs, forprep[kind], base, 0);
|
|
enterblock(fs, &bl, 0); /* scope for declared variables */
|
|
enterblock(fs, &bl, 0); /* scope for declared variables */
|
|
@@ -1399,6 +1399,7 @@ static void fornum (LexState *ls, TString *varname, int line) {
|
|
luaK_int(fs, fs->freereg, 1);
|
|
luaK_int(fs, fs->freereg, 1);
|
|
luaK_reserveregs(fs, 1);
|
|
luaK_reserveregs(fs, 1);
|
|
}
|
|
}
|
|
|
|
+ adjustlocalvars(ls, 3); /* control variables */
|
|
forbody(ls, base, line, 1, basicfor);
|
|
forbody(ls, base, line, 1, basicfor);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1407,7 +1408,7 @@ static void forlist (LexState *ls, TString *indexname) {
|
|
/* forlist -> NAME {,NAME} IN explist forbody */
|
|
/* forlist -> NAME {,NAME} IN explist forbody */
|
|
FuncState *fs = ls->fs;
|
|
FuncState *fs = ls->fs;
|
|
expdesc e;
|
|
expdesc e;
|
|
- int nvars = 4; /* gen, state, control, plus at least one declared var */
|
|
|
|
|
|
+ int nvars = 5; /* gen, state, control, toclose, 'indexname' */
|
|
int line;
|
|
int line;
|
|
int base = fs->freereg;
|
|
int base = fs->freereg;
|
|
/* create control variables */
|
|
/* create control variables */
|
|
@@ -1415,6 +1416,7 @@ static void forlist (LexState *ls, TString *indexname) {
|
|
new_localvarliteral(ls, "(for state)");
|
|
new_localvarliteral(ls, "(for state)");
|
|
markupval(fs, fs->nactvar); /* state may create an upvalue */
|
|
markupval(fs, fs->nactvar); /* state may create an upvalue */
|
|
new_localvarliteral(ls, "(for control)");
|
|
new_localvarliteral(ls, "(for control)");
|
|
|
|
+ new_localvarliteral(ls, "(for toclose)");
|
|
/* create declared variables */
|
|
/* create declared variables */
|
|
new_localvar(ls, indexname);
|
|
new_localvar(ls, indexname);
|
|
while (testnext(ls, ',')) {
|
|
while (testnext(ls, ',')) {
|
|
@@ -1423,9 +1425,10 @@ static void forlist (LexState *ls, TString *indexname) {
|
|
}
|
|
}
|
|
checknext(ls, TK_IN);
|
|
checknext(ls, TK_IN);
|
|
line = ls->linenumber;
|
|
line = ls->linenumber;
|
|
- adjust_assign(ls, 3, explist(ls, &e), &e);
|
|
|
|
|
|
+ adjust_assign(ls, 4, explist(ls, &e), &e);
|
|
|
|
+ adjustlocalvars(ls, 4); /* control variables */
|
|
luaK_checkstack(fs, 3); /* extra space to call generator */
|
|
luaK_checkstack(fs, 3); /* extra space to call generator */
|
|
- forbody(ls, base, line, nvars - 3, 2);
|
|
|
|
|
|
+ forbody(ls, base, line, nvars - 4, 2);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
@@ -1575,9 +1578,9 @@ static void tocloselocalstat (LexState *ls) {
|
|
new_localvar(ls, str_checkname(ls));
|
|
new_localvar(ls, str_checkname(ls));
|
|
checknext(ls, '=');
|
|
checknext(ls, '=');
|
|
exp1(ls, 0);
|
|
exp1(ls, 0);
|
|
- luaK_codeABC(fs, OP_TBC, fs->nactvar, 0, 0);
|
|
|
|
markupval(fs, fs->nactvar);
|
|
markupval(fs, fs->nactvar);
|
|
adjustlocalvars(ls, 1);
|
|
adjustlocalvars(ls, 1);
|
|
|
|
+ luaK_codeABC(fs, OP_TBC, fs->nactvar - 1, 0, 0);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|