Lines Matching refs:ls

68 static void statement (LexState *ls);
69 static void expr (LexState *ls, expdesc *v);
72 static l_noret error_expected (LexState *ls, int token) { in error_expected() argument
73 luaX_syntaxerror(ls, in error_expected()
74 luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token))); in error_expected()
79 lua_State *L = fs->ls->L; in errorlimit()
87 luaX_syntaxerror(fs->ls, msg); in errorlimit()
99 static int testnext (LexState *ls, int c) { in testnext() argument
100 if (ls->t.token == c) { in testnext()
101 luaX_next(ls); in testnext()
111 static void check (LexState *ls, int c) { in check() argument
112 if (ls->t.token != c) in check()
113 error_expected(ls, c); in check()
120 static void checknext (LexState *ls, int c) { in checknext() argument
121 check(ls, c); in checknext()
122 luaX_next(ls); in checknext()
126 #define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } argument
134 static void check_match (LexState *ls, int what, int who, int where) { in check_match() argument
135 if (l_unlikely(!testnext(ls, what))) { in check_match()
136 if (where == ls->linenumber) /* all in the same line? */ in check_match()
137 error_expected(ls, what); /* do not need a complex message */ in check_match()
139 luaX_syntaxerror(ls, luaO_pushfstring(ls->L, in check_match()
141 luaX_token2str(ls, what), luaX_token2str(ls, who), where)); in check_match()
147 static TString *str_checkname (LexState *ls) { in str_checkname() argument
149 check(ls, TK_NAME); in str_checkname()
150 ts = ls->t.seminfo.ts; in str_checkname()
151 luaX_next(ls); in str_checkname()
170 static void codename (LexState *ls, expdesc *e) { in codename() argument
171 codestring(e, str_checkname(ls)); in codename()
179 static int registerlocalvar (LexState *ls, FuncState *fs, TString *varname) { in registerlocalvar() argument
182 luaM_growvector(ls->L, f->locvars, fs->ndebugvars, f->sizelocvars, in registerlocalvar()
188 luaC_objbarrier(ls->L, f, varname); in registerlocalvar()
197 static int new_localvar (LexState *ls, TString *name) { in new_localvar() argument
198 lua_State *L = ls->L; in new_localvar()
199 FuncState *fs = ls->fs; in new_localvar()
200 Dyndata *dyd = ls->dyd; in new_localvar()
212 #define new_localvarliteral(ls,v) \ argument
213 new_localvar(ls, \
214 luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char)) - 1));
224 return &fs->ls->dyd->actvar.arr[fs->firstlocal + vidx]; in getlocalvardesc()
281 static void check_readonly (LexState *ls, expdesc *e) { in check_readonly() argument
282 FuncState *fs = ls->fs; in check_readonly()
286 varname = ls->dyd->actvar.arr[e->u.info].vd.name; in check_readonly()
305 const char *msg = luaO_pushfstring(ls->L, in check_readonly()
307 luaK_semerror(ls, msg); /* error */ in check_readonly()
315 static void adjustlocalvars (LexState *ls, int nvars) { in adjustlocalvars() argument
316 FuncState *fs = ls->fs; in adjustlocalvars()
323 var->vd.pidx = registerlocalvar(ls, fs, var->vd.name); in adjustlocalvars()
333 fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel); in removevars()
360 luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, in allocupvalue()
384 luaC_objbarrier(fs->ls->L, fs->f, name); in newupvalue()
467 static void singlevar (LexState *ls, expdesc *var) { in singlevar() argument
468 TString *varname = str_checkname(ls); in singlevar()
469 FuncState *fs = ls->fs; in singlevar()
473 singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ in singlevar()
486 static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { in adjust_assign() argument
487 FuncState *fs = ls->fs; in adjust_assign()
508 #define enterlevel(ls) luaE_incCstack(ls->L) argument
511 #define leavelevel(ls) ((ls)->L->nCcalls--) argument
518 static l_noret jumpscopeerror (LexState *ls, Labeldesc *gt) { in jumpscopeerror() argument
519 const char *varname = getstr(getlocalvardesc(ls->fs, gt->nactvar)->vd.name); in jumpscopeerror()
521 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line, varname); in jumpscopeerror()
522 luaK_semerror(ls, msg); /* raise the error */ in jumpscopeerror()
531 static void solvegoto (LexState *ls, int g, Labeldesc *label) { in solvegoto() argument
533 Labellist *gl = &ls->dyd->gt; /* list of gotos */ in solvegoto()
537 jumpscopeerror(ls, gt); in solvegoto()
538 luaK_patchlist(ls->fs, gt->pc, label->pc); in solvegoto()
548 static Labeldesc *findlabel (LexState *ls, TString *name) { in findlabel() argument
550 Dyndata *dyd = ls->dyd; in findlabel()
552 for (i = ls->fs->firstlabel; i < dyd->label.n; i++) { in findlabel()
564 static int newlabelentry (LexState *ls, Labellist *l, TString *name, in newlabelentry() argument
567 luaM_growvector(ls->L, l->arr, n, l->size, in newlabelentry()
571 l->arr[n].nactvar = ls->fs->nactvar; in newlabelentry()
579 static int newgotoentry (LexState *ls, TString *name, int line, int pc) { in newgotoentry() argument
580 return newlabelentry(ls, &ls->dyd->gt, name, line, pc); in newgotoentry()
589 static int solvegotos (LexState *ls, Labeldesc *lb) { in solvegotos() argument
590 Labellist *gl = &ls->dyd->gt; in solvegotos()
591 int i = ls->fs->bl->firstgoto; in solvegotos()
596 solvegoto(ls, i, lb); /* will remove 'i' from the list */ in solvegotos()
612 static int createlabel (LexState *ls, TString *name, int line, in createlabel() argument
614 FuncState *fs = ls->fs; in createlabel()
615 Labellist *ll = &ls->dyd->label; in createlabel()
616 int l = newlabelentry(ls, ll, name, line, luaK_getlabel(fs)); in createlabel()
621 if (solvegotos(ls, &ll->arr[l])) { /* need close? */ in createlabel()
634 Labellist *gl = &fs->ls->dyd->gt; in movegotosout()
649 bl->firstlabel = fs->ls->dyd->label.n; in enterblock()
650 bl->firstgoto = fs->ls->dyd->gt.n; in enterblock()
662 static l_noret undefgoto (LexState *ls, Labeldesc *gt) { in undefgoto() argument
664 if (eqstr(gt->name, luaS_newliteral(ls->L, "break"))) { in undefgoto()
666 msg = luaO_pushfstring(ls->L, msg, gt->line); in undefgoto()
670 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); in undefgoto()
672 luaK_semerror(ls, msg); in undefgoto()
678 LexState *ls = fs->ls; in leaveblock() local
684 hasclose = createlabel(ls, luaS_newliteral(ls->L, "break"), 0, 0); in leaveblock()
688 ls->dyd->label.n = bl->firstlabel; /* remove local labels */ in leaveblock()
693 if (bl->firstgoto < ls->dyd->gt.n) /* still pending gotos? */ in leaveblock()
694 undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ in leaveblock()
702 static Proto *addprototype (LexState *ls) { in addprototype() argument
704 lua_State *L = ls->L; in addprototype()
705 FuncState *fs = ls->fs; in addprototype()
726 static void codeclosure (LexState *ls, expdesc *v) { in codeclosure() argument
727 FuncState *fs = ls->fs->prev; in codeclosure()
733 static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { in open_func() argument
735 fs->prev = ls->fs; /* linked list of funcstates */ in open_func()
736 fs->ls = ls; in open_func()
737 ls->fs = fs; in open_func()
750 fs->firstlocal = ls->dyd->actvar.n; in open_func()
751 fs->firstlabel = ls->dyd->label.n; in open_func()
753 f->source = ls->source; in open_func()
754 luaC_objbarrier(ls->L, f, f->source); in open_func()
760 static void close_func (LexState *ls) { in close_func() argument
761 lua_State *L = ls->L; in close_func()
762 FuncState *fs = ls->fs; in close_func()
776 ls->fs = fs->prev; in close_func()
792 static int block_follow (LexState *ls, int withuntil) { in block_follow() argument
793 switch (ls->t.token) { in block_follow()
803 static void statlist (LexState *ls) { in statlist() argument
805 while (!block_follow(ls, 1)) { in statlist()
806 if (ls->t.token == TK_RETURN) { in statlist()
807 statement(ls); in statlist()
810 statement(ls); in statlist()
815 static void fieldsel (LexState *ls, expdesc *v) { in fieldsel() argument
817 FuncState *fs = ls->fs; in fieldsel()
820 luaX_next(ls); /* skip the dot or colon */ in fieldsel()
821 codename(ls, &key); in fieldsel()
826 static void yindex (LexState *ls, expdesc *v) { in yindex() argument
828 luaX_next(ls); /* skip the '[' */ in yindex()
829 expr(ls, v); in yindex()
830 luaK_exp2val(ls->fs, v); in yindex()
831 checknext(ls, ']'); in yindex()
851 static void recfield (LexState *ls, ConsControl *cc) { in recfield() argument
853 FuncState *fs = ls->fs; in recfield()
854 int reg = ls->fs->freereg; in recfield()
856 if (ls->t.token == TK_NAME) { in recfield()
858 codename(ls, &key); in recfield()
861 yindex(ls, &key); in recfield()
863 checknext(ls, '='); in recfield()
866 expr(ls, &val); in recfield()
900 static void listfield (LexState *ls, ConsControl *cc) { in listfield() argument
902 expr(ls, &cc->v); in listfield()
907 static void field (LexState *ls, ConsControl *cc) { in field() argument
909 switch(ls->t.token) { in field()
911 if (luaX_lookahead(ls) != '=') /* expression? */ in field()
912 listfield(ls, cc); in field()
914 recfield(ls, cc); in field()
918 recfield(ls, cc); in field()
922 listfield(ls, cc); in field()
929 static void constructor (LexState *ls, expdesc *t) { in constructor() argument
932 FuncState *fs = ls->fs; in constructor()
933 int line = ls->linenumber; in constructor()
942 checknext(ls, '{'); in constructor()
945 if (ls->t.token == '}') break; in constructor()
947 field(ls, &cc); in constructor()
948 } while (testnext(ls, ',') || testnext(ls, ';')); in constructor()
949 check_match(ls, '}', '{', line); in constructor()
963 static void parlist (LexState *ls) { in parlist() argument
965 FuncState *fs = ls->fs; in parlist()
969 if (ls->t.token != ')') { /* is 'parlist' not empty? */ in parlist()
971 switch (ls->t.token) { in parlist()
973 new_localvar(ls, str_checkname(ls)); in parlist()
978 luaX_next(ls); in parlist()
982 default: luaX_syntaxerror(ls, "<name> or '...' expected"); in parlist()
984 } while (!isvararg && testnext(ls, ',')); in parlist()
986 adjustlocalvars(ls, nparams); in parlist()
994 static void body (LexState *ls, expdesc *e, int ismethod, int line) { in body() argument
998 new_fs.f = addprototype(ls); in body()
1000 open_func(ls, &new_fs, &bl); in body()
1001 checknext(ls, '('); in body()
1003 new_localvarliteral(ls, "self"); /* create 'self' parameter */ in body()
1004 adjustlocalvars(ls, 1); in body()
1006 parlist(ls); in body()
1007 checknext(ls, ')'); in body()
1008 statlist(ls); in body()
1009 new_fs.f->lastlinedefined = ls->linenumber; in body()
1010 check_match(ls, TK_END, TK_FUNCTION, line); in body()
1011 codeclosure(ls, e); in body()
1012 close_func(ls); in body()
1016 static int explist (LexState *ls, expdesc *v) { in explist() argument
1019 expr(ls, v); in explist()
1020 while (testnext(ls, ',')) { in explist()
1021 luaK_exp2nextreg(ls->fs, v); in explist()
1022 expr(ls, v); in explist()
1029 static void funcargs (LexState *ls, expdesc *f, int line) { in funcargs() argument
1030 FuncState *fs = ls->fs; in funcargs()
1033 switch (ls->t.token) { in funcargs()
1035 luaX_next(ls); in funcargs()
1036 if (ls->t.token == ')') /* arg list is empty? */ in funcargs()
1039 explist(ls, &args); in funcargs()
1043 check_match(ls, ')', '(', line); in funcargs()
1047 constructor(ls, &args); in funcargs()
1051 codestring(&args, ls->t.seminfo.ts); in funcargs()
1052 luaX_next(ls); /* must use 'seminfo' before 'next' */ in funcargs()
1056 luaX_syntaxerror(ls, "function arguments expected"); in funcargs()
1084 static void primaryexp (LexState *ls, expdesc *v) { in primaryexp() argument
1086 switch (ls->t.token) { in primaryexp()
1088 int line = ls->linenumber; in primaryexp()
1089 luaX_next(ls); in primaryexp()
1090 expr(ls, v); in primaryexp()
1091 check_match(ls, ')', '(', line); in primaryexp()
1092 luaK_dischargevars(ls->fs, v); in primaryexp()
1096 singlevar(ls, v); in primaryexp()
1100 luaX_syntaxerror(ls, "unexpected symbol"); in primaryexp()
1106 static void suffixedexp (LexState *ls, expdesc *v) { in suffixedexp() argument
1109 FuncState *fs = ls->fs; in suffixedexp()
1110 int line = ls->linenumber; in suffixedexp()
1111 primaryexp(ls, v); in suffixedexp()
1113 switch (ls->t.token) { in suffixedexp()
1115 fieldsel(ls, v); in suffixedexp()
1121 yindex(ls, &key); in suffixedexp()
1127 luaX_next(ls); in suffixedexp()
1128 codename(ls, &key); in suffixedexp()
1130 funcargs(ls, v, line); in suffixedexp()
1135 funcargs(ls, v, line); in suffixedexp()
1144 static void simpleexp (LexState *ls, expdesc *v) { in simpleexp() argument
1147 switch (ls->t.token) { in simpleexp()
1151 v->u.nval = ls->t.seminfo.r; in simpleexp()
1157 v->u.ival = ls->t.seminfo.i; in simpleexp()
1161 codestring(v, ls->t.seminfo.ts); in simpleexp()
1177 FuncState *fs = ls->fs; in simpleexp()
1178 check_condition(ls, fs->f->is_vararg, in simpleexp()
1184 constructor(ls, v); in simpleexp()
1188 luaX_next(ls); in simpleexp()
1189 body(ls, v, 0, ls->linenumber); in simpleexp()
1193 suffixedexp(ls, v); in simpleexp()
1197 luaX_next(ls); in simpleexp()
1274 static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { in subexpr() argument
1277 enterlevel(ls); in subexpr()
1278 uop = getunopr(ls->t.token); in subexpr()
1280 int line = ls->linenumber; in subexpr()
1281 luaX_next(ls); /* skip operator */ in subexpr()
1282 subexpr(ls, v, UNARY_PRIORITY); in subexpr()
1283 luaK_prefix(ls->fs, uop, v, line); in subexpr()
1285 else simpleexp(ls, v); in subexpr()
1287 op = getbinopr(ls->t.token); in subexpr()
1291 int line = ls->linenumber; in subexpr()
1292 luaX_next(ls); /* skip operator */ in subexpr()
1293 luaK_infix(ls->fs, op, v); in subexpr()
1295 nextop = subexpr(ls, &v2, priority[op].right); in subexpr()
1296 luaK_posfix(ls->fs, op, v, &v2, line); in subexpr()
1299 leavelevel(ls); in subexpr()
1304 static void expr (LexState *ls, expdesc *v) { in expr() argument
1305 subexpr(ls, v, 0); in expr()
1319 static void block (LexState *ls) { in block() argument
1321 FuncState *fs = ls->fs; in block()
1324 statlist(ls); in block()
1345 static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { in check_conflict() argument
1346 FuncState *fs = ls->fs; in check_conflict()
1389 static void restassign (LexState *ls, struct LHS_assign *lh, int nvars) { in restassign() argument
1391 check_condition(ls, vkisvar(lh->v.k), "syntax error"); in restassign()
1392 check_readonly(ls, &lh->v); in restassign()
1393 if (testnext(ls, ',')) { /* restassign -> ',' suffixedexp restassign */ in restassign()
1396 suffixedexp(ls, &nv.v); in restassign()
1398 check_conflict(ls, lh, &nv.v); in restassign()
1399 enterlevel(ls); /* control recursion depth */ in restassign()
1400 restassign(ls, &nv, nvars+1); in restassign()
1401 leavelevel(ls); in restassign()
1405 checknext(ls, '='); in restassign()
1406 nexps = explist(ls, &e); in restassign()
1408 adjust_assign(ls, nvars, nexps, &e); in restassign()
1410 luaK_setoneret(ls->fs, &e); /* close last expression */ in restassign()
1411 luaK_storevar(ls->fs, &lh->v, &e); in restassign()
1415 init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ in restassign()
1416 luaK_storevar(ls->fs, &lh->v, &e); in restassign()
1420 static int cond (LexState *ls) { in cond() argument
1423 expr(ls, &v); /* read condition */ in cond()
1425 luaK_goiftrue(ls->fs, &v); in cond()
1430 static void gotostat (LexState *ls) { in gotostat() argument
1431 FuncState *fs = ls->fs; in gotostat()
1432 int line = ls->linenumber; in gotostat()
1433 TString *name = str_checkname(ls); /* label's name */ in gotostat()
1434 Labeldesc *lb = findlabel(ls, name); in gotostat()
1437 newgotoentry(ls, name, line, luaK_jump(fs)); in gotostat()
1452 static void breakstat (LexState *ls) { in breakstat() argument
1453 int line = ls->linenumber; in breakstat()
1454 luaX_next(ls); /* skip break */ in breakstat()
1455 newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, luaK_jump(ls->fs)); in breakstat()
1462 static void checkrepeated (LexState *ls, TString *name) { in checkrepeated() argument
1463 Labeldesc *lb = findlabel(ls, name); in checkrepeated()
1466 msg = luaO_pushfstring(ls->L, msg, getstr(name), lb->line); in checkrepeated()
1467 luaK_semerror(ls, msg); /* error */ in checkrepeated()
1472 static void labelstat (LexState *ls, TString *name, int line) { in labelstat() argument
1474 checknext(ls, TK_DBCOLON); /* skip double colon */ in labelstat()
1475 while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) in labelstat()
1476 statement(ls); /* skip other no-op statements */ in labelstat()
1477 checkrepeated(ls, name); /* check for repeated labels */ in labelstat()
1478 createlabel(ls, name, line, block_follow(ls, 0)); in labelstat()
1482 static void whilestat (LexState *ls, int line) { in whilestat() argument
1484 FuncState *fs = ls->fs; in whilestat()
1488 luaX_next(ls); /* skip WHILE */ in whilestat()
1490 condexit = cond(ls); in whilestat()
1492 checknext(ls, TK_DO); in whilestat()
1493 block(ls); in whilestat()
1495 check_match(ls, TK_END, TK_WHILE, line); in whilestat()
1501 static void repeatstat (LexState *ls, int line) { in repeatstat() argument
1504 FuncState *fs = ls->fs; in repeatstat()
1509 luaX_next(ls); /* skip REPEAT */ in repeatstat()
1510 statlist(ls); in repeatstat()
1511 check_match(ls, TK_UNTIL, TK_REPEAT, line); in repeatstat()
1512 condexit = cond(ls); /* read condition (inside scope block) */ in repeatstat()
1531 static void exp1 (LexState *ls) { in exp1() argument
1533 expr(ls, &e); in exp1()
1534 luaK_exp2nextreg(ls->fs, &e); in exp1()
1550 luaX_syntaxerror(fs->ls, "control structure too long"); in fixforjump()
1558 static void forbody (LexState *ls, int base, int line, int nvars, int isgen) { in forbody() argument
1563 FuncState *fs = ls->fs; in forbody()
1565 checknext(ls, TK_DO); in forbody()
1568 adjustlocalvars(ls, nvars); in forbody()
1570 block(ls); in forbody()
1583 static void fornum (LexState *ls, TString *varname, int line) { in fornum() argument
1585 FuncState *fs = ls->fs; in fornum()
1587 new_localvarliteral(ls, "(for state)"); in fornum()
1588 new_localvarliteral(ls, "(for state)"); in fornum()
1589 new_localvarliteral(ls, "(for state)"); in fornum()
1590 new_localvar(ls, varname); in fornum()
1591 checknext(ls, '='); in fornum()
1592 exp1(ls); /* initial value */ in fornum()
1593 checknext(ls, ','); in fornum()
1594 exp1(ls); /* limit */ in fornum()
1595 if (testnext(ls, ',')) in fornum()
1596 exp1(ls); /* optional step */ in fornum()
1601 adjustlocalvars(ls, 3); /* control variables */ in fornum()
1602 forbody(ls, base, line, 1, 0); in fornum()
1606 static void forlist (LexState *ls, TString *indexname) { in forlist() argument
1608 FuncState *fs = ls->fs; in forlist()
1614 new_localvarliteral(ls, "(for state)"); in forlist()
1615 new_localvarliteral(ls, "(for state)"); in forlist()
1616 new_localvarliteral(ls, "(for state)"); in forlist()
1617 new_localvarliteral(ls, "(for state)"); in forlist()
1619 new_localvar(ls, indexname); in forlist()
1620 while (testnext(ls, ',')) { in forlist()
1621 new_localvar(ls, str_checkname(ls)); in forlist()
1624 checknext(ls, TK_IN); in forlist()
1625 line = ls->linenumber; in forlist()
1626 adjust_assign(ls, 4, explist(ls, &e), &e); in forlist()
1627 adjustlocalvars(ls, 4); /* control variables */ in forlist()
1630 forbody(ls, base, line, nvars - 4, 1); in forlist()
1634 static void forstat (LexState *ls, int line) { in forstat() argument
1636 FuncState *fs = ls->fs; in forstat()
1640 luaX_next(ls); /* skip 'for' */ in forstat()
1641 varname = str_checkname(ls); /* first variable name */ in forstat()
1642 switch (ls->t.token) { in forstat()
1643 case '=': fornum(ls, varname, line); break; in forstat()
1644 case ',': case TK_IN: forlist(ls, varname); break; in forstat()
1645 default: luaX_syntaxerror(ls, "'=' or 'in' expected"); in forstat()
1647 check_match(ls, TK_END, TK_FOR, line); in forstat()
1652 static void test_then_block (LexState *ls, int *escapelist) { in test_then_block() argument
1655 FuncState *fs = ls->fs; in test_then_block()
1658 luaX_next(ls); /* skip IF or ELSEIF */ in test_then_block()
1659 expr(ls, &v); /* read condition */ in test_then_block()
1660 checknext(ls, TK_THEN); in test_then_block()
1661 if (ls->t.token == TK_BREAK) { /* 'if x then break' ? */ in test_then_block()
1662 int line = ls->linenumber; in test_then_block()
1663 luaK_goiffalse(ls->fs, &v); /* will jump if condition is true */ in test_then_block()
1664 luaX_next(ls); /* skip 'break' */ in test_then_block()
1666 newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, v.t); in test_then_block()
1667 while (testnext(ls, ';')) {} /* skip semicolons */ in test_then_block()
1668 if (block_follow(ls, 0)) { /* jump is the entire block? */ in test_then_block()
1676 luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ in test_then_block()
1680 statlist(ls); /* 'then' part */ in test_then_block()
1682 if (ls->t.token == TK_ELSE || in test_then_block()
1683 ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ in test_then_block()
1689 static void ifstat (LexState *ls, int line) { in ifstat() argument
1691 FuncState *fs = ls->fs; in ifstat()
1693 test_then_block(ls, &escapelist); /* IF cond THEN block */ in ifstat()
1694 while (ls->t.token == TK_ELSEIF) in ifstat()
1695 test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ in ifstat()
1696 if (testnext(ls, TK_ELSE)) in ifstat()
1697 block(ls); /* 'else' part */ in ifstat()
1698 check_match(ls, TK_END, TK_IF, line); in ifstat()
1703 static void localfunc (LexState *ls) { in localfunc() argument
1705 FuncState *fs = ls->fs; in localfunc()
1707 new_localvar(ls, str_checkname(ls)); /* new local variable */ in localfunc()
1708 adjustlocalvars(ls, 1); /* enter its scope */ in localfunc()
1709 body(ls, &b, 0, ls->linenumber); /* function created in next register */ in localfunc()
1715 static int getlocalattribute (LexState *ls) { in getlocalattribute() argument
1717 if (testnext(ls, '<')) { in getlocalattribute()
1718 const char *attr = getstr(str_checkname(ls)); in getlocalattribute()
1719 checknext(ls, '>'); in getlocalattribute()
1725 luaK_semerror(ls, in getlocalattribute()
1726 luaO_pushfstring(ls->L, "unknown attribute '%s'", attr)); in getlocalattribute()
1740 static void localstat (LexState *ls) { in localstat() argument
1742 FuncState *fs = ls->fs; in localstat()
1750 vidx = new_localvar(ls, str_checkname(ls)); in localstat()
1751 kind = getlocalattribute(ls); in localstat()
1755 luaK_semerror(ls, "multiple to-be-closed variables in local list"); in localstat()
1759 } while (testnext(ls, ',')); in localstat()
1760 if (testnext(ls, '=')) in localstat()
1761 nexps = explist(ls, &e); in localstat()
1771 adjustlocalvars(ls, nvars - 1); /* exclude last variable */ in localstat()
1775 adjust_assign(ls, nvars, nexps, &e); in localstat()
1776 adjustlocalvars(ls, nvars); in localstat()
1782 static int funcname (LexState *ls, expdesc *v) { in funcname() argument
1785 singlevar(ls, v); in funcname()
1786 while (ls->t.token == '.') in funcname()
1787 fieldsel(ls, v); in funcname()
1788 if (ls->t.token == ':') { in funcname()
1790 fieldsel(ls, v); in funcname()
1796 static void funcstat (LexState *ls, int line) { in funcstat() argument
1800 luaX_next(ls); /* skip FUNCTION */ in funcstat()
1801 ismethod = funcname(ls, &v); in funcstat()
1802 body(ls, &b, ismethod, line); in funcstat()
1803 check_readonly(ls, &v); in funcstat()
1804 luaK_storevar(ls->fs, &v, &b); in funcstat()
1805 luaK_fixline(ls->fs, line); /* definition "happens" in the first line */ in funcstat()
1809 static void exprstat (LexState *ls) { in exprstat() argument
1811 FuncState *fs = ls->fs; in exprstat()
1813 suffixedexp(ls, &v.v); in exprstat()
1814 if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ in exprstat()
1816 restassign(ls, &v, 1); in exprstat()
1820 check_condition(ls, v.v.k == VCALL, "syntax error"); in exprstat()
1827 static void retstat (LexState *ls) { in retstat() argument
1829 FuncState *fs = ls->fs; in retstat()
1833 if (block_follow(ls, 1) || ls->t.token == ';') in retstat()
1836 nret = explist(ls, &e); /* optional return values */ in retstat()
1855 testnext(ls, ';'); /* skip optional semicolon */ in retstat()
1859 static void statement (LexState *ls) { in statement() argument
1860 int line = ls->linenumber; /* may be needed for error messages */ in statement()
1861 enterlevel(ls); in statement()
1862 switch (ls->t.token) { in statement()
1864 luaX_next(ls); /* skip ';' */ in statement()
1868 ifstat(ls, line); in statement()
1872 whilestat(ls, line); in statement()
1876 luaX_next(ls); /* skip DO */ in statement()
1877 block(ls); in statement()
1878 check_match(ls, TK_END, TK_DO, line); in statement()
1882 forstat(ls, line); in statement()
1886 repeatstat(ls, line); in statement()
1890 funcstat(ls, line); in statement()
1894 luaX_next(ls); /* skip LOCAL */ in statement()
1895 if (testnext(ls, TK_FUNCTION)) /* local function? */ in statement()
1896 localfunc(ls); in statement()
1898 localstat(ls); in statement()
1902 luaX_next(ls); /* skip double colon */ in statement()
1903 labelstat(ls, str_checkname(ls), line); in statement()
1907 luaX_next(ls); /* skip RETURN */ in statement()
1908 retstat(ls); in statement()
1912 breakstat(ls); in statement()
1916 luaX_next(ls); /* skip 'goto' */ in statement()
1917 gotostat(ls); in statement()
1921 exprstat(ls); in statement()
1925 lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && in statement()
1926 ls->fs->freereg >= luaY_nvarstack(ls->fs)); in statement()
1927 ls->fs->freereg = luaY_nvarstack(ls->fs); /* free registers */ in statement()
1928 leavelevel(ls); in statement()
1938 static void mainfunc (LexState *ls, FuncState *fs) { in mainfunc() argument
1941 open_func(ls, fs, &bl); in mainfunc()
1947 env->name = ls->envn; in mainfunc()
1948 luaC_objbarrier(ls->L, fs->f, env->name); in mainfunc()
1949 luaX_next(ls); /* read first token */ in mainfunc()
1950 statlist(ls); /* parse main body */ in mainfunc()
1951 check(ls, TK_EOS); in mainfunc()
1952 close_func(ls); in mainfunc()