Lines Matching refs:ls
64 static void statement (LexState *ls);
65 static void expr (LexState *ls, expdesc *v);
68 static l_noret error_expected (LexState *ls, int token) { in error_expected() argument
69 luaX_syntaxerror(ls, in error_expected()
70 luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token))); in error_expected()
75 lua_State *L = fs->ls->L; in errorlimit()
83 luaX_syntaxerror(fs->ls, msg); in errorlimit()
95 static int testnext (LexState *ls, int c) { in testnext() argument
96 if (ls->t.token == c) { in testnext()
97 luaX_next(ls); in testnext()
107 static void check (LexState *ls, int c) { in check() argument
108 if (ls->t.token != c) in check()
109 error_expected(ls, c); in check()
116 static void checknext (LexState *ls, int c) { in checknext() argument
117 check(ls, c); in checknext()
118 luaX_next(ls); in checknext()
122 #define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } argument
130 static void check_match (LexState *ls, int what, int who, int where) { in check_match() argument
131 if (unlikely(!testnext(ls, what))) { in check_match()
132 if (where == ls->linenumber) /* all in the same line? */ in check_match()
133 error_expected(ls, what); /* do not need a complex message */ in check_match()
135 luaX_syntaxerror(ls, luaO_pushfstring(ls->L, in check_match()
137 luaX_token2str(ls, what), luaX_token2str(ls, who), where)); in check_match()
143 static TString *str_checkname (LexState *ls) { in str_checkname() argument
145 check(ls, TK_NAME); in str_checkname()
146 ts = ls->t.seminfo.ts; in str_checkname()
147 luaX_next(ls); in str_checkname()
166 static void codename (LexState *ls, expdesc *e) { in codename() argument
167 codestring(e, str_checkname(ls)); in codename()
175 static int registerlocalvar (LexState *ls, FuncState *fs, TString *varname) { in registerlocalvar() argument
178 luaM_growvector(ls->L, f->locvars, fs->ndebugvars, f->sizelocvars, in registerlocalvar()
184 luaC_objbarrier(ls->L, f, varname); in registerlocalvar()
193 static int new_localvar (LexState *ls, TString *name) { in new_localvar() argument
194 lua_State *L = ls->L; in new_localvar()
195 FuncState *fs = ls->fs; in new_localvar()
196 Dyndata *dyd = ls->dyd; in new_localvar()
208 #define new_localvarliteral(ls,v) \ argument
209 new_localvar(ls, \
210 luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char)) - 1));
220 return &fs->ls->dyd->actvar.arr[fs->firstlocal + vidx]; in getlocalvardesc()
277 static void check_readonly (LexState *ls, expdesc *e) { in check_readonly() argument
278 FuncState *fs = ls->fs; in check_readonly()
282 varname = ls->dyd->actvar.arr[e->u.info].vd.name; in check_readonly()
301 const char *msg = luaO_pushfstring(ls->L, in check_readonly()
303 luaK_semerror(ls, msg); /* error */ in check_readonly()
311 static void adjustlocalvars (LexState *ls, int nvars) { in adjustlocalvars() argument
312 FuncState *fs = ls->fs; in adjustlocalvars()
319 var->vd.pidx = registerlocalvar(ls, fs, var->vd.name); in adjustlocalvars()
329 fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel); in removevars()
356 luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, in allocupvalue()
380 luaC_objbarrier(fs->ls->L, fs->f, name); in newupvalue()
452 static void singlevar (LexState *ls, expdesc *var) { in singlevar() argument
453 TString *varname = str_checkname(ls); in singlevar()
454 FuncState *fs = ls->fs; in singlevar()
458 singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ in singlevar()
470 static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { in adjust_assign() argument
471 FuncState *fs = ls->fs; in adjust_assign()
492 #define enterlevel(ls) luaE_incCstack(ls->L) argument
495 #define leavelevel(ls) ((ls)->L->nCcalls--) argument
502 static l_noret jumpscopeerror (LexState *ls, Labeldesc *gt) { in jumpscopeerror() argument
503 const char *varname = getstr(getlocalvardesc(ls->fs, gt->nactvar)->vd.name); in jumpscopeerror()
505 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line, varname); in jumpscopeerror()
506 luaK_semerror(ls, msg); /* raise the error */ in jumpscopeerror()
515 static void solvegoto (LexState *ls, int g, Labeldesc *label) { in solvegoto() argument
517 Labellist *gl = &ls->dyd->gt; /* list of goto's */ in solvegoto()
521 jumpscopeerror(ls, gt); in solvegoto()
522 luaK_patchlist(ls->fs, gt->pc, label->pc); in solvegoto()
532 static Labeldesc *findlabel (LexState *ls, TString *name) { in findlabel() argument
534 Dyndata *dyd = ls->dyd; in findlabel()
536 for (i = ls->fs->firstlabel; i < dyd->label.n; i++) { in findlabel()
548 static int newlabelentry (LexState *ls, Labellist *l, TString *name, in newlabelentry() argument
551 luaM_growvector(ls->L, l->arr, n, l->size, in newlabelentry()
555 l->arr[n].nactvar = ls->fs->nactvar; in newlabelentry()
563 static int newgotoentry (LexState *ls, TString *name, int line, int pc) { in newgotoentry() argument
564 return newlabelentry(ls, &ls->dyd->gt, name, line, pc); in newgotoentry()
573 static int solvegotos (LexState *ls, Labeldesc *lb) { in solvegotos() argument
574 Labellist *gl = &ls->dyd->gt; in solvegotos()
575 int i = ls->fs->bl->firstgoto; in solvegotos()
580 solvegoto(ls, i, lb); /* will remove 'i' from the list */ in solvegotos()
596 static int createlabel (LexState *ls, TString *name, int line, in createlabel() argument
598 FuncState *fs = ls->fs; in createlabel()
599 Labellist *ll = &ls->dyd->label; in createlabel()
600 int l = newlabelentry(ls, ll, name, line, luaK_getlabel(fs)); in createlabel()
605 if (solvegotos(ls, &ll->arr[l])) { /* need close? */ in createlabel()
618 Labellist *gl = &fs->ls->dyd->gt; in movegotosout()
633 bl->firstlabel = fs->ls->dyd->label.n; in enterblock()
634 bl->firstgoto = fs->ls->dyd->gt.n; in enterblock()
646 static l_noret undefgoto (LexState *ls, Labeldesc *gt) { in undefgoto() argument
648 if (eqstr(gt->name, luaS_newliteral(ls->L, "break"))) { in undefgoto()
650 msg = luaO_pushfstring(ls->L, msg, gt->line); in undefgoto()
654 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); in undefgoto()
656 luaK_semerror(ls, msg); in undefgoto()
662 LexState *ls = fs->ls; in leaveblock() local
666 hasclose = createlabel(ls, luaS_newliteral(ls->L, "break"), 0, 0); in leaveblock()
673 ls->dyd->label.n = bl->firstlabel; /* remove local labels */ in leaveblock()
677 if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ in leaveblock()
678 undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ in leaveblock()
686 static Proto *addprototype (LexState *ls) { in addprototype() argument
688 lua_State *L = ls->L; in addprototype()
689 FuncState *fs = ls->fs; in addprototype()
710 static void codeclosure (LexState *ls, expdesc *v) { in codeclosure() argument
711 FuncState *fs = ls->fs->prev; in codeclosure()
717 static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { in open_func() argument
719 fs->prev = ls->fs; /* linked list of funcstates */ in open_func()
720 fs->ls = ls; in open_func()
721 ls->fs = fs; in open_func()
734 fs->firstlocal = ls->dyd->actvar.n; in open_func()
735 fs->firstlabel = ls->dyd->label.n; in open_func()
737 f->source = ls->source; in open_func()
738 luaC_objbarrier(ls->L, f, f->source); in open_func()
744 static void close_func (LexState *ls) { in close_func() argument
745 lua_State *L = ls->L; in close_func()
746 FuncState *fs = ls->fs; in close_func()
760 ls->fs = fs->prev; in close_func()
776 static int block_follow (LexState *ls, int withuntil) { in block_follow() argument
777 switch (ls->t.token) { in block_follow()
787 static void statlist (LexState *ls) { in statlist() argument
789 while (!block_follow(ls, 1)) { in statlist()
790 if (ls->t.token == TK_RETURN) { in statlist()
791 statement(ls); in statlist()
794 statement(ls); in statlist()
799 static void fieldsel (LexState *ls, expdesc *v) { in fieldsel() argument
801 FuncState *fs = ls->fs; in fieldsel()
804 luaX_next(ls); /* skip the dot or colon */ in fieldsel()
805 codename(ls, &key); in fieldsel()
810 static void yindex (LexState *ls, expdesc *v) { in yindex() argument
812 luaX_next(ls); /* skip the '[' */ in yindex()
813 expr(ls, v); in yindex()
814 luaK_exp2val(ls->fs, v); in yindex()
815 checknext(ls, ']'); in yindex()
835 static void recfield (LexState *ls, ConsControl *cc) { in recfield() argument
837 FuncState *fs = ls->fs; in recfield()
838 int reg = ls->fs->freereg; in recfield()
840 if (ls->t.token == TK_NAME) { in recfield()
842 codename(ls, &key); in recfield()
845 yindex(ls, &key); in recfield()
847 checknext(ls, '='); in recfield()
850 expr(ls, &val); in recfield()
884 static void listfield (LexState *ls, ConsControl *cc) { in listfield() argument
886 expr(ls, &cc->v); in listfield()
891 static void field (LexState *ls, ConsControl *cc) { in field() argument
893 switch(ls->t.token) { in field()
895 if (luaX_lookahead(ls) != '=') /* expression? */ in field()
896 listfield(ls, cc); in field()
898 recfield(ls, cc); in field()
902 recfield(ls, cc); in field()
906 listfield(ls, cc); in field()
913 static void constructor (LexState *ls, expdesc *t) { in constructor() argument
916 FuncState *fs = ls->fs; in constructor()
917 int line = ls->linenumber; in constructor()
926 checknext(ls, '{'); in constructor()
929 if (ls->t.token == '}') break; in constructor()
931 field(ls, &cc); in constructor()
932 } while (testnext(ls, ',') || testnext(ls, ';')); in constructor()
933 check_match(ls, '}', '{', line); in constructor()
947 static void parlist (LexState *ls) { in parlist() argument
949 FuncState *fs = ls->fs; in parlist()
953 if (ls->t.token != ')') { /* is 'parlist' not empty? */ in parlist()
955 switch (ls->t.token) { in parlist()
957 new_localvar(ls, str_checkname(ls)); in parlist()
962 luaX_next(ls); in parlist()
966 default: luaX_syntaxerror(ls, "<name> or '...' expected"); in parlist()
968 } while (!isvararg && testnext(ls, ',')); in parlist()
970 adjustlocalvars(ls, nparams); in parlist()
978 static void body (LexState *ls, expdesc *e, int ismethod, int line) { in body() argument
982 new_fs.f = addprototype(ls); in body()
984 open_func(ls, &new_fs, &bl); in body()
985 checknext(ls, '('); in body()
987 new_localvarliteral(ls, "self"); /* create 'self' parameter */ in body()
988 adjustlocalvars(ls, 1); in body()
990 parlist(ls); in body()
991 checknext(ls, ')'); in body()
992 statlist(ls); in body()
993 new_fs.f->lastlinedefined = ls->linenumber; in body()
994 check_match(ls, TK_END, TK_FUNCTION, line); in body()
995 codeclosure(ls, e); in body()
996 close_func(ls); in body()
1000 static int explist (LexState *ls, expdesc *v) { in explist() argument
1003 expr(ls, v); in explist()
1004 while (testnext(ls, ',')) { in explist()
1005 luaK_exp2nextreg(ls->fs, v); in explist()
1006 expr(ls, v); in explist()
1013 static void funcargs (LexState *ls, expdesc *f, int line) { in funcargs() argument
1014 FuncState *fs = ls->fs; in funcargs()
1017 switch (ls->t.token) { in funcargs()
1019 luaX_next(ls); in funcargs()
1020 if (ls->t.token == ')') /* arg list is empty? */ in funcargs()
1023 explist(ls, &args); in funcargs()
1027 check_match(ls, ')', '(', line); in funcargs()
1031 constructor(ls, &args); in funcargs()
1035 codestring(&args, ls->t.seminfo.ts); in funcargs()
1036 luaX_next(ls); /* must use 'seminfo' before 'next' */ in funcargs()
1040 luaX_syntaxerror(ls, "function arguments expected"); in funcargs()
1068 static void primaryexp (LexState *ls, expdesc *v) { in primaryexp() argument
1070 switch (ls->t.token) { in primaryexp()
1072 int line = ls->linenumber; in primaryexp()
1073 luaX_next(ls); in primaryexp()
1074 expr(ls, v); in primaryexp()
1075 check_match(ls, ')', '(', line); in primaryexp()
1076 luaK_dischargevars(ls->fs, v); in primaryexp()
1080 singlevar(ls, v); in primaryexp()
1084 luaX_syntaxerror(ls, "unexpected symbol"); in primaryexp()
1090 static void suffixedexp (LexState *ls, expdesc *v) { in suffixedexp() argument
1093 FuncState *fs = ls->fs; in suffixedexp()
1094 int line = ls->linenumber; in suffixedexp()
1095 primaryexp(ls, v); in suffixedexp()
1097 switch (ls->t.token) { in suffixedexp()
1099 fieldsel(ls, v); in suffixedexp()
1105 yindex(ls, &key); in suffixedexp()
1111 luaX_next(ls); in suffixedexp()
1112 codename(ls, &key); in suffixedexp()
1114 funcargs(ls, v, line); in suffixedexp()
1119 funcargs(ls, v, line); in suffixedexp()
1128 static void simpleexp (LexState *ls, expdesc *v) { in simpleexp() argument
1131 switch (ls->t.token) { in simpleexp()
1134 v->u.nval = ls->t.seminfo.r; in simpleexp()
1139 v->u.ival = ls->t.seminfo.i; in simpleexp()
1143 codestring(v, ls->t.seminfo.ts); in simpleexp()
1159 FuncState *fs = ls->fs; in simpleexp()
1160 check_condition(ls, fs->f->is_vararg, in simpleexp()
1166 constructor(ls, v); in simpleexp()
1170 luaX_next(ls); in simpleexp()
1171 body(ls, v, 0, ls->linenumber); in simpleexp()
1175 suffixedexp(ls, v); in simpleexp()
1179 luaX_next(ls); in simpleexp()
1248 static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { in subexpr() argument
1251 enterlevel(ls); in subexpr()
1252 uop = getunopr(ls->t.token); in subexpr()
1254 int line = ls->linenumber; in subexpr()
1255 luaX_next(ls); /* skip operator */ in subexpr()
1256 subexpr(ls, v, UNARY_PRIORITY); in subexpr()
1257 luaK_prefix(ls->fs, uop, v, line); in subexpr()
1259 else simpleexp(ls, v); in subexpr()
1261 op = getbinopr(ls->t.token); in subexpr()
1265 int line = ls->linenumber; in subexpr()
1266 luaX_next(ls); /* skip operator */ in subexpr()
1267 luaK_infix(ls->fs, op, v); in subexpr()
1269 nextop = subexpr(ls, &v2, priority[op].right); in subexpr()
1270 luaK_posfix(ls->fs, op, v, &v2, line); in subexpr()
1273 leavelevel(ls); in subexpr()
1278 static void expr (LexState *ls, expdesc *v) { in expr() argument
1279 subexpr(ls, v, 0); in expr()
1293 static void block (LexState *ls) { in block() argument
1295 FuncState *fs = ls->fs; in block()
1298 statlist(ls); in block()
1319 static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { in check_conflict() argument
1320 FuncState *fs = ls->fs; in check_conflict()
1363 static void restassign (LexState *ls, struct LHS_assign *lh, int nvars) { in restassign() argument
1365 check_condition(ls, vkisvar(lh->v.k), "syntax error"); in restassign()
1366 check_readonly(ls, &lh->v); in restassign()
1367 if (testnext(ls, ',')) { /* restassign -> ',' suffixedexp restassign */ in restassign()
1370 suffixedexp(ls, &nv.v); in restassign()
1372 check_conflict(ls, lh, &nv.v); in restassign()
1373 enterlevel(ls); /* control recursion depth */ in restassign()
1374 restassign(ls, &nv, nvars+1); in restassign()
1375 leavelevel(ls); in restassign()
1379 checknext(ls, '='); in restassign()
1380 nexps = explist(ls, &e); in restassign()
1382 adjust_assign(ls, nvars, nexps, &e); in restassign()
1384 luaK_setoneret(ls->fs, &e); /* close last expression */ in restassign()
1385 luaK_storevar(ls->fs, &lh->v, &e); in restassign()
1389 init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ in restassign()
1390 luaK_storevar(ls->fs, &lh->v, &e); in restassign()
1394 static int cond (LexState *ls) { in cond() argument
1397 expr(ls, &v); /* read condition */ in cond()
1399 luaK_goiftrue(ls->fs, &v); in cond()
1404 static void gotostat (LexState *ls) { in gotostat() argument
1405 FuncState *fs = ls->fs; in gotostat()
1406 int line = ls->linenumber; in gotostat()
1407 TString *name = str_checkname(ls); /* label's name */ in gotostat()
1408 Labeldesc *lb = findlabel(ls, name); in gotostat()
1411 newgotoentry(ls, name, line, luaK_jump(fs)); in gotostat()
1426 static void breakstat (LexState *ls) { in breakstat() argument
1427 int line = ls->linenumber; in breakstat()
1428 luaX_next(ls); /* skip break */ in breakstat()
1429 newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, luaK_jump(ls->fs)); in breakstat()
1436 static void checkrepeated (LexState *ls, TString *name) { in checkrepeated() argument
1437 Labeldesc *lb = findlabel(ls, name); in checkrepeated()
1440 msg = luaO_pushfstring(ls->L, msg, getstr(name), lb->line); in checkrepeated()
1441 luaK_semerror(ls, msg); /* error */ in checkrepeated()
1446 static void labelstat (LexState *ls, TString *name, int line) { in labelstat() argument
1448 checknext(ls, TK_DBCOLON); /* skip double colon */ in labelstat()
1449 while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) in labelstat()
1450 statement(ls); /* skip other no-op statements */ in labelstat()
1451 checkrepeated(ls, name); /* check for repeated labels */ in labelstat()
1452 createlabel(ls, name, line, block_follow(ls, 0)); in labelstat()
1456 static void whilestat (LexState *ls, int line) { in whilestat() argument
1458 FuncState *fs = ls->fs; in whilestat()
1462 luaX_next(ls); /* skip WHILE */ in whilestat()
1464 condexit = cond(ls); in whilestat()
1466 checknext(ls, TK_DO); in whilestat()
1467 block(ls); in whilestat()
1469 check_match(ls, TK_END, TK_WHILE, line); in whilestat()
1475 static void repeatstat (LexState *ls, int line) { in repeatstat() argument
1478 FuncState *fs = ls->fs; in repeatstat()
1483 luaX_next(ls); /* skip REPEAT */ in repeatstat()
1484 statlist(ls); in repeatstat()
1485 check_match(ls, TK_UNTIL, TK_REPEAT, line); in repeatstat()
1486 condexit = cond(ls); /* read condition (inside scope block) */ in repeatstat()
1505 static void exp1 (LexState *ls) { in exp1() argument
1507 expr(ls, &e); in exp1()
1508 luaK_exp2nextreg(ls->fs, &e); in exp1()
1524 luaX_syntaxerror(fs->ls, "control structure too long"); in fixforjump()
1532 static void forbody (LexState *ls, int base, int line, int nvars, int isgen) { in forbody() argument
1537 FuncState *fs = ls->fs; in forbody()
1539 checknext(ls, TK_DO); in forbody()
1542 adjustlocalvars(ls, nvars); in forbody()
1544 block(ls); in forbody()
1557 static void fornum (LexState *ls, TString *varname, int line) { in fornum() argument
1559 FuncState *fs = ls->fs; in fornum()
1561 new_localvarliteral(ls, "(for state)"); in fornum()
1562 new_localvarliteral(ls, "(for state)"); in fornum()
1563 new_localvarliteral(ls, "(for state)"); in fornum()
1564 new_localvar(ls, varname); in fornum()
1565 checknext(ls, '='); in fornum()
1566 exp1(ls); /* initial value */ in fornum()
1567 checknext(ls, ','); in fornum()
1568 exp1(ls); /* limit */ in fornum()
1569 if (testnext(ls, ',')) in fornum()
1570 exp1(ls); /* optional step */ in fornum()
1575 adjustlocalvars(ls, 3); /* control variables */ in fornum()
1576 forbody(ls, base, line, 1, 0); in fornum()
1580 static void forlist (LexState *ls, TString *indexname) { in forlist() argument
1582 FuncState *fs = ls->fs; in forlist()
1588 new_localvarliteral(ls, "(for state)"); in forlist()
1589 new_localvarliteral(ls, "(for state)"); in forlist()
1590 new_localvarliteral(ls, "(for state)"); in forlist()
1591 new_localvarliteral(ls, "(for state)"); in forlist()
1593 new_localvar(ls, indexname); in forlist()
1594 while (testnext(ls, ',')) { in forlist()
1595 new_localvar(ls, str_checkname(ls)); in forlist()
1598 checknext(ls, TK_IN); in forlist()
1599 line = ls->linenumber; in forlist()
1600 adjust_assign(ls, 4, explist(ls, &e), &e); in forlist()
1601 adjustlocalvars(ls, 4); /* control variables */ in forlist()
1604 forbody(ls, base, line, nvars - 4, 1); in forlist()
1608 static void forstat (LexState *ls, int line) { in forstat() argument
1610 FuncState *fs = ls->fs; in forstat()
1614 luaX_next(ls); /* skip 'for' */ in forstat()
1615 varname = str_checkname(ls); /* first variable name */ in forstat()
1616 switch (ls->t.token) { in forstat()
1617 case '=': fornum(ls, varname, line); break; in forstat()
1618 case ',': case TK_IN: forlist(ls, varname); break; in forstat()
1619 default: luaX_syntaxerror(ls, "'=' or 'in' expected"); in forstat()
1621 check_match(ls, TK_END, TK_FOR, line); in forstat()
1626 static void test_then_block (LexState *ls, int *escapelist) { in test_then_block() argument
1629 FuncState *fs = ls->fs; in test_then_block()
1632 luaX_next(ls); /* skip IF or ELSEIF */ in test_then_block()
1633 expr(ls, &v); /* read condition */ in test_then_block()
1634 checknext(ls, TK_THEN); in test_then_block()
1635 if (ls->t.token == TK_BREAK) { /* 'if x then break' ? */ in test_then_block()
1636 int line = ls->linenumber; in test_then_block()
1637 luaK_goiffalse(ls->fs, &v); /* will jump if condition is true */ in test_then_block()
1638 luaX_next(ls); /* skip 'break' */ in test_then_block()
1640 newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, v.t); in test_then_block()
1641 while (testnext(ls, ';')) {} /* skip semicolons */ in test_then_block()
1642 if (block_follow(ls, 0)) { /* jump is the entire block? */ in test_then_block()
1650 luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ in test_then_block()
1654 statlist(ls); /* 'then' part */ in test_then_block()
1656 if (ls->t.token == TK_ELSE || in test_then_block()
1657 ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ in test_then_block()
1663 static void ifstat (LexState *ls, int line) { in ifstat() argument
1665 FuncState *fs = ls->fs; in ifstat()
1667 test_then_block(ls, &escapelist); /* IF cond THEN block */ in ifstat()
1668 while (ls->t.token == TK_ELSEIF) in ifstat()
1669 test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ in ifstat()
1670 if (testnext(ls, TK_ELSE)) in ifstat()
1671 block(ls); /* 'else' part */ in ifstat()
1672 check_match(ls, TK_END, TK_IF, line); in ifstat()
1677 static void localfunc (LexState *ls) { in localfunc() argument
1679 FuncState *fs = ls->fs; in localfunc()
1681 new_localvar(ls, str_checkname(ls)); /* new local variable */ in localfunc()
1682 adjustlocalvars(ls, 1); /* enter its scope */ in localfunc()
1683 body(ls, &b, 0, ls->linenumber); /* function created in next register */ in localfunc()
1689 static int getlocalattribute (LexState *ls) { in getlocalattribute() argument
1691 if (testnext(ls, '<')) { in getlocalattribute()
1692 const char *attr = getstr(str_checkname(ls)); in getlocalattribute()
1693 checknext(ls, '>'); in getlocalattribute()
1699 luaK_semerror(ls, in getlocalattribute()
1700 luaO_pushfstring(ls->L, "unknown attribute '%s'", attr)); in getlocalattribute()
1706 static void checktoclose (LexState *ls, int level) { in checktoclose() argument
1708 FuncState *fs = ls->fs; in checktoclose()
1716 static void localstat (LexState *ls) { in localstat() argument
1718 FuncState *fs = ls->fs; in localstat()
1726 vidx = new_localvar(ls, str_checkname(ls)); in localstat()
1727 kind = getlocalattribute(ls); in localstat()
1731 luaK_semerror(ls, "multiple to-be-closed variables in local list"); in localstat()
1735 } while (testnext(ls, ',')); in localstat()
1736 if (testnext(ls, '=')) in localstat()
1737 nexps = explist(ls, &e); in localstat()
1747 adjustlocalvars(ls, nvars - 1); /* exclude last variable */ in localstat()
1751 adjust_assign(ls, nvars, nexps, &e); in localstat()
1752 adjustlocalvars(ls, nvars); in localstat()
1754 checktoclose(ls, toclose); in localstat()
1758 static int funcname (LexState *ls, expdesc *v) { in funcname() argument
1761 singlevar(ls, v); in funcname()
1762 while (ls->t.token == '.') in funcname()
1763 fieldsel(ls, v); in funcname()
1764 if (ls->t.token == ':') { in funcname()
1766 fieldsel(ls, v); in funcname()
1772 static void funcstat (LexState *ls, int line) { in funcstat() argument
1776 luaX_next(ls); /* skip FUNCTION */ in funcstat()
1777 ismethod = funcname(ls, &v); in funcstat()
1778 body(ls, &b, ismethod, line); in funcstat()
1779 luaK_storevar(ls->fs, &v, &b); in funcstat()
1780 luaK_fixline(ls->fs, line); /* definition "happens" in the first line */ in funcstat()
1784 static void exprstat (LexState *ls) { in exprstat() argument
1786 FuncState *fs = ls->fs; in exprstat()
1788 suffixedexp(ls, &v.v); in exprstat()
1789 if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ in exprstat()
1791 restassign(ls, &v, 1); in exprstat()
1795 check_condition(ls, v.v.k == VCALL, "syntax error"); in exprstat()
1802 static void retstat (LexState *ls) { in retstat() argument
1804 FuncState *fs = ls->fs; in retstat()
1808 if (block_follow(ls, 1) || ls->t.token == ';') in retstat()
1811 nret = explist(ls, &e); /* optional return values */ in retstat()
1830 testnext(ls, ';'); /* skip optional semicolon */ in retstat()
1834 static void statement (LexState *ls) { in statement() argument
1835 int line = ls->linenumber; /* may be needed for error messages */ in statement()
1836 enterlevel(ls); in statement()
1837 switch (ls->t.token) { in statement()
1839 luaX_next(ls); /* skip ';' */ in statement()
1843 ifstat(ls, line); in statement()
1847 whilestat(ls, line); in statement()
1851 luaX_next(ls); /* skip DO */ in statement()
1852 block(ls); in statement()
1853 check_match(ls, TK_END, TK_DO, line); in statement()
1857 forstat(ls, line); in statement()
1861 repeatstat(ls, line); in statement()
1865 funcstat(ls, line); in statement()
1869 luaX_next(ls); /* skip LOCAL */ in statement()
1870 if (testnext(ls, TK_FUNCTION)) /* local function? */ in statement()
1871 localfunc(ls); in statement()
1873 localstat(ls); in statement()
1877 luaX_next(ls); /* skip double colon */ in statement()
1878 labelstat(ls, str_checkname(ls), line); in statement()
1882 luaX_next(ls); /* skip RETURN */ in statement()
1883 retstat(ls); in statement()
1887 breakstat(ls); in statement()
1891 luaX_next(ls); /* skip 'goto' */ in statement()
1892 gotostat(ls); in statement()
1896 exprstat(ls); in statement()
1900 lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && in statement()
1901 ls->fs->freereg >= luaY_nvarstack(ls->fs)); in statement()
1902 ls->fs->freereg = luaY_nvarstack(ls->fs); /* free registers */ in statement()
1903 leavelevel(ls); in statement()
1913 static void mainfunc (LexState *ls, FuncState *fs) { in mainfunc() argument
1916 open_func(ls, fs, &bl); in mainfunc()
1922 env->name = ls->envn; in mainfunc()
1923 luaC_objbarrier(ls->L, fs->f, env->name); in mainfunc()
1924 luaX_next(ls); /* read first token */ in mainfunc()
1925 statlist(ls); /* parse main body */ in mainfunc()
1926 check(ls, TK_EOS); in mainfunc()
1927 close_func(ls); in mainfunc()