Lines Matching refs:ls
56 static void statement (LexState *ls);
57 static void expr (LexState *ls, expdesc *v);
60 static void anchor_token (LexState *ls) { in anchor_token() argument
62 lua_assert(ls->fs != NULL || ls->t.token == TK_EOS); in anchor_token()
63 if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) { in anchor_token()
64 TString *ts = ls->t.seminfo.ts; in anchor_token()
65 luaX_newstring(ls, getstr(ts), ts->tsv.len); in anchor_token()
71 static l_noret semerror (LexState *ls, const char *msg) { in semerror() argument
72 ls->t.token = 0; /* remove 'near to' from final message */ in semerror()
73 luaX_syntaxerror(ls, msg); in semerror()
77 static l_noret error_expected (LexState *ls, int token) { in error_expected() argument
78 luaX_syntaxerror(ls, in error_expected()
79 luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token))); in error_expected()
84 lua_State *L = fs->ls->L; in errorlimit()
92 luaX_syntaxerror(fs->ls, msg); in errorlimit()
101 static int testnext (LexState *ls, int c) { in testnext() argument
102 if (ls->t.token == c) { in testnext()
103 luaX_next(ls); in testnext()
110 static void check (LexState *ls, int c) { in check() argument
111 if (ls->t.token != c) in check()
112 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
126 static void check_match (LexState *ls, int what, int who, int where) { in check_match() argument
127 if (!testnext(ls, what)) { in check_match()
128 if (where == ls->linenumber) in check_match()
129 error_expected(ls, what); in check_match()
131 luaX_syntaxerror(ls, luaO_pushfstring(ls->L, in check_match()
133 luaX_token2str(ls, what), luaX_token2str(ls, who), where)); in check_match()
139 static TString *str_checkname (LexState *ls) { in str_checkname() argument
141 check(ls, TK_NAME); in str_checkname()
142 ts = ls->t.seminfo.ts; in str_checkname()
143 luaX_next(ls); in str_checkname()
155 static void codestring (LexState *ls, expdesc *e, TString *s) { in codestring() argument
156 init_exp(e, VK, luaK_stringK(ls->fs, s)); in codestring()
160 static void checkname (LexState *ls, expdesc *e) { in checkname() argument
161 codestring(ls, e, str_checkname(ls)); in checkname()
165 static int registerlocalvar (LexState *ls, TString *varname) { in registerlocalvar() argument
166 FuncState *fs = ls->fs; in registerlocalvar()
169 luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, in registerlocalvar()
173 luaC_objbarrier(ls->L, f, varname); in registerlocalvar()
178 static void new_localvar (LexState *ls, TString *name) { in new_localvar() argument
179 FuncState *fs = ls->fs; in new_localvar()
180 Dyndata *dyd = ls->dyd; in new_localvar()
181 int reg = registerlocalvar(ls, name); in new_localvar()
184 luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1, in new_localvar()
190 static void new_localvarliteral_ (LexState *ls, const char *name, size_t sz) { in new_localvarliteral_() argument
191 new_localvar(ls, luaX_newstring(ls, name, sz)); in new_localvarliteral_()
194 #define new_localvarliteral(ls,v) \ argument
195 new_localvarliteral_(ls, "" v, (sizeof(v)/sizeof(char))-1)
199 int idx = fs->ls->dyd->actvar.arr[fs->firstlocal + i].idx; in getlocvar()
205 static void adjustlocalvars (LexState *ls, int nvars) { in adjustlocalvars() argument
206 FuncState *fs = ls->fs; in adjustlocalvars()
215 fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel); in removevars()
235 luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, in newupvalue()
241 luaC_objbarrier(fs->ls->L, f, name); in newupvalue()
297 static void singlevar (LexState *ls, expdesc *var) { in singlevar() argument
298 TString *varname = str_checkname(ls); in singlevar()
299 FuncState *fs = ls->fs; in singlevar()
302 singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ in singlevar()
304 codestring(ls, &key, varname); /* key is variable name */ in singlevar()
310 static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { in adjust_assign() argument
311 FuncState *fs = ls->fs; in adjust_assign()
330 static void enterlevel (LexState *ls) { in enterlevel() argument
331 lua_State *L = ls->L; in enterlevel()
333 checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, "C levels"); in enterlevel()
337 #define leavelevel(ls) ((ls)->L->nCcalls--) argument
340 static void closegoto (LexState *ls, int g, Labeldesc *label) { in closegoto() argument
342 FuncState *fs = ls->fs; in closegoto()
343 Labellist *gl = &ls->dyd->gt; in closegoto()
348 const char *msg = luaO_pushfstring(ls->L, in closegoto()
351 semerror(ls, msg); in closegoto()
364 static int findlabel (LexState *ls, int g) { in findlabel() argument
366 BlockCnt *bl = ls->fs->bl; in findlabel()
367 Dyndata *dyd = ls->dyd; in findlabel()
375 luaK_patchclose(ls->fs, gt->pc, lb->nactvar); in findlabel()
376 closegoto(ls, g, lb); /* close it */ in findlabel()
384 static int newlabelentry (LexState *ls, Labellist *l, TString *name, in newlabelentry() argument
387 luaM_growvector(ls->L, l->arr, n, l->size, in newlabelentry()
391 l->arr[n].nactvar = ls->fs->nactvar; in newlabelentry()
402 static void findgotos (LexState *ls, Labeldesc *lb) { in findgotos() argument
403 Labellist *gl = &ls->dyd->gt; in findgotos()
404 int i = ls->fs->bl->firstgoto; in findgotos()
407 closegoto(ls, i, lb); in findgotos()
422 Labellist *gl = &fs->ls->dyd->gt; in movegotosout()
432 if (!findlabel(fs->ls, i)) in movegotosout()
441 bl->firstlabel = fs->ls->dyd->label.n; in enterblock()
442 bl->firstgoto = fs->ls->dyd->gt.n; in enterblock()
453 static void breaklabel (LexState *ls) { in breaklabel() argument
454 TString *n = luaS_new(ls->L, "break"); in breaklabel()
455 int l = newlabelentry(ls, &ls->dyd->label, n, 0, ls->fs->pc); in breaklabel()
456 findgotos(ls, &ls->dyd->label.arr[l]); in breaklabel()
463 static l_noret undefgoto (LexState *ls, Labeldesc *gt) { in undefgoto() argument
467 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); in undefgoto()
468 semerror(ls, msg); in undefgoto()
474 LexState *ls = fs->ls; in leaveblock() local
482 breaklabel(ls); /* close pending breaks */ in leaveblock()
487 ls->dyd->label.n = bl->firstlabel; /* remove local labels */ in leaveblock()
490 else if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ in leaveblock()
491 undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ in leaveblock()
498 static Proto *addprototype (LexState *ls) { in addprototype() argument
500 lua_State *L = ls->L; in addprototype()
501 FuncState *fs = ls->fs; in addprototype()
520 static void codeclosure (LexState *ls, expdesc *v) { in codeclosure() argument
521 FuncState *fs = ls->fs->prev; in codeclosure()
527 static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { in open_func() argument
528 lua_State *L = ls->L; in open_func()
530 fs->prev = ls->fs; /* linked list of funcstates */ in open_func()
531 fs->ls = ls; in open_func()
532 ls->fs = fs; in open_func()
542 fs->firstlocal = ls->dyd->actvar.n; in open_func()
545 f->source = ls->source; in open_func()
555 static void close_func (LexState *ls) { in close_func() argument
556 lua_State *L = ls->L; in close_func()
557 FuncState *fs = ls->fs; in close_func()
574 ls->fs = fs->prev; in close_func()
576 anchor_token(ls); in close_func()
593 static int block_follow (LexState *ls, int withuntil) { in block_follow() argument
594 switch (ls->t.token) { in block_follow()
604 static void statlist (LexState *ls) { in statlist() argument
606 while (!block_follow(ls, 1)) { in statlist()
607 if (ls->t.token == TK_RETURN) { in statlist()
608 statement(ls); in statlist()
611 statement(ls); in statlist()
616 static void fieldsel (LexState *ls, expdesc *v) { in fieldsel() argument
618 FuncState *fs = ls->fs; in fieldsel()
621 luaX_next(ls); /* skip the dot or colon */ in fieldsel()
622 checkname(ls, &key); in fieldsel()
627 static void yindex (LexState *ls, expdesc *v) { in yindex() argument
629 luaX_next(ls); /* skip the '[' */ in yindex()
630 expr(ls, v); in yindex()
631 luaK_exp2val(ls->fs, v); in yindex()
632 checknext(ls, ']'); in yindex()
652 static void recfield (LexState *ls, struct ConsControl *cc) { in recfield() argument
654 FuncState *fs = ls->fs; in recfield()
655 int reg = ls->fs->freereg; in recfield()
658 if (ls->t.token == TK_NAME) { in recfield()
660 checkname(ls, &key); in recfield()
663 yindex(ls, &key); in recfield()
665 checknext(ls, '='); in recfield()
667 expr(ls, &val); in recfield()
699 static void listfield (LexState *ls, struct ConsControl *cc) { in listfield() argument
701 expr(ls, &cc->v); in listfield()
702 checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); in listfield()
708 static void field (LexState *ls, struct ConsControl *cc) { in field() argument
710 switch(ls->t.token) { in field()
712 if (luaX_lookahead(ls) != '=') /* expression? */ in field()
713 listfield(ls, cc); in field()
715 recfield(ls, cc); in field()
719 recfield(ls, cc); in field()
723 listfield(ls, cc); in field()
730 static void constructor (LexState *ls, expdesc *t) { in constructor() argument
733 FuncState *fs = ls->fs; in constructor()
734 int line = ls->linenumber; in constructor()
741 luaK_exp2nextreg(ls->fs, t); /* fix it at stack top */ in constructor()
742 checknext(ls, '{'); in constructor()
745 if (ls->t.token == '}') break; in constructor()
747 field(ls, &cc); in constructor()
748 } while (testnext(ls, ',') || testnext(ls, ';')); in constructor()
749 check_match(ls, '}', '{', line); in constructor()
759 static void parlist (LexState *ls) { in parlist() argument
761 FuncState *fs = ls->fs; in parlist()
765 if (ls->t.token != ')') { /* is `parlist' not empty? */ in parlist()
767 switch (ls->t.token) { in parlist()
769 new_localvar(ls, str_checkname(ls)); in parlist()
774 luaX_next(ls); in parlist()
778 default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected"); in parlist()
780 } while (!f->is_vararg && testnext(ls, ',')); in parlist()
782 adjustlocalvars(ls, nparams); in parlist()
788 static void body (LexState *ls, expdesc *e, int ismethod, int line) { in body() argument
792 new_fs.f = addprototype(ls); in body()
794 open_func(ls, &new_fs, &bl); in body()
795 checknext(ls, '('); in body()
797 new_localvarliteral(ls, "self"); /* create 'self' parameter */ in body()
798 adjustlocalvars(ls, 1); in body()
800 parlist(ls); in body()
801 checknext(ls, ')'); in body()
802 statlist(ls); in body()
803 new_fs.f->lastlinedefined = ls->linenumber; in body()
804 check_match(ls, TK_END, TK_FUNCTION, line); in body()
805 codeclosure(ls, e); in body()
806 close_func(ls); in body()
810 static int explist (LexState *ls, expdesc *v) { in explist() argument
813 expr(ls, v); in explist()
814 while (testnext(ls, ',')) { in explist()
815 luaK_exp2nextreg(ls->fs, v); in explist()
816 expr(ls, v); in explist()
823 static void funcargs (LexState *ls, expdesc *f, int line) { in funcargs() argument
824 FuncState *fs = ls->fs; in funcargs()
827 switch (ls->t.token) { in funcargs()
829 luaX_next(ls); in funcargs()
830 if (ls->t.token == ')') /* arg list is empty? */ in funcargs()
833 explist(ls, &args); in funcargs()
836 check_match(ls, ')', '(', line); in funcargs()
840 constructor(ls, &args); in funcargs()
844 codestring(ls, &args, ls->t.seminfo.ts); in funcargs()
845 luaX_next(ls); /* must use `seminfo' before `next' */ in funcargs()
849 luaX_syntaxerror(ls, "function arguments expected"); in funcargs()
877 static void primaryexp (LexState *ls, expdesc *v) { in primaryexp() argument
879 switch (ls->t.token) { in primaryexp()
881 int line = ls->linenumber; in primaryexp()
882 luaX_next(ls); in primaryexp()
883 expr(ls, v); in primaryexp()
884 check_match(ls, ')', '(', line); in primaryexp()
885 luaK_dischargevars(ls->fs, v); in primaryexp()
889 singlevar(ls, v); in primaryexp()
893 luaX_syntaxerror(ls, "unexpected symbol"); in primaryexp()
899 static void suffixedexp (LexState *ls, expdesc *v) { in suffixedexp() argument
902 FuncState *fs = ls->fs; in suffixedexp()
903 int line = ls->linenumber; in suffixedexp()
904 primaryexp(ls, v); in suffixedexp()
906 switch (ls->t.token) { in suffixedexp()
908 fieldsel(ls, v); in suffixedexp()
914 yindex(ls, &key); in suffixedexp()
920 luaX_next(ls); in suffixedexp()
921 checkname(ls, &key); in suffixedexp()
923 funcargs(ls, v, line); in suffixedexp()
928 funcargs(ls, v, line); in suffixedexp()
937 static void simpleexp (LexState *ls, expdesc *v) { in simpleexp() argument
940 switch (ls->t.token) { in simpleexp()
943 v->u.nval = ls->t.seminfo.r; in simpleexp()
947 codestring(ls, v, ls->t.seminfo.ts); in simpleexp()
963 FuncState *fs = ls->fs; in simpleexp()
964 check_condition(ls, fs->f->is_vararg, in simpleexp()
970 constructor(ls, v); in simpleexp()
974 luaX_next(ls); in simpleexp()
975 body(ls, v, 0, ls->linenumber); in simpleexp()
979 suffixedexp(ls, v); in simpleexp()
983 luaX_next(ls); in simpleexp()
1037 static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { in subexpr() argument
1040 enterlevel(ls); in subexpr()
1041 uop = getunopr(ls->t.token); in subexpr()
1043 int line = ls->linenumber; in subexpr()
1044 luaX_next(ls); in subexpr()
1045 subexpr(ls, v, UNARY_PRIORITY); in subexpr()
1046 luaK_prefix(ls->fs, uop, v, line); in subexpr()
1048 else simpleexp(ls, v); in subexpr()
1050 op = getbinopr(ls->t.token); in subexpr()
1054 int line = ls->linenumber; in subexpr()
1055 luaX_next(ls); in subexpr()
1056 luaK_infix(ls->fs, op, v); in subexpr()
1058 nextop = subexpr(ls, &v2, priority[op].right); in subexpr()
1059 luaK_posfix(ls->fs, op, v, &v2, line); in subexpr()
1062 leavelevel(ls); in subexpr()
1067 static void expr (LexState *ls, expdesc *v) { in expr() argument
1068 subexpr(ls, v, 0); in expr()
1082 static void block (LexState *ls) { in block() argument
1084 FuncState *fs = ls->fs; in block()
1087 statlist(ls); in block()
1108 static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { in check_conflict() argument
1109 FuncState *fs = ls->fs; in check_conflict()
1136 static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { in assignment() argument
1138 check_condition(ls, vkisvar(lh->v.k), "syntax error"); in assignment()
1139 if (testnext(ls, ',')) { /* assignment -> ',' suffixedexp assignment */ in assignment()
1142 suffixedexp(ls, &nv.v); in assignment()
1144 check_conflict(ls, lh, &nv.v); in assignment()
1145 checklimit(ls->fs, nvars + ls->L->nCcalls, LUAI_MAXCCALLS, in assignment()
1147 assignment(ls, &nv, nvars+1); in assignment()
1151 checknext(ls, '='); in assignment()
1152 nexps = explist(ls, &e); in assignment()
1154 adjust_assign(ls, nvars, nexps, &e); in assignment()
1156 ls->fs->freereg -= nexps - nvars; /* remove extra values */ in assignment()
1159 luaK_setoneret(ls->fs, &e); /* close last expression */ in assignment()
1160 luaK_storevar(ls->fs, &lh->v, &e); in assignment()
1164 init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ in assignment()
1165 luaK_storevar(ls->fs, &lh->v, &e); in assignment()
1169 static int cond (LexState *ls) { in cond() argument
1172 expr(ls, &v); /* read condition */ in cond()
1174 luaK_goiftrue(ls->fs, &v); in cond()
1179 static void gotostat (LexState *ls, int pc) { in gotostat() argument
1180 int line = ls->linenumber; in gotostat()
1183 if (testnext(ls, TK_GOTO)) in gotostat()
1184 label = str_checkname(ls); in gotostat()
1186 luaX_next(ls); /* skip break */ in gotostat()
1187 label = luaS_new(ls->L, "break"); in gotostat()
1189 g = newlabelentry(ls, &ls->dyd->gt, label, line, pc); in gotostat()
1190 findlabel(ls, g); /* close it if label already defined */ in gotostat()
1199 const char *msg = luaO_pushfstring(fs->ls->L, in checkrepeated()
1202 semerror(fs->ls, msg); in checkrepeated()
1209 static void skipnoopstat (LexState *ls) { in skipnoopstat() argument
1210 while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) in skipnoopstat()
1211 statement(ls); in skipnoopstat()
1215 static void labelstat (LexState *ls, TString *label, int line) { in labelstat() argument
1217 FuncState *fs = ls->fs; in labelstat()
1218 Labellist *ll = &ls->dyd->label; in labelstat()
1221 checknext(ls, TK_DBCOLON); /* skip double colon */ in labelstat()
1223 l = newlabelentry(ls, ll, label, line, fs->pc); in labelstat()
1224 skipnoopstat(ls); /* skip other no-op statements */ in labelstat()
1225 if (block_follow(ls, 0)) { /* label is last no-op statement in the block? */ in labelstat()
1229 findgotos(ls, &ll->arr[l]); in labelstat()
1233 static void whilestat (LexState *ls, int line) { in whilestat() argument
1235 FuncState *fs = ls->fs; in whilestat()
1239 luaX_next(ls); /* skip WHILE */ in whilestat()
1241 condexit = cond(ls); in whilestat()
1243 checknext(ls, TK_DO); in whilestat()
1244 block(ls); in whilestat()
1246 check_match(ls, TK_END, TK_WHILE, line); in whilestat()
1252 static void repeatstat (LexState *ls, int line) { in repeatstat() argument
1255 FuncState *fs = ls->fs; in repeatstat()
1260 luaX_next(ls); /* skip REPEAT */ in repeatstat()
1261 statlist(ls); in repeatstat()
1262 check_match(ls, TK_UNTIL, TK_REPEAT, line); in repeatstat()
1263 condexit = cond(ls); /* read condition (inside scope block) */ in repeatstat()
1272 static int exp1 (LexState *ls) { in exp1() argument
1275 expr(ls, &e); in exp1()
1276 luaK_exp2nextreg(ls->fs, &e); in exp1()
1283 static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { in forbody() argument
1286 FuncState *fs = ls->fs; in forbody()
1288 adjustlocalvars(ls, 3); /* control variables */ in forbody()
1289 checknext(ls, TK_DO); in forbody()
1292 adjustlocalvars(ls, nvars); in forbody()
1294 block(ls); in forbody()
1309 static void fornum (LexState *ls, TString *varname, int line) { in fornum() argument
1311 FuncState *fs = ls->fs; in fornum()
1313 new_localvarliteral(ls, "(for index)"); in fornum()
1314 new_localvarliteral(ls, "(for limit)"); in fornum()
1315 new_localvarliteral(ls, "(for step)"); in fornum()
1316 new_localvar(ls, varname); in fornum()
1317 checknext(ls, '='); in fornum()
1318 exp1(ls); /* initial value */ in fornum()
1319 checknext(ls, ','); in fornum()
1320 exp1(ls); /* limit */ in fornum()
1321 if (testnext(ls, ',')) in fornum()
1322 exp1(ls); /* optional step */ in fornum()
1327 forbody(ls, base, line, 1, 1); in fornum()
1331 static void forlist (LexState *ls, TString *indexname) { in forlist() argument
1333 FuncState *fs = ls->fs; in forlist()
1339 new_localvarliteral(ls, "(for generator)"); in forlist()
1340 new_localvarliteral(ls, "(for state)"); in forlist()
1341 new_localvarliteral(ls, "(for control)"); in forlist()
1343 new_localvar(ls, indexname); in forlist()
1344 while (testnext(ls, ',')) { in forlist()
1345 new_localvar(ls, str_checkname(ls)); in forlist()
1348 checknext(ls, TK_IN); in forlist()
1349 line = ls->linenumber; in forlist()
1350 adjust_assign(ls, 3, explist(ls, &e), &e); in forlist()
1352 forbody(ls, base, line, nvars - 3, 0); in forlist()
1356 static void forstat (LexState *ls, int line) { in forstat() argument
1358 FuncState *fs = ls->fs; in forstat()
1362 luaX_next(ls); /* skip `for' */ in forstat()
1363 varname = str_checkname(ls); /* first variable name */ in forstat()
1364 switch (ls->t.token) { in forstat()
1365 case '=': fornum(ls, varname, line); break; in forstat()
1366 case ',': case TK_IN: forlist(ls, varname); break; in forstat()
1367 default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected"); in forstat()
1369 check_match(ls, TK_END, TK_FOR, line); in forstat()
1374 static void test_then_block (LexState *ls, int *escapelist) { in test_then_block() argument
1377 FuncState *fs = ls->fs; in test_then_block()
1380 luaX_next(ls); /* skip IF or ELSEIF */ in test_then_block()
1381 expr(ls, &v); /* read condition */ in test_then_block()
1382 checknext(ls, TK_THEN); in test_then_block()
1383 if (ls->t.token == TK_GOTO || ls->t.token == TK_BREAK) { in test_then_block()
1384 luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */ in test_then_block()
1386 gotostat(ls, v.t); /* handle goto/break */ in test_then_block()
1387 skipnoopstat(ls); /* skip other no-op statements */ in test_then_block()
1388 if (block_follow(ls, 0)) { /* 'goto' is the entire block? */ in test_then_block()
1396 luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ in test_then_block()
1400 statlist(ls); /* `then' part */ in test_then_block()
1402 if (ls->t.token == TK_ELSE || in test_then_block()
1403 ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ in test_then_block()
1409 static void ifstat (LexState *ls, int line) { in ifstat() argument
1411 FuncState *fs = ls->fs; in ifstat()
1413 test_then_block(ls, &escapelist); /* IF cond THEN block */ in ifstat()
1414 while (ls->t.token == TK_ELSEIF) in ifstat()
1415 test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ in ifstat()
1416 if (testnext(ls, TK_ELSE)) in ifstat()
1417 block(ls); /* `else' part */ in ifstat()
1418 check_match(ls, TK_END, TK_IF, line); in ifstat()
1423 static void localfunc (LexState *ls) { in localfunc() argument
1425 FuncState *fs = ls->fs; in localfunc()
1426 new_localvar(ls, str_checkname(ls)); /* new local variable */ in localfunc()
1427 adjustlocalvars(ls, 1); /* enter its scope */ in localfunc()
1428 body(ls, &b, 0, ls->linenumber); /* function created in next register */ in localfunc()
1434 static void localstat (LexState *ls) { in localstat() argument
1440 new_localvar(ls, str_checkname(ls)); in localstat()
1442 } while (testnext(ls, ',')); in localstat()
1443 if (testnext(ls, '=')) in localstat()
1444 nexps = explist(ls, &e); in localstat()
1449 adjust_assign(ls, nvars, nexps, &e); in localstat()
1450 adjustlocalvars(ls, nvars); in localstat()
1454 static int funcname (LexState *ls, expdesc *v) { in funcname() argument
1457 singlevar(ls, v); in funcname()
1458 while (ls->t.token == '.') in funcname()
1459 fieldsel(ls, v); in funcname()
1460 if (ls->t.token == ':') { in funcname()
1462 fieldsel(ls, v); in funcname()
1468 static void funcstat (LexState *ls, int line) { in funcstat() argument
1472 luaX_next(ls); /* skip FUNCTION */ in funcstat()
1473 ismethod = funcname(ls, &v); in funcstat()
1474 body(ls, &b, ismethod, line); in funcstat()
1475 luaK_storevar(ls->fs, &v, &b); in funcstat()
1476 luaK_fixline(ls->fs, line); /* definition `happens' in the first line */ in funcstat()
1480 static void exprstat (LexState *ls) { in exprstat() argument
1482 FuncState *fs = ls->fs; in exprstat()
1484 suffixedexp(ls, &v.v); in exprstat()
1485 if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ in exprstat()
1487 assignment(ls, &v, 1); in exprstat()
1490 check_condition(ls, v.v.k == VCALL, "syntax error"); in exprstat()
1496 static void retstat (LexState *ls) { in retstat() argument
1498 FuncState *fs = ls->fs; in retstat()
1501 if (block_follow(ls, 1) || ls->t.token == ';') in retstat()
1504 nret = explist(ls, &e); /* optional return values */ in retstat()
1525 testnext(ls, ';'); /* skip optional semicolon */ in retstat()
1529 static void statement (LexState *ls) { in statement() argument
1530 int line = ls->linenumber; /* may be needed for error messages */ in statement()
1531 enterlevel(ls); in statement()
1532 switch (ls->t.token) { in statement()
1534 luaX_next(ls); /* skip ';' */ in statement()
1538 ifstat(ls, line); in statement()
1542 whilestat(ls, line); in statement()
1546 luaX_next(ls); /* skip DO */ in statement()
1547 block(ls); in statement()
1548 check_match(ls, TK_END, TK_DO, line); in statement()
1552 forstat(ls, line); in statement()
1556 repeatstat(ls, line); in statement()
1560 funcstat(ls, line); in statement()
1564 luaX_next(ls); /* skip LOCAL */ in statement()
1565 if (testnext(ls, TK_FUNCTION)) /* local function? */ in statement()
1566 localfunc(ls); in statement()
1568 localstat(ls); in statement()
1572 luaX_next(ls); /* skip double colon */ in statement()
1573 labelstat(ls, str_checkname(ls), line); in statement()
1577 luaX_next(ls); /* skip RETURN */ in statement()
1578 retstat(ls); in statement()
1583 gotostat(ls, luaK_jump(ls->fs)); in statement()
1587 exprstat(ls); in statement()
1591 lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && in statement()
1592 ls->fs->freereg >= ls->fs->nactvar); in statement()
1593 ls->fs->freereg = ls->fs->nactvar; /* free registers */ in statement()
1594 leavelevel(ls); in statement()
1604 static void mainfunc (LexState *ls, FuncState *fs) { in mainfunc() argument
1607 open_func(ls, fs, &bl); in mainfunc()
1610 newupvalue(fs, ls->envn, &v); /* ...set environment upvalue */ in mainfunc()
1611 luaX_next(ls); /* read first token */ in mainfunc()
1612 statlist(ls); /* parse main body */ in mainfunc()
1613 check(ls, TK_EOS); in mainfunc()
1614 close_func(ls); in mainfunc()