38#define hasmultret(k) ((k) == VCALL || (k) == VVARARG)
43#define eqstr(a,b) ((a) == (b))
68static l_noret error_expected (
LexState *ls,
int token) {
70 luaO_pushfstring(ls->L,
"%s expected", luaX_token2str(ls, token)));
74static l_noret errorlimit (
FuncState *fs,
int limit,
const char *what) {
77 int line = fs->f->linedefined;
78 const char *where = (line == 0)
80 : luaO_pushfstring(L,
"function at line %d", line);
81 msg = luaO_pushfstring(L,
"too many %s (limit is %d) in %s",
83 luaX_syntaxerror(fs->ls, msg);
87static void checklimit (
FuncState *fs,
int v,
int l,
const char *what) {
88 if (v > l) errorlimit(fs, l, what);
95static int testnext (
LexState *ls,
int c) {
96 if (ls->t.token == c) {
107static void check (
LexState *ls,
int c) {
108 if (ls->t.token != c)
109 error_expected(ls, c);
116static void checknext (
LexState *ls,
int c) {
122#define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); }
130static void check_match (
LexState *ls,
int what,
int who,
int where) {
131 if (l_unlikely(!testnext(ls, what))) {
132 if (where == ls->linenumber)
133 error_expected(ls, what);
135 luaX_syntaxerror(ls, luaO_pushfstring(ls->L,
136 "%s expected (to close %s at line %d)",
137 luaX_token2str(ls, what), luaX_token2str(ls, who), where));
146 ts = ls->t.seminfo.ts;
152static void init_exp (
expdesc *e, expkind k,
int i) {
153 e->f = e->t = NO_JUMP;
160 e->f = e->t = NO_JUMP;
167 codestring(e, str_checkname(ls));
177 int oldsize = f->sizelocvars;
178 luaM_growvector(ls->L, f->locvars, fs->ndebugvars, f->sizelocvars,
179 LocVar, SHRT_MAX,
"local variables");
180 while (oldsize < f->sizelocvars)
181 f->locvars[oldsize++].varname = NULL;
182 f->locvars[fs->ndebugvars].varname = varname;
183 f->locvars[fs->ndebugvars].startpc = fs->pc;
184 luaC_objbarrier(ls->L, f, varname);
185 return fs->ndebugvars++;
198 checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal,
199 MAXVARS,
"local variables");
200 luaM_growvector(L, dyd->actvar.arr, dyd->actvar.n + 1,
201 dyd->actvar.size,
Vardesc, USHRT_MAX,
"local variables");
202 var = &dyd->actvar.arr[dyd->actvar.n++];
203 var->vd.kind = VDKREG;
205 return dyd->actvar.n - 1 - fs->firstlocal;
208#define new_localvarliteral(ls,v) \
210 luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char)) - 1));
220 return &fs->ls->dyd->actvar.arr[fs->firstlocal + vidx];
229static int reglevel (
FuncState *fs,
int nvar) {
231 Vardesc *vd = getlocalvardesc(fs, nvar);
232 if (vd->vd.kind != RDKCTC)
233 return vd->vd.ridx + 1;
244 return reglevel(fs, fs->nactvar);
252 Vardesc *vd = getlocalvardesc(fs, vidx);
253 if (vd->vd.kind == RDKCTC)
256 int idx = vd->vd.pidx;
257 lua_assert(idx < fs->ndebugvars);
258 return &fs->f->locvars[idx];
267 e->f = e->t = NO_JUMP;
269 e->u.var.vidx = vidx;
270 e->u.var.ridx = getlocalvardesc(fs, vidx)->vd.ridx;
282 varname = ls->dyd->actvar.arr[e->u.info].vd.name;
286 Vardesc *vardesc = getlocalvardesc(fs, e->u.var.vidx);
287 if (vardesc->vd.kind != VDKREG)
288 varname = vardesc->vd.name;
292 Upvaldesc *up = &fs->f->upvalues[e->u.info];
293 if (up->kind != VDKREG)
301 const char *msg = luaO_pushfstring(ls->L,
302 "attempt to assign to const variable '%s'", getstr(varname));
303 luaK_semerror(ls, msg);
311static void adjustlocalvars (
LexState *ls,
int nvars) {
313 int reglevel = luaY_nvarstack(fs);
315 for (i = 0; i < nvars; i++) {
316 int vidx = fs->nactvar++;
317 Vardesc *var = getlocalvardesc(fs, vidx);
318 var->vd.ridx = reglevel++;
319 var->vd.pidx = registerlocalvar(ls, fs, var->vd.name);
328static void removevars (
FuncState *fs,
int tolevel) {
329 fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel);
330 while (fs->nactvar > tolevel) {
331 LocVar *var = localdebuginfo(fs, --fs->nactvar);
345 for (i = 0; i < fs->nups; i++) {
346 if (eqstr(up[i].name, name))
return i;
354 int oldsize = f->sizeupvalues;
355 checklimit(fs, fs->nups + 1, MAXUPVAL,
"upvalues");
356 luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues,
358 while (oldsize < f->sizeupvalues)
359 f->upvalues[oldsize++].name = NULL;
360 return &f->upvalues[fs->nups++];
367 if (v->k == VLOCAL) {
369 up->idx = v->u.var.ridx;
370 up->kind = getlocalvardesc(prev, v->u.var.vidx)->vd.kind;
371 lua_assert(eqstr(name, getlocalvardesc(prev, v->u.var.vidx)->vd.name));
375 up->idx = cast_byte(v->u.info);
376 up->kind = prev->f->upvalues[v->u.info].kind;
377 lua_assert(eqstr(name, prev->f->upvalues[v->u.info].name));
380 luaC_objbarrier(fs->ls->L, fs->f, name);
392 for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) {
393 Vardesc *vd = getlocalvardesc(fs, i);
394 if (eqstr(n, vd->vd.name)) {
395 if (vd->vd.kind == RDKCTC)
396 init_exp(var, VCONST, fs->firstlocal + i);
398 init_var(fs, var, i);
410static void markupval (
FuncState *fs,
int level) {
412 while (bl->nactvar > level)
422static void marktobeclosed (
FuncState *fs) {
437 init_exp(var, VVOID, 0);
439 int v = searchvar(fs, n, var);
441 if (v == VLOCAL && !base)
442 markupval(fs, var->u.var.vidx);
445 int idx = searchupvalue(fs, n);
447 singlevaraux(fs->prev, n, var, 0);
448 if (var->k == VLOCAL || var->k == VUPVAL)
449 idx = newupvalue(fs, n, var);
453 init_exp(var, VUPVAL, idx);
464 TString *varname = str_checkname(ls);
466 singlevaraux(fs, varname, var, 1);
467 if (var->k == VVOID) {
469 singlevaraux(fs, ls->envn, var, 1);
470 lua_assert(var->k != VVOID);
471 luaK_exp2anyregup(fs, var);
472 codestring(&key, varname);
473 luaK_indexed(fs, var, &key);
482static void adjust_assign (
LexState *ls,
int nvars,
int nexps,
expdesc *e) {
484 int needed = nvars - nexps;
485 if (hasmultret(e->k)) {
486 int extra = needed + 1;
489 luaK_setreturns(fs, e, extra);
493 luaK_exp2nextreg(fs, e);
495 luaK_nil(fs, fs->freereg, needed);
498 luaK_reserveregs(fs, needed);
500 fs->freereg += needed;
504#define enterlevel(ls) luaE_incCstack(ls->L)
507#define leavelevel(ls) ((ls)->L->nCcalls--)
515 const char *varname = getstr(getlocalvardesc(ls->fs, gt->nactvar)->vd.name);
516 const char *msg =
"<goto %s> at line %d jumps into the scope of local '%s'";
517 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line, varname);
518 luaK_semerror(ls, msg);
531 lua_assert(eqstr(gt->name, label->name));
532 if (l_unlikely(gt->nactvar < label->nactvar))
533 jumpscopeerror(ls, gt);
534 luaK_patchlist(ls->fs, gt->pc, label->pc);
535 for (i = g; i < gl->n - 1; i++)
536 gl->arr[i] = gl->arr[i + 1];
548 for (i = ls->fs->firstlabel; i < dyd->label.n; i++) {
550 if (eqstr(lb->name, name))
563 luaM_growvector(ls->L, l->arr, n, l->size,
565 l->arr[n].name = name;
566 l->arr[n].line = line;
567 l->arr[n].nactvar = ls->fs->nactvar;
575static int newgotoentry (
LexState *ls,
TString *name,
int line,
int pc) {
576 return newlabelentry(ls, &ls->dyd->gt, name, line, pc);
587 int i = ls->fs->bl->firstgoto;
590 if (eqstr(gl->arr[i].name, lb->name)) {
591 needsclose |= gl->arr[i].close;
592 solvegoto(ls, i, lb);
612 int l = newlabelentry(ls, ll, name, line, luaK_getlabel(fs));
615 ll->arr[l].nactvar = fs->bl->nactvar;
617 if (solvegotos(ls, &ll->arr[l])) {
618 luaK_codeABC(fs, OP_CLOSE, luaY_nvarstack(fs), 0, 0);
632 for (i = bl->firstgoto; i < gl->n; i++) {
635 if (reglevel(fs, gt->nactvar) > reglevel(fs, bl->nactvar))
636 gt->close |= bl->upval;
637 gt->nactvar = bl->nactvar;
644 bl->nactvar = fs->nactvar;
645 bl->firstlabel = fs->ls->dyd->label.n;
646 bl->firstgoto = fs->ls->dyd->gt.n;
648 bl->insidetbc = (fs->bl != NULL && fs->bl->insidetbc);
649 bl->previous = fs->bl;
651 lua_assert(fs->freereg == luaY_nvarstack(fs));
660 if (eqstr(gt->name, luaS_newliteral(ls->L,
"break"))) {
661 msg =
"break outside loop at line %d";
662 msg = luaO_pushfstring(ls->L, msg, gt->line);
665 msg =
"no visible label '%s' for <goto> at line %d";
666 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line);
668 luaK_semerror(ls, msg);
676 int stklevel = reglevel(fs, bl->nactvar);
677 removevars(fs, bl->nactvar);
678 lua_assert(bl->nactvar == fs->nactvar);
680 hasclose = createlabel(ls, luaS_newliteral(ls->L,
"break"), 0, 0);
681 if (!hasclose && bl->previous && bl->upval)
682 luaK_codeABC(fs, OP_CLOSE, stklevel, 0, 0);
683 fs->freereg = stklevel;
684 ls->dyd->label.n = bl->firstlabel;
685 fs->bl = bl->previous;
687 movegotosout(fs, bl);
689 if (bl->firstgoto < ls->dyd->gt.n)
690 undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]);
703 if (fs->np >= f->sizep) {
704 int oldsize = f->sizep;
705 luaM_growvector(L, f->p, fs->np, f->sizep,
Proto *, MAXARG_Bx,
"functions");
706 while (oldsize < f->sizep)
707 f->p[oldsize++] = NULL;
709 f->p[fs->np++] = clp = luaF_newproto(L);
710 luaC_objbarrier(L, f, clp);
724 init_exp(v, VRELOC, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np - 1));
725 luaK_exp2nextreg(fs, v);
735 fs->previousline = f->linedefined;
740 fs->nabslineinfo = 0;
746 fs->firstlocal = ls->dyd->actvar.n;
747 fs->firstlabel = ls->dyd->label.n;
749 f->source = ls->source;
750 luaC_objbarrier(ls->L, f, f->source);
752 enterblock(fs, bl, 0);
756static void close_func (
LexState *ls) {
760 luaK_ret(fs, luaY_nvarstack(fs), 0);
762 lua_assert(fs->bl == NULL);
764 luaM_shrinkvector(L, f->code, f->sizecode, fs->pc, Instruction);
765 luaM_shrinkvector(L, f->lineinfo, f->sizelineinfo, fs->pc, ls_byte);
766 luaM_shrinkvector(L, f->abslineinfo, f->sizeabslineinfo,
768 luaM_shrinkvector(L, f->k, f->sizek, fs->nk,
TValue);
769 luaM_shrinkvector(L, f->p, f->sizep, fs->np,
Proto *);
770 luaM_shrinkvector(L, f->locvars, f->sizelocvars, fs->ndebugvars,
LocVar);
771 luaM_shrinkvector(L, f->upvalues, f->sizeupvalues, fs->nups,
Upvaldesc);
788static int block_follow (
LexState *ls,
int withuntil) {
789 switch (ls->t.token) {
790 case TK_ELSE:
case TK_ELSEIF:
791 case TK_END:
case TK_EOS:
793 case TK_UNTIL:
return withuntil;
799static void statlist (
LexState *ls) {
801 while (!block_follow(ls, 1)) {
802 if (ls->t.token == TK_RETURN) {
815 luaK_exp2anyregup(fs, v);
818 luaK_indexed(fs, v, &key);
826 luaK_exp2val(ls->fs, v);
850 int reg = ls->fs->freereg;
852 if (ls->t.token == TK_NAME) {
853 checklimit(fs, cc->nh, MAX_INT,
"items in a constructor");
861 luaK_indexed(fs, &tab, &key);
863 luaK_storevar(fs, &tab, &val);
869 if (cc->v.k == VVOID)
return;
870 luaK_exp2nextreg(fs, &cc->v);
872 if (cc->tostore == LFIELDS_PER_FLUSH) {
873 luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore);
874 cc->na += cc->tostore;
881 if (cc->tostore == 0)
return;
882 if (hasmultret(cc->v.k)) {
883 luaK_setmultret(fs, &cc->v);
884 luaK_setlist(fs, cc->t->u.info, cc->na, LUA_MULTRET);
888 if (cc->v.k != VVOID)
889 luaK_exp2nextreg(fs, &cc->v);
890 luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore);
892 cc->na += cc->tostore;
905 switch(ls->t.token) {
907 if (luaX_lookahead(ls) !=
'=')
929 int line = ls->linenumber;
930 int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0);
933 cc.na = cc.nh = cc.tostore = 0;
935 init_exp(t, VNONRELOC, fs->freereg);
936 luaK_reserveregs(fs, 1);
937 init_exp(&cc.v, VVOID, 0);
940 lua_assert(cc.v.k == VVOID || cc.tostore > 0);
941 if (ls->t.token ==
'}')
break;
942 closelistfield(fs, &cc);
944 }
while (testnext(ls,
',') || testnext(ls,
';'));
945 check_match(ls,
'}',
'{', line);
946 lastlistfield(fs, &cc);
947 luaK_settablesize(fs, pc, t->u.info, cc.na, cc.nh);
953static void setvararg (
FuncState *fs,
int nparams) {
954 fs->f->is_vararg = 1;
955 luaK_codeABC(fs, OP_VARARGPREP, nparams, 0, 0);
965 if (ls->t.token !=
')') {
967 switch (ls->t.token) {
969 new_localvar(ls, str_checkname(ls));
978 default: luaX_syntaxerror(ls,
"<name> or '...' expected");
980 }
while (!isvararg && testnext(ls,
','));
982 adjustlocalvars(ls, nparams);
983 f->numparams = cast_byte(fs->nactvar);
985 setvararg(fs, f->numparams);
986 luaK_reserveregs(fs, fs->nactvar);
994 new_fs.f = addprototype(ls);
995 new_fs.f->linedefined = line;
996 open_func(ls, &new_fs, &bl);
999 new_localvarliteral(ls,
"self");
1000 adjustlocalvars(ls, 1);
1005 new_fs.f->lastlinedefined = ls->linenumber;
1006 check_match(ls, TK_END, TK_FUNCTION, line);
1016 while (testnext(ls,
',')) {
1017 luaK_exp2nextreg(ls->fs, v);
1029 switch (ls->t.token) {
1032 if (ls->t.token ==
')')
1036 if (hasmultret(args.k))
1037 luaK_setmultret(fs, &args);
1039 check_match(ls,
')',
'(', line);
1043 constructor(ls, &args);
1047 codestring(&args, ls->t.seminfo.ts);
1052 luaX_syntaxerror(ls,
"function arguments expected");
1055 lua_assert(f->k == VNONRELOC);
1057 if (hasmultret(args.k))
1058 nparams = LUA_MULTRET;
1060 if (args.k != VVOID)
1061 luaK_exp2nextreg(fs, &args);
1062 nparams = fs->freereg - (base+1);
1064 init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2));
1065 luaK_fixline(fs, line);
1066 fs->freereg = base+1;
1082 switch (ls->t.token) {
1084 int line = ls->linenumber;
1087 check_match(ls,
')',
'(', line);
1088 luaK_dischargevars(ls->fs, v);
1096 luaX_syntaxerror(ls,
"unexpected symbol");
1106 int line = ls->linenumber;
1109 switch (ls->t.token) {
1116 luaK_exp2anyregup(fs, v);
1118 luaK_indexed(fs, v, &key);
1125 luaK_self(fs, v, &key);
1126 funcargs(ls, v, line);
1129 case '(':
case TK_STRING:
case '{': {
1130 luaK_exp2nextreg(fs, v);
1131 funcargs(ls, v, line);
1143 switch (ls->t.token) {
1145 init_exp(v, VKFLT, 0);
1146 v->u.nval = ls->t.seminfo.r;
1150 init_exp(v, VKINT, 0);
1151 v->u.ival = ls->t.seminfo.i;
1155 codestring(v, ls->t.seminfo.ts);
1159 init_exp(v, VNIL, 0);
1163 init_exp(v, VTRUE, 0);
1167 init_exp(v, VFALSE, 0);
1172 check_condition(ls, fs->f->is_vararg,
1173 "cannot use '...' outside a vararg function");
1174 init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 0, 1));
1183 body(ls, v, 0, ls->linenumber);
1195static UnOpr getunopr (
int op) {
1197 case TK_NOT:
return OPR_NOT;
1198 case '-':
return OPR_MINUS;
1199 case '~':
return OPR_BNOT;
1200 case '#':
return OPR_LEN;
1201 default:
return OPR_NOUNOPR;
1206static BinOpr getbinopr (
int op) {
1208 case '+':
return OPR_ADD;
1209 case '-':
return OPR_SUB;
1210 case '*':
return OPR_MUL;
1211 case '%':
return OPR_MOD;
1212 case '^':
return OPR_POW;
1213 case '/':
return OPR_DIV;
1214 case TK_IDIV:
return OPR_IDIV;
1215 case '&':
return OPR_BAND;
1216 case '|':
return OPR_BOR;
1217 case '~':
return OPR_BXOR;
1218 case TK_SHL:
return OPR_SHL;
1219 case TK_SHR:
return OPR_SHR;
1220 case TK_CONCAT:
return OPR_CONCAT;
1221 case TK_NE:
return OPR_NE;
1222 case TK_EQ:
return OPR_EQ;
1223 case '<':
return OPR_LT;
1224 case TK_LE:
return OPR_LE;
1225 case '>':
return OPR_GT;
1226 case TK_GE:
return OPR_GE;
1227 case TK_AND:
return OPR_AND;
1228 case TK_OR:
return OPR_OR;
1229 default:
return OPR_NOBINOPR;
1237static const struct {
1245 {6, 6}, {4, 4}, {5, 5},
1248 {3, 3}, {3, 3}, {3, 3},
1249 {3, 3}, {3, 3}, {3, 3},
1253#define UNARY_PRIORITY 12
1264 uop = getunopr(ls->t.token);
1265 if (uop != OPR_NOUNOPR) {
1266 int line = ls->linenumber;
1268 subexpr(ls, v, UNARY_PRIORITY);
1269 luaK_prefix(ls->fs, uop, v, line);
1271 else simpleexp(ls, v);
1273 op = getbinopr(ls->t.token);
1274 while (op != OPR_NOBINOPR && priority[op].left > limit) {
1277 int line = ls->linenumber;
1279 luaK_infix(ls->fs, op, v);
1281 nextop = subexpr(ls, &v2, priority[op].right);
1282 luaK_posfix(ls->fs, op, v, &v2, line);
1309 enterblock(fs, &bl, 0);
1333 int extra = fs->freereg;
1335 for (; lh; lh = lh->prev) {
1336 if (vkisindexed(lh->v.k)) {
1337 if (lh->v.k == VINDEXUP) {
1338 if (v->k == VUPVAL && lh->v.u.ind.t == v->u.info) {
1340 lh->v.k = VINDEXSTR;
1341 lh->v.u.ind.t = extra;
1345 if (v->k == VLOCAL && lh->v.u.ind.t == v->u.var.ridx) {
1347 lh->v.u.ind.t = extra;
1350 if (lh->v.k == VINDEXED && v->k == VLOCAL &&
1351 lh->v.u.ind.idx == v->u.var.ridx) {
1353 lh->v.u.ind.idx = extra;
1361 luaK_codeABC(fs, OP_MOVE, extra, v->u.var.ridx, 0);
1363 luaK_codeABC(fs, OP_GETUPVAL, extra, v->u.info, 0);
1364 luaK_reserveregs(fs, 1);
1377 check_condition(ls, vkisvar(lh->v.k),
"syntax error");
1378 check_readonly(ls, &lh->v);
1379 if (testnext(ls,
',')) {
1382 suffixedexp(ls, &nv.v);
1383 if (!vkisindexed(nv.v.k))
1384 check_conflict(ls, lh, &nv.v);
1386 restassign(ls, &nv, nvars+1);
1392 nexps = explist(ls, &e);
1394 adjust_assign(ls, nvars, nexps, &e);
1396 luaK_setoneret(ls->fs, &e);
1397 luaK_storevar(ls->fs, &lh->v, &e);
1401 init_exp(&e, VNONRELOC, ls->fs->freereg-1);
1402 luaK_storevar(ls->fs, &lh->v, &e);
1410 if (v.k == VNIL) v.k = VFALSE;
1411 luaK_goiftrue(ls->fs, &v);
1416static void gotostat (
LexState *ls) {
1418 int line = ls->linenumber;
1419 TString *name = str_checkname(ls);
1423 newgotoentry(ls, name, line, luaK_jump(fs));
1426 int lblevel = reglevel(fs, lb->nactvar);
1427 if (luaY_nvarstack(fs) > lblevel)
1428 luaK_codeABC(fs, OP_CLOSE, lblevel, 0, 0);
1430 luaK_patchlist(fs, luaK_jump(fs), lb->pc);
1438static void breakstat (
LexState *ls) {
1439 int line = ls->linenumber;
1441 newgotoentry(ls, luaS_newliteral(ls->L,
"break"), line, luaK_jump(ls->fs));
1450 if (l_unlikely(lb != NULL)) {
1451 const char *msg =
"label '%s' already defined on line %d";
1452 msg = luaO_pushfstring(ls->L, msg, getstr(name), lb->line);
1453 luaK_semerror(ls, msg);
1460 checknext(ls, TK_DBCOLON);
1461 while (ls->t.token ==
';' || ls->t.token == TK_DBCOLON)
1463 checkrepeated(ls, name);
1464 createlabel(ls, name, line, block_follow(ls, 0));
1468static void whilestat (
LexState *ls,
int line) {
1475 whileinit = luaK_getlabel(fs);
1476 condexit = cond(ls);
1477 enterblock(fs, &bl, 1);
1478 checknext(ls, TK_DO);
1480 luaK_jumpto(fs, whileinit);
1481 check_match(ls, TK_END, TK_WHILE, line);
1483 luaK_patchtohere(fs, condexit);
1487static void repeatstat (
LexState *ls,
int line) {
1491 int repeat_init = luaK_getlabel(fs);
1493 enterblock(fs, &bl1, 1);
1494 enterblock(fs, &bl2, 0);
1497 check_match(ls, TK_UNTIL, TK_REPEAT, line);
1498 condexit = cond(ls);
1501 int exit = luaK_jump(fs);
1502 luaK_patchtohere(fs, condexit);
1503 luaK_codeABC(fs, OP_CLOSE, reglevel(fs, bl2.nactvar), 0, 0);
1504 condexit = luaK_jump(fs);
1505 luaK_patchtohere(fs, exit);
1507 luaK_patchlist(fs, condexit, repeat_init);
1520 luaK_exp2nextreg(ls->fs, &e);
1521 lua_assert(e.k == VNONRELOC);
1530static void fixforjump (
FuncState *fs,
int pc,
int dest,
int back) {
1531 Instruction *jmp = &fs->f->code[pc];
1532 int offset = dest - (pc + 1);
1535 if (l_unlikely(offset > MAXARG_Bx))
1536 luaX_syntaxerror(fs->ls,
"control structure too long");
1537 SETARG_Bx(*jmp, offset);
1544static void forbody (
LexState *ls,
int base,
int line,
int nvars,
int isgen) {
1546 static const OpCode forprep[2] = {OP_FORPREP, OP_TFORPREP};
1547 static const OpCode forloop[2] = {OP_FORLOOP, OP_TFORLOOP};
1551 checknext(ls, TK_DO);
1552 prep = luaK_codeABx(fs, forprep[isgen], base, 0);
1553 enterblock(fs, &bl, 0);
1554 adjustlocalvars(ls, nvars);
1555 luaK_reserveregs(fs, nvars);
1558 fixforjump(fs, prep, luaK_getlabel(fs), 0);
1560 luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars);
1561 luaK_fixline(fs, line);
1563 endfor = luaK_codeABx(fs, forloop[isgen], base, 0);
1564 fixforjump(fs, endfor, prep + 1, 1);
1565 luaK_fixline(fs, line);
1572 int base = fs->freereg;
1573 new_localvarliteral(ls,
"(for state)");
1574 new_localvarliteral(ls,
"(for state)");
1575 new_localvarliteral(ls,
"(for state)");
1576 new_localvar(ls, varname);
1581 if (testnext(ls,
','))
1584 luaK_int(fs, fs->freereg, 1);
1585 luaK_reserveregs(fs, 1);
1587 adjustlocalvars(ls, 3);
1588 forbody(ls, base, line, 1, 0);
1598 int base = fs->freereg;
1600 new_localvarliteral(ls,
"(for state)");
1601 new_localvarliteral(ls,
"(for state)");
1602 new_localvarliteral(ls,
"(for state)");
1603 new_localvarliteral(ls,
"(for state)");
1605 new_localvar(ls, indexname);
1606 while (testnext(ls,
',')) {
1607 new_localvar(ls, str_checkname(ls));
1610 checknext(ls, TK_IN);
1611 line = ls->linenumber;
1612 adjust_assign(ls, 4, explist(ls, &e), &e);
1613 adjustlocalvars(ls, 4);
1615 luaK_checkstack(fs, 3);
1616 forbody(ls, base, line, nvars - 4, 1);
1620static void forstat (
LexState *ls,
int line) {
1625 enterblock(fs, &bl, 1);
1627 varname = str_checkname(ls);
1628 switch (ls->t.token) {
1629 case '=': fornum(ls, varname, line);
break;
1630 case ',':
case TK_IN: forlist(ls, varname);
break;
1631 default: luaX_syntaxerror(ls,
"'=' or 'in' expected");
1633 check_match(ls, TK_END, TK_FOR, line);
1638static void test_then_block (
LexState *ls,
int *escapelist) {
1646 checknext(ls, TK_THEN);
1647 if (ls->t.token == TK_BREAK) {
1648 int line = ls->linenumber;
1649 luaK_goiffalse(ls->fs, &v);
1651 enterblock(fs, &bl, 0);
1652 newgotoentry(ls, luaS_newliteral(ls->L,
"break"), line, v.t);
1653 while (testnext(ls,
';')) {}
1654 if (block_follow(ls, 0)) {
1662 luaK_goiftrue(ls->fs, &v);
1663 enterblock(fs, &bl, 0);
1668 if (ls->t.token == TK_ELSE ||
1669 ls->t.token == TK_ELSEIF)
1670 luaK_concat(fs, escapelist, luaK_jump(fs));
1671 luaK_patchtohere(fs, jf);
1675static void ifstat (
LexState *ls,
int line) {
1678 int escapelist = NO_JUMP;
1679 test_then_block(ls, &escapelist);
1680 while (ls->t.token == TK_ELSEIF)
1681 test_then_block(ls, &escapelist);
1682 if (testnext(ls, TK_ELSE))
1684 check_match(ls, TK_END, TK_IF, line);
1685 luaK_patchtohere(fs, escapelist);
1689static void localfunc (
LexState *ls) {
1692 int fvar = fs->nactvar;
1693 new_localvar(ls, str_checkname(ls));
1694 adjustlocalvars(ls, 1);
1695 body(ls, &b, 0, ls->linenumber);
1697 localdebuginfo(fs, fvar)->startpc = fs->pc;
1701static int getlocalattribute (
LexState *ls) {
1703 if (testnext(ls,
'<')) {
1704 const char *attr = getstr(str_checkname(ls));
1706 if (strcmp(attr,
"const") == 0)
1708 else if (strcmp(attr,
"close") == 0)
1712 luaO_pushfstring(ls->L,
"unknown attribute '%s'", attr));
1718static void checktoclose (
FuncState *fs,
int level) {
1721 luaK_codeABC(fs, OP_TBC, reglevel(fs, level), 0, 0);
1726static void localstat (
LexState *ls) {
1736 vidx = new_localvar(ls, str_checkname(ls));
1737 kind = getlocalattribute(ls);
1738 getlocalvardesc(fs, vidx)->vd.kind = kind;
1739 if (kind == RDKTOCLOSE) {
1741 luaK_semerror(ls,
"multiple to-be-closed variables in local list");
1742 toclose = fs->nactvar + nvars;
1745 }
while (testnext(ls,
','));
1746 if (testnext(ls,
'='))
1747 nexps = explist(ls, &e);
1752 var = getlocalvardesc(fs, vidx);
1753 if (nvars == nexps &&
1754 var->vd.kind == RDKCONST &&
1755 luaK_exp2const(fs, &e, &var->k)) {
1756 var->vd.kind = RDKCTC;
1757 adjustlocalvars(ls, nvars - 1);
1761 adjust_assign(ls, nvars, nexps, &e);
1762 adjustlocalvars(ls, nvars);
1764 checktoclose(fs, toclose);
1772 while (ls->t.token ==
'.')
1774 if (ls->t.token ==
':') {
1782static void funcstat (
LexState *ls,
int line) {
1787 ismethod = funcname(ls, &v);
1788 body(ls, &b, ismethod, line);
1789 check_readonly(ls, &v);
1790 luaK_storevar(ls->fs, &v, &b);
1791 luaK_fixline(ls->fs, line);
1795static void exprstat (
LexState *ls) {
1799 suffixedexp(ls, &v.v);
1800 if (ls->t.token ==
'=' || ls->t.token ==
',') {
1802 restassign(ls, &v, 1);
1806 check_condition(ls, v.v.k == VCALL,
"syntax error");
1807 inst = &getinstruction(fs, &v.v);
1813static void retstat (
LexState *ls) {
1818 int first = luaY_nvarstack(fs);
1819 if (block_follow(ls, 1) || ls->t.token ==
';')
1822 nret = explist(ls, &e);
1823 if (hasmultret(e.k)) {
1824 luaK_setmultret(fs, &e);
1825 if (e.k == VCALL && nret == 1 && !fs->bl->insidetbc) {
1826 SET_OPCODE(getinstruction(fs,&e), OP_TAILCALL);
1827 lua_assert(GETARG_A(getinstruction(fs,&e)) == luaY_nvarstack(fs));
1833 first = luaK_exp2anyreg(fs, &e);
1835 luaK_exp2nextreg(fs, &e);
1836 lua_assert(nret == fs->freereg - first);
1840 luaK_ret(fs, first, nret);
1845static void statement (
LexState *ls) {
1846 int line = ls->linenumber;
1848 switch (ls->t.token) {
1858 whilestat(ls, line);
1864 check_match(ls, TK_END, TK_DO, line);
1872 repeatstat(ls, line);
1881 if (testnext(ls, TK_FUNCTION))
1889 labelstat(ls, str_checkname(ls), line);
1911 lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg &&
1912 ls->fs->freereg >= luaY_nvarstack(ls->fs));
1913 ls->fs->freereg = luaY_nvarstack(ls->fs);
1927 open_func(ls, fs, &bl);
1929 env = allocupvalue(fs);
1933 env->name = ls->envn;
1934 luaC_objbarrier(ls->L, fs->f, env->name);
1943 Dyndata *dyd,
const char *name,
int firstchar) {
1946 LClosure *cl = luaF_newLclosure(L, 1);
1947 setclLvalue2s(L, L->top.p, cl);
1949 lexstate.h = luaH_new(L);
1950 sethvalue2s(L, L->top.p, lexstate.h);
1952 funcstate.f = cl->p = luaF_newproto(L);
1953 luaC_objbarrier(L, cl, cl->p);
1954 funcstate.f->source = luaS_new(L, name);
1955 luaC_objbarrier(L, funcstate.f, funcstate.f->source);
1956 lexstate.buff = buff;
1958 dyd->actvar.n = dyd->gt.n = dyd->label.n = 0;
1959 luaX_setinput(L, &lexstate, z, funcstate.f->source, firstchar);
1960 mainfunc(&lexstate, &funcstate);
1961 lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs);
1963 lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0);