Lines Matching refs:ls
55 static void statement (LexState *ls);
56 static void expr (LexState *ls, expdesc *v);
59 static void anchor_token (LexState *ls) { in anchor_token() argument
61 lua_assert(ls->fs != NULL || ls->t.token == TK_EOS); in anchor_token()
62 if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) { in anchor_token()
63 TString *ts = ls->t.seminfo.ts; in anchor_token()
64 luaX_newstring(ls, getstr(ts), ts->tsv.len); in anchor_token()
70 static l_noret semerror (LexState *ls, const char *msg) { in semerror() argument
71 ls->t.token = 0; /* remove 'near to' from final message */ in semerror()
72 luaX_syntaxerror(ls, msg); in semerror()
76 static l_noret error_expected (LexState *ls, int token) { in error_expected() argument
77 luaX_syntaxerror(ls, in error_expected()
78 luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token))); in error_expected()
83 lua_State *L = fs->ls->L; in errorlimit()
91 luaX_syntaxerror(fs->ls, msg); in errorlimit()
100 static int testnext (LexState *ls, int c) { in testnext() argument
101 if (ls->t.token == c) { in testnext()
102 luaX_next(ls); in testnext()
109 static void check (LexState *ls, int c) { in check() argument
110 if (ls->t.token != c) in check()
111 error_expected(ls, c); in check()
115 static void checknext (LexState *ls, int c) { in checknext() argument
116 check(ls, c); in checknext()
117 luaX_next(ls); in checknext()
121 #define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } argument
125 static void check_match (LexState *ls, int what, int who, int where) { in check_match() argument
126 if (!testnext(ls, what)) { in check_match()
127 if (where == ls->linenumber) in check_match()
128 error_expected(ls, what); in check_match()
130 luaX_syntaxerror(ls, luaO_pushfstring(ls->L, in check_match()
132 luaX_token2str(ls, what), luaX_token2str(ls, who), where)); in check_match()
138 static TString *str_checkname (LexState *ls) { in str_checkname() argument
140 check(ls, TK_NAME); in str_checkname()
141 ts = ls->t.seminfo.ts; in str_checkname()
142 luaX_next(ls); in str_checkname()
154 static void codestring (LexState *ls, expdesc *e, TString *s) { in codestring() argument
155 init_exp(e, VK, luaK_stringK(ls->fs, s)); in codestring()
159 static void checkname (LexState *ls, expdesc *e) { in checkname() argument
160 codestring(ls, e, str_checkname(ls)); in checkname()
164 static int registerlocalvar (LexState *ls, TString *varname) { in registerlocalvar() argument
165 FuncState *fs = ls->fs; in registerlocalvar()
168 luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, in registerlocalvar()
172 luaC_objbarrier(ls->L, f, varname); in registerlocalvar()
177 static void new_localvar (LexState *ls, TString *name) { in new_localvar() argument
178 FuncState *fs = ls->fs; in new_localvar()
179 Dyndata *dyd = ls->dyd; in new_localvar()
180 int reg = registerlocalvar(ls, name); in new_localvar()
183 luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1, in new_localvar()
189 static void new_localvarliteral_ (LexState *ls, const char *name, size_t sz) { in new_localvarliteral_() argument
190 new_localvar(ls, luaX_newstring(ls, name, sz)); in new_localvarliteral_()
193 #define new_localvarliteral(ls,v) \ argument
194 new_localvarliteral_(ls, "" v, (sizeof(v)/sizeof(char))-1)
198 int idx = fs->ls->dyd->actvar.arr[fs->firstlocal + i].idx; in getlocvar()
204 static void adjustlocalvars (LexState *ls, int nvars) { in adjustlocalvars() argument
205 FuncState *fs = ls->fs; in adjustlocalvars()
214 fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel); in removevars()
234 luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, in newupvalue()
240 luaC_objbarrier(fs->ls->L, f, name); in newupvalue()
296 static void singlevar (LexState *ls, expdesc *var) { in singlevar() argument
297 TString *varname = str_checkname(ls); in singlevar()
298 FuncState *fs = ls->fs; in singlevar()
301 singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ in singlevar()
303 codestring(ls, &key, varname); /* key is variable name */ in singlevar()
309 static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { in adjust_assign() argument
310 FuncState *fs = ls->fs; in adjust_assign()
329 static void enterlevel (LexState *ls) { in enterlevel() argument
330 lua_State *L = ls->L; in enterlevel()
332 checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, "C levels"); in enterlevel()
336 #define leavelevel(ls) ((ls)->L->nCcalls--) argument
339 static void closegoto (LexState *ls, int g, Labeldesc *label) { in closegoto() argument
341 FuncState *fs = ls->fs; in closegoto()
342 Labellist *gl = &ls->dyd->gt; in closegoto()
347 const char *msg = luaO_pushfstring(ls->L, in closegoto()
350 semerror(ls, msg); in closegoto()
363 static int findlabel (LexState *ls, int g) { in findlabel() argument
365 BlockCnt *bl = ls->fs->bl; in findlabel()
366 Dyndata *dyd = ls->dyd; in findlabel()
374 luaK_patchclose(ls->fs, gt->pc, lb->nactvar); in findlabel()
375 closegoto(ls, g, lb); /* close it */ in findlabel()
383 static int newlabelentry (LexState *ls, Labellist *l, TString *name, in newlabelentry() argument
386 luaM_growvector(ls->L, l->arr, n, l->size, in newlabelentry()
390 l->arr[n].nactvar = ls->fs->nactvar; in newlabelentry()
401 static void findgotos (LexState *ls, Labeldesc *lb) { in findgotos() argument
402 Labellist *gl = &ls->dyd->gt; in findgotos()
403 int i = ls->fs->bl->firstgoto; in findgotos()
406 closegoto(ls, i, lb); in findgotos()
421 Labellist *gl = &fs->ls->dyd->gt; in movegotosout()
431 if (!findlabel(fs->ls, i)) in movegotosout()
440 bl->firstlabel = fs->ls->dyd->label.n; in enterblock()
441 bl->firstgoto = fs->ls->dyd->gt.n; in enterblock()
452 static void breaklabel (LexState *ls) { in breaklabel() argument
453 TString *n = luaS_new(ls->L, "break"); in breaklabel()
454 int l = newlabelentry(ls, &ls->dyd->label, n, 0, ls->fs->pc); in breaklabel()
455 findgotos(ls, &ls->dyd->label.arr[l]); in breaklabel()
462 static l_noret undefgoto (LexState *ls, Labeldesc *gt) { in undefgoto() argument
466 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); in undefgoto()
467 semerror(ls, msg); in undefgoto()
473 LexState *ls = fs->ls; in leaveblock() local
481 breaklabel(ls); /* close pending breaks */ in leaveblock()
486 ls->dyd->label.n = bl->firstlabel; /* remove local labels */ in leaveblock()
489 else if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ in leaveblock()
490 undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ in leaveblock()
497 static Proto *addprototype (LexState *ls) { in addprototype() argument
499 lua_State *L = ls->L; in addprototype()
500 FuncState *fs = ls->fs; in addprototype()
519 static void codeclosure (LexState *ls, expdesc *v) { in codeclosure() argument
520 FuncState *fs = ls->fs->prev; in codeclosure()
526 static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { in open_func() argument
527 lua_State *L = ls->L; in open_func()
529 fs->prev = ls->fs; /* linked list of funcstates */ in open_func()
530 fs->ls = ls; in open_func()
531 ls->fs = fs; in open_func()
541 fs->firstlocal = ls->dyd->actvar.n; in open_func()
544 f->source = ls->source; in open_func()
554 static void close_func (LexState *ls) { in close_func() argument
555 lua_State *L = ls->L; in close_func()
556 FuncState *fs = ls->fs; in close_func()
573 ls->fs = fs->prev; in close_func()
575 anchor_token(ls); in close_func()
592 static int block_follow (LexState *ls, int withuntil) { in block_follow() argument
593 switch (ls->t.token) { in block_follow()
603 static void statlist (LexState *ls) { in statlist() argument
605 while (!block_follow(ls, 1)) { in statlist()
606 if (ls->t.token == TK_RETURN) { in statlist()
607 statement(ls); in statlist()
610 statement(ls); in statlist()
615 static void fieldsel (LexState *ls, expdesc *v) { in fieldsel() argument
617 FuncState *fs = ls->fs; in fieldsel()
620 luaX_next(ls); /* skip the dot or colon */ in fieldsel()
621 checkname(ls, &key); in fieldsel()
626 static void yindex (LexState *ls, expdesc *v) { in yindex() argument
628 luaX_next(ls); /* skip the '[' */ in yindex()
629 expr(ls, v); in yindex()
630 luaK_exp2val(ls->fs, v); in yindex()
631 checknext(ls, ']'); in yindex()
651 static void recfield (LexState *ls, struct ConsControl *cc) { in recfield() argument
653 FuncState *fs = ls->fs; in recfield()
654 int reg = ls->fs->freereg; in recfield()
657 if (ls->t.token == TK_NAME) { in recfield()
659 checkname(ls, &key); in recfield()
662 yindex(ls, &key); in recfield()
664 checknext(ls, '='); in recfield()
666 expr(ls, &val); in recfield()
698 static void listfield (LexState *ls, struct ConsControl *cc) { in listfield() argument
700 expr(ls, &cc->v); in listfield()
701 checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); in listfield()
707 static void field (LexState *ls, struct ConsControl *cc) { in field() argument
709 switch(ls->t.token) { in field()
711 if (luaX_lookahead(ls) != '=') /* expression? */ in field()
712 listfield(ls, cc); in field()
714 recfield(ls, cc); in field()
718 recfield(ls, cc); in field()
722 listfield(ls, cc); in field()
729 static void constructor (LexState *ls, expdesc *t) { in constructor() argument
732 FuncState *fs = ls->fs; in constructor()
733 int line = ls->linenumber; in constructor()
740 luaK_exp2nextreg(ls->fs, t); /* fix it at stack top */ in constructor()
741 checknext(ls, '{'); in constructor()
744 if (ls->t.token == '}') break; in constructor()
746 field(ls, &cc); in constructor()
747 } while (testnext(ls, ',') || testnext(ls, ';')); in constructor()
748 check_match(ls, '}', '{', line); in constructor()
758 static void parlist (LexState *ls) { in parlist() argument
760 FuncState *fs = ls->fs; in parlist()
764 if (ls->t.token != ')') { /* is `parlist' not empty? */ in parlist()
766 switch (ls->t.token) { in parlist()
768 new_localvar(ls, str_checkname(ls)); in parlist()
773 luaX_next(ls); in parlist()
777 default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected"); in parlist()
779 } while (!f->is_vararg && testnext(ls, ',')); in parlist()
781 adjustlocalvars(ls, nparams); in parlist()
787 static void body (LexState *ls, expdesc *e, int ismethod, int line) { in body() argument
791 new_fs.f = addprototype(ls); in body()
793 open_func(ls, &new_fs, &bl); in body()
794 checknext(ls, '('); in body()
796 new_localvarliteral(ls, "self"); /* create 'self' parameter */ in body()
797 adjustlocalvars(ls, 1); in body()
799 parlist(ls); in body()
800 checknext(ls, ')'); in body()
801 statlist(ls); in body()
802 new_fs.f->lastlinedefined = ls->linenumber; in body()
803 check_match(ls, TK_END, TK_FUNCTION, line); in body()
804 codeclosure(ls, e); in body()
805 close_func(ls); in body()
809 static int explist (LexState *ls, expdesc *v) { in explist() argument
812 expr(ls, v); in explist()
813 while (testnext(ls, ',')) { in explist()
814 luaK_exp2nextreg(ls->fs, v); in explist()
815 expr(ls, v); in explist()
822 static void funcargs (LexState *ls, expdesc *f, int line) { in funcargs() argument
823 FuncState *fs = ls->fs; in funcargs()
826 switch (ls->t.token) { in funcargs()
828 luaX_next(ls); in funcargs()
829 if (ls->t.token == ')') /* arg list is empty? */ in funcargs()
832 explist(ls, &args); in funcargs()
835 check_match(ls, ')', '(', line); in funcargs()
839 constructor(ls, &args); in funcargs()
843 codestring(ls, &args, ls->t.seminfo.ts); in funcargs()
844 luaX_next(ls); /* must use `seminfo' before `next' */ in funcargs()
848 luaX_syntaxerror(ls, "function arguments expected"); in funcargs()
876 static void primaryexp (LexState *ls, expdesc *v) { in primaryexp() argument
878 switch (ls->t.token) { in primaryexp()
880 int line = ls->linenumber; in primaryexp()
881 luaX_next(ls); in primaryexp()
882 expr(ls, v); in primaryexp()
883 check_match(ls, ')', '(', line); in primaryexp()
884 luaK_dischargevars(ls->fs, v); in primaryexp()
888 singlevar(ls, v); in primaryexp()
892 luaX_syntaxerror(ls, "unexpected symbol"); in primaryexp()
898 static void suffixedexp (LexState *ls, expdesc *v) { in suffixedexp() argument
901 FuncState *fs = ls->fs; in suffixedexp()
902 int line = ls->linenumber; in suffixedexp()
903 primaryexp(ls, v); in suffixedexp()
905 switch (ls->t.token) { in suffixedexp()
907 fieldsel(ls, v); in suffixedexp()
913 yindex(ls, &key); in suffixedexp()
919 luaX_next(ls); in suffixedexp()
920 checkname(ls, &key); in suffixedexp()
922 funcargs(ls, v, line); in suffixedexp()
927 funcargs(ls, v, line); in suffixedexp()
936 static void simpleexp (LexState *ls, expdesc *v) { in simpleexp() argument
939 switch (ls->t.token) { in simpleexp()
942 v->u.nval = ls->t.seminfo.r; in simpleexp()
946 codestring(ls, v, ls->t.seminfo.ts); in simpleexp()
962 FuncState *fs = ls->fs; in simpleexp()
963 check_condition(ls, fs->f->is_vararg, in simpleexp()
969 constructor(ls, v); in simpleexp()
973 luaX_next(ls); in simpleexp()
974 body(ls, v, 0, ls->linenumber); in simpleexp()
978 suffixedexp(ls, v); in simpleexp()
982 luaX_next(ls); in simpleexp()
1036 static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { in subexpr() argument
1039 enterlevel(ls); in subexpr()
1040 uop = getunopr(ls->t.token); in subexpr()
1042 int line = ls->linenumber; in subexpr()
1043 luaX_next(ls); in subexpr()
1044 subexpr(ls, v, UNARY_PRIORITY); in subexpr()
1045 luaK_prefix(ls->fs, uop, v, line); in subexpr()
1047 else simpleexp(ls, v); in subexpr()
1049 op = getbinopr(ls->t.token); in subexpr()
1053 int line = ls->linenumber; in subexpr()
1054 luaX_next(ls); in subexpr()
1055 luaK_infix(ls->fs, op, v); in subexpr()
1057 nextop = subexpr(ls, &v2, priority[op].right); in subexpr()
1058 luaK_posfix(ls->fs, op, v, &v2, line); in subexpr()
1061 leavelevel(ls); in subexpr()
1066 static void expr (LexState *ls, expdesc *v) { in expr() argument
1067 subexpr(ls, v, 0); in expr()
1081 static void block (LexState *ls) { in block() argument
1083 FuncState *fs = ls->fs; in block()
1086 statlist(ls); in block()
1107 static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { in check_conflict() argument
1108 FuncState *fs = ls->fs; in check_conflict()
1135 static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { in assignment() argument
1137 check_condition(ls, vkisvar(lh->v.k), "syntax error"); in assignment()
1138 if (testnext(ls, ',')) { /* assignment -> ',' suffixedexp assignment */ in assignment()
1141 suffixedexp(ls, &nv.v); in assignment()
1143 check_conflict(ls, lh, &nv.v); in assignment()
1144 checklimit(ls->fs, nvars + ls->L->nCcalls, LUAI_MAXCCALLS, in assignment()
1146 assignment(ls, &nv, nvars+1); in assignment()
1150 checknext(ls, '='); in assignment()
1151 nexps = explist(ls, &e); in assignment()
1153 adjust_assign(ls, nvars, nexps, &e); in assignment()
1155 ls->fs->freereg -= nexps - nvars; /* remove extra values */ in assignment()
1158 luaK_setoneret(ls->fs, &e); /* close last expression */ in assignment()
1159 luaK_storevar(ls->fs, &lh->v, &e); in assignment()
1163 init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ in assignment()
1164 luaK_storevar(ls->fs, &lh->v, &e); in assignment()
1168 static int cond (LexState *ls) { in cond() argument
1171 expr(ls, &v); /* read condition */ in cond()
1173 luaK_goiftrue(ls->fs, &v); in cond()
1178 static void gotostat (LexState *ls, int pc) { in gotostat() argument
1179 int line = ls->linenumber; in gotostat()
1182 if (testnext(ls, TK_GOTO)) in gotostat()
1183 label = str_checkname(ls); in gotostat()
1185 luaX_next(ls); /* skip break */ in gotostat()
1186 label = luaS_new(ls->L, "break"); in gotostat()
1188 g = newlabelentry(ls, &ls->dyd->gt, label, line, pc); in gotostat()
1189 findlabel(ls, g); /* close it if label already defined */ in gotostat()
1198 const char *msg = luaO_pushfstring(fs->ls->L, in checkrepeated()
1201 semerror(fs->ls, msg); in checkrepeated()
1208 static void skipnoopstat (LexState *ls) { in skipnoopstat() argument
1209 while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) in skipnoopstat()
1210 statement(ls); in skipnoopstat()
1214 static void labelstat (LexState *ls, TString *label, int line) { in labelstat() argument
1216 FuncState *fs = ls->fs; in labelstat()
1217 Labellist *ll = &ls->dyd->label; in labelstat()
1220 checknext(ls, TK_DBCOLON); /* skip double colon */ in labelstat()
1222 l = newlabelentry(ls, ll, label, line, fs->pc); in labelstat()
1223 skipnoopstat(ls); /* skip other no-op statements */ in labelstat()
1224 if (block_follow(ls, 0)) { /* label is last no-op statement in the block? */ in labelstat()
1228 findgotos(ls, &ll->arr[l]); in labelstat()
1232 static void whilestat (LexState *ls, int line) { in whilestat() argument
1234 FuncState *fs = ls->fs; in whilestat()
1238 luaX_next(ls); /* skip WHILE */ in whilestat()
1240 condexit = cond(ls); in whilestat()
1242 checknext(ls, TK_DO); in whilestat()
1243 block(ls); in whilestat()
1245 check_match(ls, TK_END, TK_WHILE, line); in whilestat()
1251 static void repeatstat (LexState *ls, int line) { in repeatstat() argument
1254 FuncState *fs = ls->fs; in repeatstat()
1259 luaX_next(ls); /* skip REPEAT */ in repeatstat()
1260 statlist(ls); in repeatstat()
1261 check_match(ls, TK_UNTIL, TK_REPEAT, line); in repeatstat()
1262 condexit = cond(ls); /* read condition (inside scope block) */ in repeatstat()
1271 static int exp1 (LexState *ls) { in exp1() argument
1274 expr(ls, &e); in exp1()
1275 luaK_exp2nextreg(ls->fs, &e); in exp1()
1282 static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { in forbody() argument
1285 FuncState *fs = ls->fs; in forbody()
1287 adjustlocalvars(ls, 3); /* control variables */ in forbody()
1288 checknext(ls, TK_DO); in forbody()
1291 adjustlocalvars(ls, nvars); in forbody()
1293 block(ls); in forbody()
1308 static void fornum (LexState *ls, TString *varname, int line) { in fornum() argument
1310 FuncState *fs = ls->fs; in fornum()
1312 new_localvarliteral(ls, "(for index)"); in fornum()
1313 new_localvarliteral(ls, "(for limit)"); in fornum()
1314 new_localvarliteral(ls, "(for step)"); in fornum()
1315 new_localvar(ls, varname); in fornum()
1316 checknext(ls, '='); in fornum()
1317 exp1(ls); /* initial value */ in fornum()
1318 checknext(ls, ','); in fornum()
1319 exp1(ls); /* limit */ in fornum()
1320 if (testnext(ls, ',')) in fornum()
1321 exp1(ls); /* optional step */ in fornum()
1326 forbody(ls, base, line, 1, 1); in fornum()
1330 static void forlist (LexState *ls, TString *indexname) { in forlist() argument
1332 FuncState *fs = ls->fs; in forlist()
1338 new_localvarliteral(ls, "(for generator)"); in forlist()
1339 new_localvarliteral(ls, "(for state)"); in forlist()
1340 new_localvarliteral(ls, "(for control)"); in forlist()
1342 new_localvar(ls, indexname); in forlist()
1343 while (testnext(ls, ',')) { in forlist()
1344 new_localvar(ls, str_checkname(ls)); in forlist()
1347 checknext(ls, TK_IN); in forlist()
1348 line = ls->linenumber; in forlist()
1349 adjust_assign(ls, 3, explist(ls, &e), &e); in forlist()
1351 forbody(ls, base, line, nvars - 3, 0); in forlist()
1355 static void forstat (LexState *ls, int line) { in forstat() argument
1357 FuncState *fs = ls->fs; in forstat()
1361 luaX_next(ls); /* skip `for' */ in forstat()
1362 varname = str_checkname(ls); /* first variable name */ in forstat()
1363 switch (ls->t.token) { in forstat()
1364 case '=': fornum(ls, varname, line); break; in forstat()
1365 case ',': case TK_IN: forlist(ls, varname); break; in forstat()
1366 default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected"); in forstat()
1368 check_match(ls, TK_END, TK_FOR, line); in forstat()
1373 static void test_then_block (LexState *ls, int *escapelist) { in test_then_block() argument
1376 FuncState *fs = ls->fs; in test_then_block()
1379 luaX_next(ls); /* skip IF or ELSEIF */ in test_then_block()
1380 expr(ls, &v); /* read condition */ in test_then_block()
1381 checknext(ls, TK_THEN); in test_then_block()
1382 if (ls->t.token == TK_GOTO || ls->t.token == TK_BREAK) { in test_then_block()
1383 luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */ in test_then_block()
1385 gotostat(ls, v.t); /* handle goto/break */ in test_then_block()
1386 skipnoopstat(ls); /* skip other no-op statements */ in test_then_block()
1387 if (block_follow(ls, 0)) { /* 'goto' is the entire block? */ in test_then_block()
1395 luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ in test_then_block()
1399 statlist(ls); /* `then' part */ in test_then_block()
1401 if (ls->t.token == TK_ELSE || in test_then_block()
1402 ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ in test_then_block()
1408 static void ifstat (LexState *ls, int line) { in ifstat() argument
1410 FuncState *fs = ls->fs; in ifstat()
1412 test_then_block(ls, &escapelist); /* IF cond THEN block */ in ifstat()
1413 while (ls->t.token == TK_ELSEIF) in ifstat()
1414 test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ in ifstat()
1415 if (testnext(ls, TK_ELSE)) in ifstat()
1416 block(ls); /* `else' part */ in ifstat()
1417 check_match(ls, TK_END, TK_IF, line); in ifstat()
1422 static void localfunc (LexState *ls) { in localfunc() argument
1424 FuncState *fs = ls->fs; in localfunc()
1425 new_localvar(ls, str_checkname(ls)); /* new local variable */ in localfunc()
1426 adjustlocalvars(ls, 1); /* enter its scope */ in localfunc()
1427 body(ls, &b, 0, ls->linenumber); /* function created in next register */ in localfunc()
1433 static void localstat (LexState *ls) { in localstat() argument
1439 new_localvar(ls, str_checkname(ls)); in localstat()
1441 } while (testnext(ls, ',')); in localstat()
1442 if (testnext(ls, '=')) in localstat()
1443 nexps = explist(ls, &e); in localstat()
1448 adjust_assign(ls, nvars, nexps, &e); in localstat()
1449 adjustlocalvars(ls, nvars); in localstat()
1453 static int funcname (LexState *ls, expdesc *v) { in funcname() argument
1456 singlevar(ls, v); in funcname()
1457 while (ls->t.token == '.') in funcname()
1458 fieldsel(ls, v); in funcname()
1459 if (ls->t.token == ':') { in funcname()
1461 fieldsel(ls, v); in funcname()
1467 static void funcstat (LexState *ls, int line) { in funcstat() argument
1471 luaX_next(ls); /* skip FUNCTION */ in funcstat()
1472 ismethod = funcname(ls, &v); in funcstat()
1473 body(ls, &b, ismethod, line); in funcstat()
1474 luaK_storevar(ls->fs, &v, &b); in funcstat()
1475 luaK_fixline(ls->fs, line); /* definition `happens' in the first line */ in funcstat()
1479 static void exprstat (LexState *ls) { in exprstat() argument
1481 FuncState *fs = ls->fs; in exprstat()
1483 suffixedexp(ls, &v.v); in exprstat()
1484 if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ in exprstat()
1486 assignment(ls, &v, 1); in exprstat()
1489 check_condition(ls, v.v.k == VCALL, "syntax error"); in exprstat()
1495 static void retstat (LexState *ls) { in retstat() argument
1497 FuncState *fs = ls->fs; in retstat()
1500 if (block_follow(ls, 1) || ls->t.token == ';') in retstat()
1503 nret = explist(ls, &e); /* optional return values */ in retstat()
1524 testnext(ls, ';'); /* skip optional semicolon */ in retstat()
1528 static void statement (LexState *ls) { in statement() argument
1529 int line = ls->linenumber; /* may be needed for error messages */ in statement()
1530 enterlevel(ls); in statement()
1531 switch (ls->t.token) { in statement()
1533 luaX_next(ls); /* skip ';' */ in statement()
1537 ifstat(ls, line); in statement()
1541 whilestat(ls, line); in statement()
1545 luaX_next(ls); /* skip DO */ in statement()
1546 block(ls); in statement()
1547 check_match(ls, TK_END, TK_DO, line); in statement()
1551 forstat(ls, line); in statement()
1555 repeatstat(ls, line); in statement()
1559 funcstat(ls, line); in statement()
1563 luaX_next(ls); /* skip LOCAL */ in statement()
1564 if (testnext(ls, TK_FUNCTION)) /* local function? */ in statement()
1565 localfunc(ls); in statement()
1567 localstat(ls); in statement()
1571 luaX_next(ls); /* skip double colon */ in statement()
1572 labelstat(ls, str_checkname(ls), line); in statement()
1576 luaX_next(ls); /* skip RETURN */ in statement()
1577 retstat(ls); in statement()
1582 gotostat(ls, luaK_jump(ls->fs)); in statement()
1586 exprstat(ls); in statement()
1590 lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && in statement()
1591 ls->fs->freereg >= ls->fs->nactvar); in statement()
1592 ls->fs->freereg = ls->fs->nactvar; /* free registers */ in statement()
1593 leavelevel(ls); in statement()
1603 static void mainfunc (LexState *ls, FuncState *fs) { in mainfunc() argument
1606 open_func(ls, fs, &bl); in mainfunc()
1609 newupvalue(fs, ls->envn, &v); /* ...set environment upvalue */ in mainfunc()
1610 luaX_next(ls); /* read first token */ in mainfunc()
1611 statlist(ls); /* parse main body */ in mainfunc()
1612 check(ls, TK_EOS); in mainfunc()
1613 close_func(ls); in mainfunc()