Lines Matching full: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 (l_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()
463 static void singlevar (LexState *ls, expdesc *var) { in singlevar() argument
464 TString *varname = str_checkname(ls); in singlevar()
465 FuncState *fs = ls->fs; in singlevar()
469 singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ in singlevar()
482 static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { in adjust_assign() argument
483 FuncState *fs = ls->fs; in adjust_assign()
504 #define enterlevel(ls) luaE_incCstack(ls->L) argument
507 #define leavelevel(ls) ((ls)->L->nCcalls--) argument
514 static l_noret jumpscopeerror (LexState *ls, Labeldesc *gt) { in jumpscopeerror() argument
515 const char *varname = getstr(getlocalvardesc(ls->fs, gt->nactvar)->vd.name); in jumpscopeerror()
517 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line, varname); in jumpscopeerror()
518 luaK_semerror(ls, msg); /* raise the error */ in jumpscopeerror()
527 static void solvegoto (LexState *ls, int g, Labeldesc *label) { in solvegoto() argument
529 Labellist *gl = &ls->dyd->gt; /* list of gotos */ in solvegoto()
533 jumpscopeerror(ls, gt); in solvegoto()
534 luaK_patchlist(ls->fs, gt->pc, label->pc); in solvegoto()
544 static Labeldesc *findlabel (LexState *ls, TString *name) { in findlabel() argument
546 Dyndata *dyd = ls->dyd; in findlabel()
548 for (i = ls->fs->firstlabel; i < dyd->label.n; i++) { in findlabel()
560 static int newlabelentry (LexState *ls, Labellist *l, TString *name, in newlabelentry() argument
563 luaM_growvector(ls->L, l->arr, n, l->size, in newlabelentry()
567 l->arr[n].nactvar = ls->fs->nactvar; in newlabelentry()
575 static int newgotoentry (LexState *ls, TString *name, int line, int pc) { in newgotoentry() argument
576 return newlabelentry(ls, &ls->dyd->gt, name, line, pc); in newgotoentry()
585 static int solvegotos (LexState *ls, Labeldesc *lb) { in solvegotos() argument
586 Labellist *gl = &ls->dyd->gt; in solvegotos()
587 int i = ls->fs->bl->firstgoto; in solvegotos()
592 solvegoto(ls, i, lb); /* will remove 'i' from the list */ in solvegotos()
608 static int createlabel (LexState *ls, TString *name, int line, in createlabel() argument
610 FuncState *fs = ls->fs; in createlabel()
611 Labellist *ll = &ls->dyd->label; in createlabel()
612 int l = newlabelentry(ls, ll, name, line, luaK_getlabel(fs)); in createlabel()
617 if (solvegotos(ls, &ll->arr[l])) { /* need close? */ in createlabel()
630 Labellist *gl = &fs->ls->dyd->gt; in movegotosout()
645 bl->firstlabel = fs->ls->dyd->label.n; in enterblock()
646 bl->firstgoto = fs->ls->dyd->gt.n; in enterblock()
658 static l_noret undefgoto (LexState *ls, Labeldesc *gt) { in undefgoto() argument
660 if (eqstr(gt->name, luaS_newliteral(ls->L, "break"))) { in undefgoto()
662 msg = luaO_pushfstring(ls->L, msg, gt->line); in undefgoto()
666 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); in undefgoto()
668 luaK_semerror(ls, msg); in undefgoto()
674 LexState *ls = fs->ls; in leaveblock() local
680 hasclose = createlabel(ls, luaS_newliteral(ls->L, "break"), 0, 0); in leaveblock()
684 ls->dyd->label.n = bl->firstlabel; /* remove local labels */ in leaveblock()
689 if (bl->firstgoto < ls->dyd->gt.n) /* still pending gotos? */ in leaveblock()
690 undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ in leaveblock()
698 static Proto *addprototype (LexState *ls) { in addprototype() argument
700 lua_State *L = ls->L; in addprototype()
701 FuncState *fs = ls->fs; in addprototype()
722 static void codeclosure (LexState *ls, expdesc *v) { in codeclosure() argument
723 FuncState *fs = ls->fs->prev; in codeclosure()
729 static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { in open_func() argument
731 fs->prev = ls->fs; /* linked list of funcstates */ in open_func()
732 fs->ls = ls; in open_func()
733 ls->fs = fs; in open_func()
746 fs->firstlocal = ls->dyd->actvar.n; in open_func()
747 fs->firstlabel = ls->dyd->label.n; in open_func()
749 f->source = ls->source; in open_func()
750 luaC_objbarrier(ls->L, f, f->source); in open_func()
756 static void close_func (LexState *ls) { in close_func() argument
757 lua_State *L = ls->L; in close_func()
758 FuncState *fs = ls->fs; in close_func()
772 ls->fs = fs->prev; in close_func()
788 static int block_follow (LexState *ls, int withuntil) { in block_follow() argument
789 switch (ls->t.token) { in block_follow()
799 static void statlist (LexState *ls) { in statlist() argument
801 while (!block_follow(ls, 1)) { in statlist()
802 if (ls->t.token == TK_RETURN) { in statlist()
803 statement(ls); in statlist()
806 statement(ls); in statlist()
811 static void fieldsel (LexState *ls, expdesc *v) { in fieldsel() argument
813 FuncState *fs = ls->fs; in fieldsel()
816 luaX_next(ls); /* skip the dot or colon */ in fieldsel()
817 codename(ls, &key); in fieldsel()
822 static void yindex (LexState *ls, expdesc *v) { in yindex() argument
824 luaX_next(ls); /* skip the '[' */ in yindex()
825 expr(ls, v); in yindex()
826 luaK_exp2val(ls->fs, v); in yindex()
827 checknext(ls, ']'); in yindex()
847 static void recfield (LexState *ls, ConsControl *cc) { in recfield() argument
849 FuncState *fs = ls->fs; in recfield()
850 int reg = ls->fs->freereg; in recfield()
852 if (ls->t.token == TK_NAME) { in recfield()
854 codename(ls, &key); in recfield()
856 else /* ls->t.token == '[' */ in recfield()
857 yindex(ls, &key); in recfield()
859 checknext(ls, '='); in recfield()
862 expr(ls, &val); in recfield()
896 static void listfield (LexState *ls, ConsControl *cc) { in listfield() argument
898 expr(ls, &cc->v); in listfield()
903 static void field (LexState *ls, ConsControl *cc) { in field() argument
905 switch(ls->t.token) { in field()
907 if (luaX_lookahead(ls) != '=') /* expression? */ in field()
908 listfield(ls, cc); in field()
910 recfield(ls, cc); in field()
914 recfield(ls, cc); in field()
918 listfield(ls, cc); in field()
925 static void constructor (LexState *ls, expdesc *t) { in constructor() argument
928 FuncState *fs = ls->fs; in constructor()
929 int line = ls->linenumber; in constructor()
938 checknext(ls, '{'); in constructor()
941 if (ls->t.token == '}') break; in constructor()
943 field(ls, &cc); in constructor()
944 } while (testnext(ls, ',') || testnext(ls, ';')); in constructor()
945 check_match(ls, '}', '{', line); in constructor()
959 static void parlist (LexState *ls) { in parlist() argument
961 FuncState *fs = ls->fs; in parlist()
965 if (ls->t.token != ')') { /* is 'parlist' not empty? */ in parlist()
967 switch (ls->t.token) { in parlist()
969 new_localvar(ls, str_checkname(ls)); in parlist()
974 luaX_next(ls); in parlist()
978 default: luaX_syntaxerror(ls, "<name> or '...' expected"); in parlist()
980 } while (!isvararg && testnext(ls, ',')); in parlist()
982 adjustlocalvars(ls, nparams); in parlist()
990 static void body (LexState *ls, expdesc *e, int ismethod, int line) { in body() argument
994 new_fs.f = addprototype(ls); in body()
996 open_func(ls, &new_fs, &bl); in body()
997 checknext(ls, '('); in body()
999 new_localvarliteral(ls, "self"); /* create 'self' parameter */ in body()
1000 adjustlocalvars(ls, 1); in body()
1002 parlist(ls); in body()
1003 checknext(ls, ')'); in body()
1004 statlist(ls); in body()
1005 new_fs.f->lastlinedefined = ls->linenumber; in body()
1006 check_match(ls, TK_END, TK_FUNCTION, line); in body()
1007 codeclosure(ls, e); in body()
1008 close_func(ls); in body()
1012 static int explist (LexState *ls, expdesc *v) { in explist() argument
1015 expr(ls, v); in explist()
1016 while (testnext(ls, ',')) { in explist()
1017 luaK_exp2nextreg(ls->fs, v); in explist()
1018 expr(ls, v); in explist()
1025 static void funcargs (LexState *ls, expdesc *f, int line) { in funcargs() argument
1026 FuncState *fs = ls->fs; in funcargs()
1029 switch (ls->t.token) { in funcargs()
1031 luaX_next(ls); in funcargs()
1032 if (ls->t.token == ')') /* arg list is empty? */ in funcargs()
1035 explist(ls, &args); in funcargs()
1039 check_match(ls, ')', '(', line); in funcargs()
1043 constructor(ls, &args); in funcargs()
1047 codestring(&args, ls->t.seminfo.ts); in funcargs()
1048 luaX_next(ls); /* must use 'seminfo' before 'next' */ in funcargs()
1052 luaX_syntaxerror(ls, "function arguments expected"); in funcargs()
1080 static void primaryexp (LexState *ls, expdesc *v) { in primaryexp() argument
1082 switch (ls->t.token) { in primaryexp()
1084 int line = ls->linenumber; in primaryexp()
1085 luaX_next(ls); in primaryexp()
1086 expr(ls, v); in primaryexp()
1087 check_match(ls, ')', '(', line); in primaryexp()
1088 luaK_dischargevars(ls->fs, v); in primaryexp()
1092 singlevar(ls, v); in primaryexp()
1096 luaX_syntaxerror(ls, "unexpected symbol"); in primaryexp()
1102 static void suffixedexp (LexState *ls, expdesc *v) { in suffixedexp() argument
1105 FuncState *fs = ls->fs; in suffixedexp()
1106 int line = ls->linenumber; in suffixedexp()
1107 primaryexp(ls, v); in suffixedexp()
1109 switch (ls->t.token) { in suffixedexp()
1111 fieldsel(ls, v); in suffixedexp()
1117 yindex(ls, &key); in suffixedexp()
1123 luaX_next(ls); in suffixedexp()
1124 codename(ls, &key); in suffixedexp()
1126 funcargs(ls, v, line); in suffixedexp()
1131 funcargs(ls, v, line); in suffixedexp()
1140 static void simpleexp (LexState *ls, expdesc *v) { in simpleexp() argument
1143 switch (ls->t.token) { in simpleexp()
1146 v->u.nval = ls->t.seminfo.r; in simpleexp()
1151 v->u.ival = ls->t.seminfo.i; in simpleexp()
1155 codestring(v, ls->t.seminfo.ts); in simpleexp()
1171 FuncState *fs = ls->fs; in simpleexp()
1172 check_condition(ls, fs->f->is_vararg, in simpleexp()
1178 constructor(ls, v); in simpleexp()
1182 luaX_next(ls); in simpleexp()
1183 body(ls, v, 0, ls->linenumber); in simpleexp()
1187 suffixedexp(ls, v); in simpleexp()
1191 luaX_next(ls); in simpleexp()
1260 static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { in subexpr() argument
1263 enterlevel(ls); in subexpr()
1264 uop = getunopr(ls->t.token); in subexpr()
1266 int line = ls->linenumber; in subexpr()
1267 luaX_next(ls); /* skip operator */ in subexpr()
1268 subexpr(ls, v, UNARY_PRIORITY); in subexpr()
1269 luaK_prefix(ls->fs, uop, v, line); in subexpr()
1271 else simpleexp(ls, v); in subexpr()
1273 op = getbinopr(ls->t.token); in subexpr()
1277 int line = ls->linenumber; in subexpr()
1278 luaX_next(ls); /* skip operator */ in subexpr()
1279 luaK_infix(ls->fs, op, v); in subexpr()
1281 nextop = subexpr(ls, &v2, priority[op].right); in subexpr()
1282 luaK_posfix(ls->fs, op, v, &v2, line); in subexpr()
1285 leavelevel(ls); in subexpr()
1290 static void expr (LexState *ls, expdesc *v) { in expr() argument
1291 subexpr(ls, v, 0); in expr()
1305 static void block (LexState *ls) { in block() argument
1307 FuncState *fs = ls->fs; in block()
1310 statlist(ls); in block()
1331 static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { in check_conflict() argument
1332 FuncState *fs = ls->fs; in check_conflict()
1375 static void restassign (LexState *ls, struct LHS_assign *lh, int nvars) { in restassign() argument
1377 check_condition(ls, vkisvar(lh->v.k), "syntax error"); in restassign()
1378 check_readonly(ls, &lh->v); in restassign()
1379 if (testnext(ls, ',')) { /* restassign -> ',' suffixedexp restassign */ in restassign()
1382 suffixedexp(ls, &nv.v); in restassign()
1384 check_conflict(ls, lh, &nv.v); in restassign()
1385 enterlevel(ls); /* control recursion depth */ in restassign()
1386 restassign(ls, &nv, nvars+1); in restassign()
1387 leavelevel(ls); in restassign()
1391 checknext(ls, '='); in restassign()
1392 nexps = explist(ls, &e); in restassign()
1394 adjust_assign(ls, nvars, nexps, &e); in restassign()
1396 luaK_setoneret(ls->fs, &e); /* close last expression */ in restassign()
1397 luaK_storevar(ls->fs, &lh->v, &e); in restassign()
1401 init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ in restassign()
1402 luaK_storevar(ls->fs, &lh->v, &e); in restassign()
1406 static int cond (LexState *ls) { in cond() argument
1409 expr(ls, &v); /* read condition */ in cond()
1411 luaK_goiftrue(ls->fs, &v); in cond()
1416 static void gotostat (LexState *ls) { in gotostat() argument
1417 FuncState *fs = ls->fs; in gotostat()
1418 int line = ls->linenumber; in gotostat()
1419 TString *name = str_checkname(ls); /* label's name */ in gotostat()
1420 Labeldesc *lb = findlabel(ls, name); in gotostat()
1423 newgotoentry(ls, name, line, luaK_jump(fs)); in gotostat()
1438 static void breakstat (LexState *ls) { in breakstat() argument
1439 int line = ls->linenumber; in breakstat()
1440 luaX_next(ls); /* skip break */ in breakstat()
1441 newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, luaK_jump(ls->fs)); in breakstat()
1448 static void checkrepeated (LexState *ls, TString *name) { in checkrepeated() argument
1449 Labeldesc *lb = findlabel(ls, name); in checkrepeated()
1452 msg = luaO_pushfstring(ls->L, msg, getstr(name), lb->line); in checkrepeated()
1453 luaK_semerror(ls, msg); /* error */ in checkrepeated()
1458 static void labelstat (LexState *ls, TString *name, int line) { in labelstat() argument
1460 checknext(ls, TK_DBCOLON); /* skip double colon */ in labelstat()
1461 while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) in labelstat()
1462 statement(ls); /* skip other no-op statements */ in labelstat()
1463 checkrepeated(ls, name); /* check for repeated labels */ in labelstat()
1464 createlabel(ls, name, line, block_follow(ls, 0)); in labelstat()
1468 static void whilestat (LexState *ls, int line) { in whilestat() argument
1470 FuncState *fs = ls->fs; in whilestat()
1474 luaX_next(ls); /* skip WHILE */ in whilestat()
1476 condexit = cond(ls); in whilestat()
1478 checknext(ls, TK_DO); in whilestat()
1479 block(ls); in whilestat()
1481 check_match(ls, TK_END, TK_WHILE, line); in whilestat()
1487 static void repeatstat (LexState *ls, int line) { in repeatstat() argument
1490 FuncState *fs = ls->fs; in repeatstat()
1495 luaX_next(ls); /* skip REPEAT */ in repeatstat()
1496 statlist(ls); in repeatstat()
1497 check_match(ls, TK_UNTIL, TK_REPEAT, line); in repeatstat()
1498 condexit = cond(ls); /* read condition (inside scope block) */ in repeatstat()
1517 static void exp1 (LexState *ls) { in exp1() argument
1519 expr(ls, &e); in exp1()
1520 luaK_exp2nextreg(ls->fs, &e); in exp1()
1536 luaX_syntaxerror(fs->ls, "control structure too long"); in fixforjump()
1544 static void forbody (LexState *ls, int base, int line, int nvars, int isgen) { in forbody() argument
1549 FuncState *fs = ls->fs; in forbody()
1551 checknext(ls, TK_DO); in forbody()
1554 adjustlocalvars(ls, nvars); in forbody()
1556 block(ls); in forbody()
1569 static void fornum (LexState *ls, TString *varname, int line) { in fornum() argument
1571 FuncState *fs = ls->fs; in fornum()
1573 new_localvarliteral(ls, "(for state)"); in fornum()
1574 new_localvarliteral(ls, "(for state)"); in fornum()
1575 new_localvarliteral(ls, "(for state)"); in fornum()
1576 new_localvar(ls, varname); in fornum()
1577 checknext(ls, '='); in fornum()
1578 exp1(ls); /* initial value */ in fornum()
1579 checknext(ls, ','); in fornum()
1580 exp1(ls); /* limit */ in fornum()
1581 if (testnext(ls, ',')) in fornum()
1582 exp1(ls); /* optional step */ in fornum()
1587 adjustlocalvars(ls, 3); /* control variables */ in fornum()
1588 forbody(ls, base, line, 1, 0); in fornum()
1592 static void forlist (LexState *ls, TString *indexname) { in forlist() argument
1594 FuncState *fs = ls->fs; in forlist()
1600 new_localvarliteral(ls, "(for state)"); in forlist()
1601 new_localvarliteral(ls, "(for state)"); in forlist()
1602 new_localvarliteral(ls, "(for state)"); in forlist()
1603 new_localvarliteral(ls, "(for state)"); in forlist()
1605 new_localvar(ls, indexname); in forlist()
1606 while (testnext(ls, ',')) { in forlist()
1607 new_localvar(ls, str_checkname(ls)); in forlist()
1610 checknext(ls, TK_IN); in forlist()
1611 line = ls->linenumber; in forlist()
1612 adjust_assign(ls, 4, explist(ls, &e), &e); in forlist()
1613 adjustlocalvars(ls, 4); /* control variables */ in forlist()
1616 forbody(ls, base, line, nvars - 4, 1); in forlist()
1620 static void forstat (LexState *ls, int line) { in forstat() argument
1622 FuncState *fs = ls->fs; in forstat()
1626 luaX_next(ls); /* skip 'for' */ in forstat()
1627 varname = str_checkname(ls); /* first variable name */ in forstat()
1628 switch (ls->t.token) { in forstat()
1629 case '=': fornum(ls, varname, line); break; in forstat()
1630 case ',': case TK_IN: forlist(ls, varname); break; in forstat()
1631 default: luaX_syntaxerror(ls, "'=' or 'in' expected"); in forstat()
1633 check_match(ls, TK_END, TK_FOR, line); in forstat()
1638 static void test_then_block (LexState *ls, int *escapelist) { in test_then_block() argument
1641 FuncState *fs = ls->fs; in test_then_block()
1644 luaX_next(ls); /* skip IF or ELSEIF */ in test_then_block()
1645 expr(ls, &v); /* read condition */ in test_then_block()
1646 checknext(ls, TK_THEN); in test_then_block()
1647 if (ls->t.token == TK_BREAK) { /* 'if x then break' ? */ in test_then_block()
1648 int line = ls->linenumber; in test_then_block()
1649 luaK_goiffalse(ls->fs, &v); /* will jump if condition is true */ in test_then_block()
1650 luaX_next(ls); /* skip 'break' */ in test_then_block()
1652 newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, v.t); in test_then_block()
1653 while (testnext(ls, ';')) {} /* skip semicolons */ in test_then_block()
1654 if (block_follow(ls, 0)) { /* jump is the entire block? */ in test_then_block()
1662 luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ in test_then_block()
1666 statlist(ls); /* 'then' part */ in test_then_block()
1668 if (ls->t.token == TK_ELSE || in test_then_block()
1669 ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ in test_then_block()
1675 static void ifstat (LexState *ls, int line) { in ifstat() argument
1677 FuncState *fs = ls->fs; in ifstat()
1679 test_then_block(ls, &escapelist); /* IF cond THEN block */ in ifstat()
1680 while (ls->t.token == TK_ELSEIF) in ifstat()
1681 test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ in ifstat()
1682 if (testnext(ls, TK_ELSE)) in ifstat()
1683 block(ls); /* 'else' part */ in ifstat()
1684 check_match(ls, TK_END, TK_IF, line); in ifstat()
1689 static void localfunc (LexState *ls) { in localfunc() argument
1691 FuncState *fs = ls->fs; in localfunc()
1693 new_localvar(ls, str_checkname(ls)); /* new local variable */ in localfunc()
1694 adjustlocalvars(ls, 1); /* enter its scope */ in localfunc()
1695 body(ls, &b, 0, ls->linenumber); /* function created in next register */ in localfunc()
1701 static int getlocalattribute (LexState *ls) { in getlocalattribute() argument
1703 if (testnext(ls, '<')) { in getlocalattribute()
1704 const char *attr = getstr(str_checkname(ls)); in getlocalattribute()
1705 checknext(ls, '>'); in getlocalattribute()
1711 luaK_semerror(ls, in getlocalattribute()
1712 luaO_pushfstring(ls->L, "unknown attribute '%s'", attr)); in getlocalattribute()
1726 static void localstat (LexState *ls) { in localstat() argument
1728 FuncState *fs = ls->fs; in localstat()
1736 vidx = new_localvar(ls, str_checkname(ls)); in localstat()
1737 kind = getlocalattribute(ls); in localstat()
1741 luaK_semerror(ls, "multiple to-be-closed variables in local list"); in localstat()
1745 } while (testnext(ls, ',')); in localstat()
1746 if (testnext(ls, '=')) in localstat()
1747 nexps = explist(ls, &e); in localstat()
1757 adjustlocalvars(ls, nvars - 1); /* exclude last variable */ in localstat()
1761 adjust_assign(ls, nvars, nexps, &e); in localstat()
1762 adjustlocalvars(ls, nvars); in localstat()
1768 static int funcname (LexState *ls, expdesc *v) { in funcname() argument
1771 singlevar(ls, v); in funcname()
1772 while (ls->t.token == '.') in funcname()
1773 fieldsel(ls, v); in funcname()
1774 if (ls->t.token == ':') { in funcname()
1776 fieldsel(ls, v); in funcname()
1782 static void funcstat (LexState *ls, int line) { in funcstat() argument
1786 luaX_next(ls); /* skip FUNCTION */ in funcstat()
1787 ismethod = funcname(ls, &v); in funcstat()
1788 body(ls, &b, ismethod, line); in funcstat()
1789 check_readonly(ls, &v); in funcstat()
1790 luaK_storevar(ls->fs, &v, &b); in funcstat()
1791 luaK_fixline(ls->fs, line); /* definition "happens" in the first line */ in funcstat()
1795 static void exprstat (LexState *ls) { in exprstat() argument
1797 FuncState *fs = ls->fs; in exprstat()
1799 suffixedexp(ls, &v.v); in exprstat()
1800 if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ in exprstat()
1802 restassign(ls, &v, 1); in exprstat()
1806 check_condition(ls, v.v.k == VCALL, "syntax error"); in exprstat()
1813 static void retstat (LexState *ls) { in retstat() argument
1815 FuncState *fs = ls->fs; in retstat()
1819 if (block_follow(ls, 1) || ls->t.token == ';') in retstat()
1822 nret = explist(ls, &e); /* optional return values */ in retstat()
1841 testnext(ls, ';'); /* skip optional semicolon */ in retstat()
1845 static void statement (LexState *ls) { in statement() argument
1846 int line = ls->linenumber; /* may be needed for error messages */ in statement()
1847 enterlevel(ls); in statement()
1848 switch (ls->t.token) { in statement()
1850 luaX_next(ls); /* skip ';' */ in statement()
1854 ifstat(ls, line); in statement()
1858 whilestat(ls, line); in statement()
1862 luaX_next(ls); /* skip DO */ in statement()
1863 block(ls); in statement()
1864 check_match(ls, TK_END, TK_DO, line); in statement()
1868 forstat(ls, line); in statement()
1872 repeatstat(ls, line); in statement()
1876 funcstat(ls, line); in statement()
1880 luaX_next(ls); /* skip LOCAL */ in statement()
1881 if (testnext(ls, TK_FUNCTION)) /* local function? */ in statement()
1882 localfunc(ls); in statement()
1884 localstat(ls); in statement()
1888 luaX_next(ls); /* skip double colon */ in statement()
1889 labelstat(ls, str_checkname(ls), line); in statement()
1893 luaX_next(ls); /* skip RETURN */ in statement()
1894 retstat(ls); in statement()
1898 breakstat(ls); in statement()
1902 luaX_next(ls); /* skip 'goto' */ in statement()
1903 gotostat(ls); in statement()
1907 exprstat(ls); in statement()
1911 lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && in statement()
1912 ls->fs->freereg >= luaY_nvarstack(ls->fs)); in statement()
1913 ls->fs->freereg = luaY_nvarstack(ls->fs); /* free registers */ in statement()
1914 leavelevel(ls); in statement()
1924 static void mainfunc (LexState *ls, FuncState *fs) { in mainfunc() argument
1927 open_func(ls, fs, &bl); in mainfunc()
1933 env->name = ls->envn; in mainfunc()
1934 luaC_objbarrier(ls->L, fs->f, env->name); in mainfunc()
1935 luaX_next(ls); /* read first token */ in mainfunc()
1936 statlist(ls); /* parse main body */ in mainfunc()
1937 check(ls, TK_EOS); in mainfunc()
1938 close_func(ls); in mainfunc()