Lines Matching full:ls

53 static void statement (LexState *ls);
54 static void expr (LexState *ls, expdesc *v);
57 static void anchor_token (LexState *ls) { in anchor_token() argument
59 lua_assert(ls->fs != NULL || ls->t.token == TK_EOS); in anchor_token()
60 if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) { in anchor_token()
61 TString *ts = ls->t.seminfo.ts; in anchor_token()
62 luaX_newstring(ls, getstr(ts), ts->tsv.len); in anchor_token()
68 static l_noret semerror (LexState *ls, const char *msg) { in semerror() argument
69 ls->t.token = 0; /* remove 'near to' from final message */ in semerror()
70 luaX_syntaxerror(ls, msg); in semerror()
74 static l_noret error_expected (LexState *ls, int token) { in error_expected() argument
75 luaX_syntaxerror(ls, in error_expected()
76 luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token))); in error_expected()
81 lua_State *L = fs->ls->L; in errorlimit()
89 luaX_syntaxerror(fs->ls, msg); in errorlimit()
98 static int testnext (LexState *ls, int c) { in testnext() argument
99 if (ls->t.token == c) { in testnext()
100 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()
113 static void checknext (LexState *ls, int c) { in checknext() argument
114 check(ls, c); in checknext()
115 luaX_next(ls); in checknext()
119 #define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } argument
123 static void check_match (LexState *ls, int what, int who, int where) { in check_match() argument
124 if (!testnext(ls, what)) { in check_match()
125 if (where == ls->linenumber) in check_match()
126 error_expected(ls, what); in check_match()
128 luaX_syntaxerror(ls, luaO_pushfstring(ls->L, in check_match()
130 luaX_token2str(ls, what), luaX_token2str(ls, who), where)); in check_match()
136 static TString *str_checkname (LexState *ls) { in str_checkname() argument
138 check(ls, TK_NAME); in str_checkname()
139 ts = ls->t.seminfo.ts; in str_checkname()
140 luaX_next(ls); in str_checkname()
152 static void codestring (LexState *ls, expdesc *e, TString *s) { in codestring() argument
153 init_exp(e, VK, luaK_stringK(ls->fs, s)); in codestring()
157 static void checkname (LexState *ls, expdesc *e) { in checkname() argument
158 codestring(ls, e, str_checkname(ls)); in checkname()
162 static int registerlocalvar (LexState *ls, TString *varname) { in registerlocalvar() argument
163 FuncState *fs = ls->fs; in registerlocalvar()
166 luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, in registerlocalvar()
170 luaC_objbarrier(ls->L, f, varname); in registerlocalvar()
175 static void new_localvar (LexState *ls, TString *name) { in new_localvar() argument
176 FuncState *fs = ls->fs; in new_localvar()
177 Dyndata *dyd = ls->dyd; in new_localvar()
178 int reg = registerlocalvar(ls, name); in new_localvar()
181 luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1, in new_localvar()
187 static void new_localvarliteral_ (LexState *ls, const char *name, size_t sz) { in new_localvarliteral_() argument
188 new_localvar(ls, luaX_newstring(ls, name, sz)); in new_localvarliteral_()
191 #define new_localvarliteral(ls,v) \ argument
192 new_localvarliteral_(ls, "" v, (sizeof(v)/sizeof(char))-1)
196 int idx = fs->ls->dyd->actvar.arr[fs->firstlocal + i].idx; in getlocvar()
202 static void adjustlocalvars (LexState *ls, int nvars) { in adjustlocalvars() argument
203 FuncState *fs = ls->fs; in adjustlocalvars()
212 fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel); in removevars()
232 luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, in newupvalue()
238 luaC_objbarrier(fs->ls->L, f, name); in newupvalue()
294 static void singlevar (LexState *ls, expdesc *var) { in singlevar() argument
295 TString *varname = str_checkname(ls); in singlevar()
296 FuncState *fs = ls->fs; in singlevar()
299 singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ in singlevar()
301 codestring(ls, &key, varname); /* key is variable name */ in singlevar()
307 static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { in adjust_assign() argument
308 FuncState *fs = ls->fs; in adjust_assign()
327 static void enterlevel (LexState *ls) { in enterlevel() argument
328 lua_State *L = ls->L; in enterlevel()
330 checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, "C levels"); in enterlevel()
334 #define leavelevel(ls) ((ls)->L->nCcalls--) argument
337 static void closegoto (LexState *ls, int g, Labeldesc *label) { in closegoto() argument
339 FuncState *fs = ls->fs; in closegoto()
340 Labellist *gl = &ls->dyd->gt; in closegoto()
345 const char *msg = luaO_pushfstring(ls->L, in closegoto()
348 semerror(ls, msg); in closegoto()
361 static int findlabel (LexState *ls, int g) { in findlabel() argument
363 BlockCnt *bl = ls->fs->bl; in findlabel()
364 Dyndata *dyd = ls->dyd; in findlabel()
372 luaK_patchclose(ls->fs, gt->pc, lb->nactvar); in findlabel()
373 closegoto(ls, g, lb); /* close it */ in findlabel()
381 static int newlabelentry (LexState *ls, Labellist *l, TString *name, in newlabelentry() argument
384 luaM_growvector(ls->L, l->arr, n, l->size, in newlabelentry()
388 l->arr[n].nactvar = ls->fs->nactvar; in newlabelentry()
399 static void findgotos (LexState *ls, Labeldesc *lb) { in findgotos() argument
400 Labellist *gl = &ls->dyd->gt; in findgotos()
401 int i = ls->fs->bl->firstgoto; in findgotos()
404 closegoto(ls, i, lb); in findgotos()
419 Labellist *gl = &fs->ls->dyd->gt; in movegotosout()
429 if (!findlabel(fs->ls, i)) in movegotosout()
438 bl->firstlabel = fs->ls->dyd->label.n; in enterblock()
439 bl->firstgoto = fs->ls->dyd->gt.n; in enterblock()
450 static void breaklabel (LexState *ls) { in breaklabel() argument
451 TString *n = luaS_new(ls->L, "break"); in breaklabel()
452 int l = newlabelentry(ls, &ls->dyd->label, n, 0, ls->fs->pc); in breaklabel()
453 findgotos(ls, &ls->dyd->label.arr[l]); in breaklabel()
460 static l_noret undefgoto (LexState *ls, Labeldesc *gt) { in undefgoto() argument
464 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); in undefgoto()
465 semerror(ls, msg); in undefgoto()
471 LexState *ls = fs->ls; in leaveblock() local
479 breaklabel(ls); /* close pending breaks */ in leaveblock()
484 ls->dyd->label.n = bl->firstlabel; /* remove local labels */ in leaveblock()
487 else if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ in leaveblock()
488 undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ in leaveblock()
495 static Proto *addprototype (LexState *ls) { in addprototype() argument
497 lua_State *L = ls->L; in addprototype()
498 FuncState *fs = ls->fs; in addprototype()
517 static void codeclosure (LexState *ls, expdesc *v) { in codeclosure() argument
518 FuncState *fs = ls->fs->prev; in codeclosure()
524 static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { in open_func() argument
525 lua_State *L = ls->L; in open_func()
527 fs->prev = ls->fs; /* linked list of funcstates */ in open_func()
528 fs->ls = ls; in open_func()
529 ls->fs = fs; in open_func()
539 fs->firstlocal = ls->dyd->actvar.n; in open_func()
542 f->source = ls->source; in open_func()
552 static void close_func (LexState *ls) { in close_func() argument
553 lua_State *L = ls->L; in close_func()
554 FuncState *fs = ls->fs; in close_func()
571 ls->fs = fs->prev; in close_func()
573 anchor_token(ls); in close_func()
590 static int block_follow (LexState *ls, int withuntil) { in block_follow() argument
591 switch (ls->t.token) { in block_follow()
607 static void statlist (LexState *ls) { in statlist() argument
609 while (!block_follow(ls, 1)) { in statlist()
610 if (ls->t.token == TK_RETURN) { in statlist()
611 statement(ls); in statlist()
614 statement(ls); in statlist()
619 static void fieldsel (LexState *ls, expdesc *v) { in fieldsel() argument
621 FuncState *fs = ls->fs; in fieldsel()
624 luaX_next(ls); /* skip the dot or colon */ in fieldsel()
625 checkname(ls, &key); in fieldsel()
630 static void yindex (LexState *ls, expdesc *v) { in yindex() argument
632 luaX_next(ls); /* skip the '[' */ in yindex()
633 expr(ls, v); in yindex()
634 luaK_exp2val(ls->fs, v); in yindex()
635 checknext(ls, ']'); in yindex()
655 static void recfield (LexState *ls, struct ConsControl *cc) { in recfield() argument
657 FuncState *fs = ls->fs; in recfield()
658 int reg = ls->fs->freereg; in recfield()
661 if (ls->t.token == TK_NAME) { in recfield()
663 checkname(ls, &key); in recfield()
665 else /* ls->t.token == '[' */ in recfield()
666 yindex(ls, &key); in recfield()
668 checknext(ls, '='); in recfield()
670 expr(ls, &val); in recfield()
702 static void listfield (LexState *ls, struct ConsControl *cc) { in listfield() argument
704 expr(ls, &cc->v); in listfield()
705 checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); in listfield()
711 static void field (LexState *ls, struct ConsControl *cc) { in field() argument
713 switch(ls->t.token) { in field()
715 if (luaX_lookahead(ls) != '=') /* expression? */ in field()
716 listfield(ls, cc); in field()
718 recfield(ls, cc); in field()
722 recfield(ls, cc); in field()
726 listfield(ls, cc); in field()
733 static void constructor (LexState *ls, expdesc *t) { in constructor() argument
736 FuncState *fs = ls->fs; in constructor()
737 int line = ls->linenumber; in constructor()
744 luaK_exp2nextreg(ls->fs, t); /* fix it at stack top */ in constructor()
745 checknext(ls, '{'); in constructor()
748 if (ls->t.token == '}') break; in constructor()
750 field(ls, &cc); in constructor()
751 } while (testnext(ls, ',') || testnext(ls, ';')); in constructor()
752 check_match(ls, '}', '{', line); in constructor()
762 static void parlist (LexState *ls) { in parlist() argument
764 FuncState *fs = ls->fs; in parlist()
768 if (ls->t.token != ')') { /* is `parlist' not empty? */ in parlist()
770 switch (ls->t.token) { in parlist()
772 new_localvar(ls, str_checkname(ls)); in parlist()
777 luaX_next(ls); in parlist()
781 default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected"); in parlist()
783 } while (!f->is_vararg && testnext(ls, ',')); in parlist()
785 adjustlocalvars(ls, nparams); in parlist()
791 static void body (LexState *ls, expdesc *e, int ismethod, int line) { in body() argument
795 new_fs.f = addprototype(ls); in body()
797 open_func(ls, &new_fs, &bl); in body()
798 checknext(ls, '('); in body()
800 new_localvarliteral(ls, "self"); /* create 'self' parameter */ in body()
801 adjustlocalvars(ls, 1); in body()
803 parlist(ls); in body()
804 checknext(ls, ')'); in body()
805 statlist(ls); in body()
806 new_fs.f->lastlinedefined = ls->linenumber; in body()
807 check_match(ls, TK_END, TK_FUNCTION, line); in body()
808 codeclosure(ls, e); in body()
809 close_func(ls); in body()
813 static int explist (LexState *ls, expdesc *v) { in explist() argument
816 expr(ls, v); in explist()
817 while (testnext(ls, ',')) { in explist()
818 luaK_exp2nextreg(ls->fs, v); in explist()
819 expr(ls, v); in explist()
826 static void funcargs (LexState *ls, expdesc *f, int line) { in funcargs() argument
827 FuncState *fs = ls->fs; in funcargs()
830 switch (ls->t.token) { in funcargs()
832 luaX_next(ls); in funcargs()
833 if (ls->t.token == ')') /* arg list is empty? */ in funcargs()
836 explist(ls, &args); in funcargs()
839 check_match(ls, ')', '(', line); in funcargs()
843 constructor(ls, &args); in funcargs()
847 codestring(ls, &args, ls->t.seminfo.ts); in funcargs()
848 luaX_next(ls); /* must use `seminfo' before `next' */ in funcargs()
852 luaX_syntaxerror(ls, "function arguments expected"); in funcargs()
880 static void primaryexp (LexState *ls, expdesc *v) { in primaryexp() argument
882 switch (ls->t.token) { in primaryexp()
884 int line = ls->linenumber; in primaryexp()
885 luaX_next(ls); in primaryexp()
886 expr(ls, v); in primaryexp()
887 check_match(ls, ')', '(', line); in primaryexp()
888 luaK_dischargevars(ls->fs, v); in primaryexp()
892 singlevar(ls, v); in primaryexp()
896 luaX_syntaxerror(ls, "unexpected symbol"); in primaryexp()
902 static void suffixedexp (LexState *ls, expdesc *v) { in suffixedexp() argument
905 FuncState *fs = ls->fs; in suffixedexp()
906 int line = ls->linenumber; in suffixedexp()
907 primaryexp(ls, v); in suffixedexp()
909 switch (ls->t.token) { in suffixedexp()
911 fieldsel(ls, v); in suffixedexp()
917 yindex(ls, &key); in suffixedexp()
923 luaX_next(ls); in suffixedexp()
924 checkname(ls, &key); in suffixedexp()
926 funcargs(ls, v, line); in suffixedexp()
931 funcargs(ls, v, line); in suffixedexp()
940 static void simpleexp (LexState *ls, expdesc *v) { in simpleexp() argument
943 switch (ls->t.token) { in simpleexp()
946 v->u.nval = ls->t.seminfo.r; in simpleexp()
950 codestring(ls, v, ls->t.seminfo.ts); in simpleexp()
966 FuncState *fs = ls->fs; in simpleexp()
967 check_condition(ls, fs->f->is_vararg, in simpleexp()
973 constructor(ls, v); in simpleexp()
977 luaX_next(ls); in simpleexp()
978 body(ls, v, 0, ls->linenumber); in simpleexp()
982 suffixedexp(ls, v); in simpleexp()
986 luaX_next(ls); in simpleexp()
1040 static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { in subexpr() argument
1043 enterlevel(ls); in subexpr()
1044 uop = getunopr(ls->t.token); in subexpr()
1046 int line = ls->linenumber; in subexpr()
1047 luaX_next(ls); in subexpr()
1048 subexpr(ls, v, UNARY_PRIORITY); in subexpr()
1049 luaK_prefix(ls->fs, uop, v, line); in subexpr()
1051 else simpleexp(ls, v); in subexpr()
1053 op = getbinopr(ls->t.token); in subexpr()
1057 int line = ls->linenumber; in subexpr()
1058 luaX_next(ls); in subexpr()
1059 luaK_infix(ls->fs, op, v); in subexpr()
1061 nextop = subexpr(ls, &v2, priority[op].right); in subexpr()
1062 luaK_posfix(ls->fs, op, v, &v2, line); in subexpr()
1065 leavelevel(ls); in subexpr()
1070 static void expr (LexState *ls, expdesc *v) { in expr() argument
1071 subexpr(ls, v, 0); in expr()
1085 static void block (LexState *ls) { in block() argument
1087 FuncState *fs = ls->fs; in block()
1090 statlist(ls); in block()
1111 static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { in check_conflict() argument
1112 FuncState *fs = ls->fs; in check_conflict()
1139 static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { in assignment() argument
1141 check_condition(ls, vkisvar(lh->v.k), "syntax error"); in assignment()
1142 if (testnext(ls, ',')) { /* assignment -> ',' suffixedexp assignment */ in assignment()
1145 suffixedexp(ls, &nv.v); in assignment()
1147 check_conflict(ls, lh, &nv.v); in assignment()
1148 checklimit(ls->fs, nvars + ls->L->nCcalls, LUAI_MAXCCALLS, in assignment()
1150 assignment(ls, &nv, nvars+1); in assignment()
1154 checknext(ls, '='); in assignment()
1155 nexps = explist(ls, &e); in assignment()
1157 adjust_assign(ls, nvars, nexps, &e); in assignment()
1159 ls->fs->freereg -= nexps - nvars; /* remove extra values */ in assignment()
1162 luaK_setoneret(ls->fs, &e); /* close last expression */ in assignment()
1163 luaK_storevar(ls->fs, &lh->v, &e); in assignment()
1167 init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ in assignment()
1168 luaK_storevar(ls->fs, &lh->v, &e); in assignment()
1172 static int cond (LexState *ls) { in cond() argument
1175 expr(ls, &v); /* read condition */ in cond()
1177 luaK_goiftrue(ls->fs, &v); in cond()
1182 static void gotostat (LexState *ls, int pc) { in gotostat() argument
1183 int line = ls->linenumber; in gotostat()
1186 if (testnext(ls, TK_GOTO)) in gotostat()
1187 label = str_checkname(ls); in gotostat()
1189 luaX_next(ls); /* skip break */ in gotostat()
1190 label = luaS_new(ls->L, "break"); in gotostat()
1192 g = newlabelentry(ls, &ls->dyd->gt, label, line, pc); in gotostat()
1193 findlabel(ls, g); /* close it if label already defined */ in gotostat()
1202 const char *msg = luaO_pushfstring(fs->ls->L, in checkrepeated()
1205 semerror(fs->ls, msg); in checkrepeated()
1212 static void skipnoopstat (LexState *ls) { in skipnoopstat() argument
1213 while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) in skipnoopstat()
1214 statement(ls); in skipnoopstat()
1218 static void labelstat (LexState *ls, TString *label, int line) { in labelstat() argument
1220 FuncState *fs = ls->fs; in labelstat()
1221 Labellist *ll = &ls->dyd->label; in labelstat()
1224 checknext(ls, TK_DBCOLON); /* skip double colon */ in labelstat()
1226 l = newlabelentry(ls, ll, label, line, fs->pc); in labelstat()
1227 skipnoopstat(ls); /* skip other no-op statements */ in labelstat()
1228 if (block_follow(ls, 0)) { /* label is last no-op statement in the block? */ in labelstat()
1232 findgotos(ls, &ll->arr[l]); in labelstat()
1236 static void whilestat (LexState *ls, int line) { in whilestat() argument
1238 FuncState *fs = ls->fs; in whilestat()
1242 luaX_next(ls); /* skip WHILE */ in whilestat()
1244 condexit = cond(ls); in whilestat()
1246 checknext(ls, TK_DO); in whilestat()
1247 block(ls); in whilestat()
1249 check_match(ls, TK_END, TK_WHILE, line); in whilestat()
1255 static void repeatstat (LexState *ls, int line) { in repeatstat() argument
1258 FuncState *fs = ls->fs; in repeatstat()
1263 luaX_next(ls); /* skip REPEAT */ in repeatstat()
1264 statlist(ls); in repeatstat()
1265 check_match(ls, TK_UNTIL, TK_REPEAT, line); in repeatstat()
1266 condexit = cond(ls); /* read condition (inside scope block) */ in repeatstat()
1275 static int exp1 (LexState *ls) { in exp1() argument
1278 expr(ls, &e); in exp1()
1279 luaK_exp2nextreg(ls->fs, &e); in exp1()
1286 static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { in forbody() argument
1289 FuncState *fs = ls->fs; in forbody()
1291 adjustlocalvars(ls, 3); /* control variables */ in forbody()
1292 checknext(ls, TK_DO); in forbody()
1295 adjustlocalvars(ls, nvars); in forbody()
1297 block(ls); in forbody()
1312 static void fornum (LexState *ls, TString *varname, int line) { in fornum() argument
1314 FuncState *fs = ls->fs; in fornum()
1316 new_localvarliteral(ls, "(for index)"); in fornum()
1317 new_localvarliteral(ls, "(for limit)"); in fornum()
1318 new_localvarliteral(ls, "(for step)"); in fornum()
1319 new_localvar(ls, varname); in fornum()
1320 checknext(ls, '='); in fornum()
1321 exp1(ls); /* initial value */ in fornum()
1322 checknext(ls, ','); in fornum()
1323 exp1(ls); /* limit */ in fornum()
1324 if (testnext(ls, ',')) in fornum()
1325 exp1(ls); /* optional step */ in fornum()
1330 forbody(ls, base, line, 1, 1); in fornum()
1334 static void forlist (LexState *ls, TString *indexname) { in forlist() argument
1336 FuncState *fs = ls->fs; in forlist()
1342 new_localvarliteral(ls, "(for generator)"); in forlist()
1343 new_localvarliteral(ls, "(for state)"); in forlist()
1344 new_localvarliteral(ls, "(for control)"); in forlist()
1346 new_localvar(ls, indexname); in forlist()
1347 while (testnext(ls, ',')) { in forlist()
1348 new_localvar(ls, str_checkname(ls)); in forlist()
1351 checknext(ls, TK_IN); in forlist()
1352 line = ls->linenumber; in forlist()
1353 adjust_assign(ls, 3, explist(ls, &e), &e); in forlist()
1355 forbody(ls, base, line, nvars - 3, 0); in forlist()
1359 static void forstat (LexState *ls, int line) { in forstat() argument
1361 FuncState *fs = ls->fs; in forstat()
1365 luaX_next(ls); /* skip `for' */ in forstat()
1366 varname = str_checkname(ls); /* first variable name */ in forstat()
1367 switch (ls->t.token) { in forstat()
1368 case '=': fornum(ls, varname, line); break; in forstat()
1369 case ',': case TK_IN: forlist(ls, varname); break; in forstat()
1370 default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected"); in forstat()
1372 check_match(ls, TK_END, TK_FOR, line); in forstat()
1378 static void test_then_block (LexState *ls, int *escapelist) { in test_then_block() argument
1381 FuncState *fs = ls->fs; in test_then_block()
1384 luaX_next(ls); /* skip IF or ELSEIF */ in test_then_block()
1385 expr(ls, &v); /* read condition */ in test_then_block()
1386 checknext(ls, TK_THEN); in test_then_block()
1387 if (ls->t.token == TK_GOTO || ls->t.token == TK_BREAK) { in test_then_block()
1388 luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */ in test_then_block()
1390 gotostat(ls, v.t); /* handle goto/break */ in test_then_block()
1391 skipnoopstat(ls); /* skip other no-op statements */ in test_then_block()
1392 if (block_follow(ls, 0)) { /* 'goto' is the entire block? */ in test_then_block()
1400 luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ in test_then_block()
1404 statlist(ls); /* `then' part */ in test_then_block()
1406 if (ls->t.token == TK_ELSE || in test_then_block()
1407 ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ in test_then_block()
1413 static void ifstat (LexState *ls, int line) { in ifstat() argument
1415 FuncState *fs = ls->fs; in ifstat()
1417 test_then_block(ls, &escapelist); /* IF cond THEN block */ in ifstat()
1418 while (ls->t.token == TK_ELSEIF) in ifstat()
1419 test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ in ifstat()
1420 if (testnext(ls, TK_ELSE)) in ifstat()
1421 block(ls); /* `else' part */ in ifstat()
1422 check_match(ls, TK_END, TK_IF, line); in ifstat()
1427 static void localfunc (LexState *ls) { in localfunc() argument
1429 FuncState *fs = ls->fs; in localfunc()
1430 new_localvar(ls, str_checkname(ls)); /* new local variable */ in localfunc()
1431 adjustlocalvars(ls, 1); /* enter its scope */ in localfunc()
1432 body(ls, &b, 0, ls->linenumber); /* function created in next register */ in localfunc()
1438 static void localstat (LexState *ls) { in localstat() argument
1444 new_localvar(ls, str_checkname(ls)); in localstat()
1446 } while (testnext(ls, ',')); in localstat()
1447 if (testnext(ls, '=')) in localstat()
1448 nexps = explist(ls, &e); in localstat()
1453 adjust_assign(ls, nvars, nexps, &e); in localstat()
1454 adjustlocalvars(ls, nvars); in localstat()
1458 static int funcname (LexState *ls, expdesc *v) { in funcname() argument
1461 singlevar(ls, v); in funcname()
1462 while (ls->t.token == '.') in funcname()
1463 fieldsel(ls, v); in funcname()
1464 if (ls->t.token == ':') { in funcname()
1466 fieldsel(ls, v); in funcname()
1472 static void funcstat (LexState *ls, int line) { in funcstat() argument
1476 luaX_next(ls); /* skip FUNCTION */ in funcstat()
1477 ismethod = funcname(ls, &v); in funcstat()
1478 body(ls, &b, ismethod, line); in funcstat()
1479 luaK_storevar(ls->fs, &v, &b); in funcstat()
1480 luaK_fixline(ls->fs, line); /* definition `happens' in the first line */ in funcstat()
1484 static void exprstat (LexState *ls) { in exprstat() argument
1486 FuncState *fs = ls->fs; in exprstat()
1488 suffixedexp(ls, &v.v); in exprstat()
1489 if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ in exprstat()
1491 assignment(ls, &v, 1); in exprstat()
1494 check_condition(ls, v.v.k == VCALL, "syntax error"); in exprstat()
1500 static void retstat (LexState *ls) { in retstat() argument
1502 FuncState *fs = ls->fs; in retstat()
1505 if (block_follow(ls, 1) || ls->t.token == ';') in retstat()
1508 nret = explist(ls, &e); /* optional return values */ in retstat()
1529 (void) testnext(ls, ';'); /* skip optional semicolon */ in retstat()
1533 static void statement (LexState *ls) { in statement() argument
1534 int line = ls->linenumber; /* may be needed for error messages */ in statement()
1535 enterlevel(ls); in statement()
1536 switch (ls->t.token) { in statement()
1538 luaX_next(ls); /* skip ';' */ in statement()
1542 ifstat(ls, line); in statement()
1546 whilestat(ls, line); in statement()
1550 luaX_next(ls); /* skip DO */ in statement()
1551 block(ls); in statement()
1552 check_match(ls, TK_END, TK_DO, line); in statement()
1556 forstat(ls, line); in statement()
1560 repeatstat(ls, line); in statement()
1564 funcstat(ls, line); in statement()
1568 luaX_next(ls); /* skip LOCAL */ in statement()
1569 if (testnext(ls, TK_FUNCTION)) /* local function? */ in statement()
1570 localfunc(ls); in statement()
1572 localstat(ls); in statement()
1576 luaX_next(ls); /* skip double colon */ in statement()
1577 labelstat(ls, str_checkname(ls), line); in statement()
1581 luaX_next(ls); /* skip RETURN */ in statement()
1582 retstat(ls); in statement()
1587 gotostat(ls, luaK_jump(ls->fs)); in statement()
1591 exprstat(ls); in statement()
1595 lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && in statement()
1596 ls->fs->freereg >= ls->fs->nactvar); in statement()
1597 ls->fs->freereg = ls->fs->nactvar; /* free registers */ in statement()
1598 leavelevel(ls); in statement()
1608 static void mainfunc (LexState *ls, FuncState *fs) { in mainfunc() argument
1611 open_func(ls, fs, &bl); in mainfunc()
1614 newupvalue(fs, ls->envn, &v); /* ...set environment upvalue */ in mainfunc()
1615 luaX_next(ls); /* read first token */ in mainfunc()
1616 statlist(ls); /* parse main body */ in mainfunc()
1617 check(ls, TK_EOS); in mainfunc()
1618 close_func(ls); in mainfunc()