Esempio n. 1
0
static void forlist (LexState *ls, TString *indexname)
{
    /* forlist -> NAME {,NAME} IN explist1 forbody */
    FuncState *fs = GetCurrentFuncState( ls );
    expdesc e;
    int nvars = 0;
    int base = fs->freereg;

    /* create control variables */
    new_localvarliteral(ls, "(for generator)", nvars++);
    new_localvarliteral(ls, "(for state)", nvars++);
    new_localvarliteral(ls, "(for control)", nvars++);

    /* create declared variables */
    new_localvar(ls, indexname, nvars++);

    while (testnext(ls, ','))
    {
        new_localvar(ls, str_checkname(ls), nvars++);
    }

    checknext(ls, TK_IN);

    int line = ls->linenumber;
    adjust_assign(ls, 3, explist1(ls, &e), &e);

    luaK_checkstack(fs, 3);  /* extra space to call generator */

    forbody(ls, base, line, nvars - 3, 0);
}
Esempio n. 2
0
static void fornum (LexState *ls, TString *varname, int line)
{
    /* fornum -> NAME = exp1,exp1[,exp1] forbody */
    FuncState *fs = GetCurrentFuncState( ls );
    int base = fs->freereg;

    new_localvarliteral(ls, "(for index)", 0);
    new_localvarliteral(ls, "(for limit)", 1);
    new_localvarliteral(ls, "(for step)", 2);
    new_localvar(ls, varname, 3);

    checknext(ls, '=');
    exp1(ls);  /* initial value */

    checknext(ls, ',');
    exp1(ls);  /* limit */

    if (testnext(ls, ','))
    {
        exp1(ls);  /* optional step */
    }
    else
    {  /* default step = 1 */
        luaK_codeABx(fs, OP_LOADK, fs->freereg, luaK_numberK(fs, 1));
        luaK_reserveregs(fs, 1);
    }

    forbody(ls, base, line, 1, 1);
}
Esempio n. 3
0
static void forlist (LexState *ls, TString *indexname) {
  /* forlist -> NAME {,NAME} IN explist1 DO body */
  FuncState *fs = ls->fs;
  expdesc e;
  int nvars = 0;
  int line;
  int base = fs->freereg;
  new_localvarstr(ls, "(for generator)", nvars++);
  new_localvarstr(ls, "(for state)", nvars++);
  new_localvar(ls, indexname, nvars++);
  while (testnext(ls, ','))
    new_localvar(ls, str_checkname(ls), nvars++);
  check(ls, TK_IN);
  line = ls->linenumber;
  adjust_assign(ls, nvars, explist1(ls, &e), &e);
  luaK_checkstack(fs, 3);  /* extra space to call generator */
  luaK_codeAsBx(fs, OP_TFORPREP, base, NO_JUMP);
  forbody(ls, base, line, nvars, 0);
}
Esempio n. 4
0
static void fornum (LexState *ls, TString *varname, int line) {
  /* fornum -> NAME = exp1,exp1[,exp1] DO body */
  FuncState *fs = ls->fs;
  int base = fs->freereg;
  new_localvar(ls, varname, 0);
  new_localvarstr(ls, "(for limit)", 1);
  new_localvarstr(ls, "(for step)", 2);
  check(ls, '=');
  exp1(ls);  /* initial value */
  check(ls, ',');
  exp1(ls);  /* limit */
  if (testnext(ls, ','))
    exp1(ls);  /* optional step */
  else {  /* default step = 1 */
    luaK_codeABx(fs, OP_LOADK, fs->freereg, luaK_numberK(fs, 1));
    luaK_reserveregs(fs, 1);
  }
  luaK_codeABC(fs, OP_SUB, fs->freereg - 3, fs->freereg - 3, fs->freereg - 1);
  luaK_jump(fs);
  forbody(ls, base, line, 3, 1);
}