Lines Matching full:ls

54 static void statement (LexState *ls);
55 static void expr (LexState *ls, expdesc *v);
58 static void anchor_token (LexState *ls) { in anchor_token() argument
60 lua_assert(ls->fs != NULL || ls->t.token == TK_EOS); in anchor_token()
61 if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) { in anchor_token()
62 TString *ts = ls->t.seminfo.ts; in anchor_token()
63 luaX_newstring(ls, getstr(ts), ts->tsv.len); in anchor_token()
69 static l_noret semerror (LexState *ls, const char *msg) { in semerror() argument
70 ls->t.token = 0; /* remove 'near to' from final message */ in semerror()
71 luaX_syntaxerror(ls, msg); in semerror()
75 static l_noret error_expected (LexState *ls, int token) { in error_expected() argument
76 luaX_syntaxerror(ls, in error_expected()
77 luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token))); in error_expected()
82 lua_State *L = fs->ls->L; in errorlimit()
90 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()
108 static void check (LexState *ls, int c) { in check() argument
109 if (ls->t.token != c) in check()
110 error_expected(ls, c); in check()
114 static void checknext (LexState *ls, int c) { in checknext() argument
115 check(ls, c); in checknext()
116 luaX_next(ls); in checknext()
120 #define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } argument
124 static void check_match (LexState *ls, int what, int who, int where) { in check_match() argument
125 if (!testnext(ls, what)) { in check_match()
126 if (where == ls->linenumber) in check_match()
127 error_expected(ls, what); in check_match()
129 luaX_syntaxerror(ls, luaO_pushfstring(ls->L, in check_match()
131 luaX_token2str(ls, what), luaX_token2str(ls, who), where)); in check_match()
137 static TString *str_checkname (LexState *ls) { in str_checkname() argument
139 check(ls, TK_NAME); in str_checkname()
140 ts = ls->t.seminfo.ts; in str_checkname()
141 luaX_next(ls); in str_checkname()
153 static void codestring (LexState *ls, expdesc *e, TString *s) { in codestring() argument
154 init_exp(e, VK, luaK_stringK(ls->fs, s)); in codestring()
158 static void checkname (LexState *ls, expdesc *e) { in checkname() argument
159 codestring(ls, e, str_checkname(ls)); in checkname()
163 static int registerlocalvar (LexState *ls, TString *varname) { in registerlocalvar() argument
164 FuncState *fs = ls->fs; in registerlocalvar()
167 luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, in registerlocalvar()
171 luaC_objbarrier(ls->L, f, varname); in registerlocalvar()
176 static void new_localvar (LexState *ls, TString *name) { in new_localvar() argument
177 FuncState *fs = ls->fs; in new_localvar()
178 Dyndata *dyd = ls->dyd; in new_localvar()
179 int reg = registerlocalvar(ls, name); in new_localvar()
182 luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1, in new_localvar()
188 static void new_localvarliteral_ (LexState *ls, const char *name, size_t sz) { in new_localvarliteral_() argument
189 new_localvar(ls, luaX_newstring(ls, name, sz)); in new_localvarliteral_()
192 #define new_localvarliteral(ls,v) \ argument
193 new_localvarliteral_(ls, "" v, (sizeof(v)/sizeof(char))-1)
197 int idx = fs->ls->dyd->actvar.arr[fs->firstlocal + i].idx; in getlocvar()
203 static void adjustlocalvars (LexState *ls, int nvars) { in adjustlocalvars() argument
204 FuncState *fs = ls->fs; in adjustlocalvars()
213 fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel); in removevars()
233 luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues, in newupvalue()
239 luaC_objbarrier(fs->ls->L, f, name); in newupvalue()
295 static void singlevar (LexState *ls, expdesc *var) { in singlevar() argument
296 TString *varname = str_checkname(ls); in singlevar()
297 FuncState *fs = ls->fs; in singlevar()
300 singlevaraux(fs, ls->envn, var, 1); /* get environment variable */ in singlevar()
302 codestring(ls, &key, varname); /* key is variable name */ in singlevar()
308 static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { in adjust_assign() argument
309 FuncState *fs = ls->fs; in adjust_assign()
328 static void enterlevel (LexState *ls) { in enterlevel() argument
329 lua_State *L = ls->L; in enterlevel()
331 checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, "C levels"); in enterlevel()
335 #define leavelevel(ls) ((ls)->L->nCcalls--) argument
338 static void closegoto (LexState *ls, int g, Labeldesc *label) { in closegoto() argument
340 FuncState *fs = ls->fs; in closegoto()
341 Labellist *gl = &ls->dyd->gt; in closegoto()
346 const char *msg = luaO_pushfstring(ls->L, in closegoto()
349 semerror(ls, msg); in closegoto()
362 static int findlabel (LexState *ls, int g) { in findlabel() argument
364 BlockCnt *bl = ls->fs->bl; in findlabel()
365 Dyndata *dyd = ls->dyd; in findlabel()
373 luaK_patchclose(ls->fs, gt->pc, lb->nactvar); in findlabel()
374 closegoto(ls, g, lb); /* close it */ in findlabel()
382 static int newlabelentry (LexState *ls, Labellist *l, TString *name, in newlabelentry() argument
385 luaM_growvector(ls->L, l->arr, n, l->size, in newlabelentry()
389 l->arr[n].nactvar = ls->fs->nactvar; in newlabelentry()
400 static void findgotos (LexState *ls, Labeldesc *lb) { in findgotos() argument
401 Labellist *gl = &ls->dyd->gt; in findgotos()
402 int i = ls->fs->bl->firstgoto; in findgotos()
405 closegoto(ls, i, lb); in findgotos()
420 Labellist *gl = &fs->ls->dyd->gt; in movegotosout()
430 if (!findlabel(fs->ls, i)) in movegotosout()
439 bl->firstlabel = fs->ls->dyd->label.n; in enterblock()
440 bl->firstgoto = fs->ls->dyd->gt.n; in enterblock()
451 static void breaklabel (LexState *ls) { in breaklabel() argument
452 TString *n = luaS_new(ls->L, "break"); in breaklabel()
453 int l = newlabelentry(ls, &ls->dyd->label, n, 0, ls->fs->pc); in breaklabel()
454 findgotos(ls, &ls->dyd->label.arr[l]); in breaklabel()
461 static l_noret undefgoto (LexState *ls, Labeldesc *gt) { in undefgoto() argument
465 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line); in undefgoto()
466 semerror(ls, msg); in undefgoto()
472 LexState *ls = fs->ls; in leaveblock() local
480 breaklabel(ls); /* close pending breaks */ in leaveblock()
485 ls->dyd->label.n = bl->firstlabel; /* remove local labels */ in leaveblock()
488 else if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */ in leaveblock()
489 undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */ in leaveblock()
496 static Proto *addprototype (LexState *ls) { in addprototype() argument
498 lua_State *L = ls->L; in addprototype()
499 FuncState *fs = ls->fs; in addprototype()
518 static void codeclosure (LexState *ls, expdesc *v) { in codeclosure() argument
519 FuncState *fs = ls->fs->prev; in codeclosure()
525 static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) { in open_func() argument
526 lua_State *L = ls->L; in open_func()
528 fs->prev = ls->fs; /* linked list of funcstates */ in open_func()
529 fs->ls = ls; in open_func()
530 ls->fs = fs; in open_func()
540 fs->firstlocal = ls->dyd->actvar.n; in open_func()
543 f->source = ls->source; in open_func()
553 static void close_func (LexState *ls) { in close_func() argument
554 lua_State *L = ls->L; in close_func()
555 FuncState *fs = ls->fs; in close_func()
572 ls->fs = fs->prev; in close_func()
574 anchor_token(ls); in close_func()
591 static int block_follow (LexState *ls, int withuntil) { in block_follow() argument
592 switch (ls->t.token) { in block_follow()
608 static void statlist (LexState *ls) { in statlist() argument
610 while (!block_follow(ls, 1)) { in statlist()
611 if (ls->t.token == TK_RETURN) { in statlist()
612 statement(ls); in statlist()
615 statement(ls); in statlist()
620 static void fieldsel (LexState *ls, expdesc *v) { in fieldsel() argument
622 FuncState *fs = ls->fs; in fieldsel()
625 luaX_next(ls); /* skip the dot or colon */ in fieldsel()
626 checkname(ls, &key); in fieldsel()
631 static void yindex (LexState *ls, expdesc *v) { in yindex() argument
633 luaX_next(ls); /* skip the '[' */ in yindex()
634 expr(ls, v); in yindex()
635 luaK_exp2val(ls->fs, v); in yindex()
636 checknext(ls, ']'); in yindex()
656 static void recfield (LexState *ls, struct ConsControl *cc) { in recfield() argument
658 FuncState *fs = ls->fs; in recfield()
659 int reg = ls->fs->freereg; in recfield()
662 if (ls->t.token == TK_NAME) { in recfield()
664 checkname(ls, &key); in recfield()
666 else /* ls->t.token == '[' */ in recfield()
667 yindex(ls, &key); in recfield()
669 checknext(ls, '='); in recfield()
671 expr(ls, &val); in recfield()
703 static void listfield (LexState *ls, struct ConsControl *cc) { in listfield() argument
705 expr(ls, &cc->v); in listfield()
706 checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); in listfield()
712 static void field (LexState *ls, struct ConsControl *cc) { in field() argument
714 switch(ls->t.token) { in field()
716 if (luaX_lookahead(ls) != '=') /* expression? */ in field()
717 listfield(ls, cc); in field()
719 recfield(ls, cc); in field()
723 recfield(ls, cc); in field()
727 listfield(ls, cc); in field()
734 static void constructor (LexState *ls, expdesc *t) { in constructor() argument
737 FuncState *fs = ls->fs; in constructor()
738 int line = ls->linenumber; in constructor()
745 luaK_exp2nextreg(ls->fs, t); /* fix it at stack top */ in constructor()
746 checknext(ls, '{'); in constructor()
749 if (ls->t.token == '}') break; in constructor()
751 field(ls, &cc); in constructor()
752 } while (testnext(ls, ',') || testnext(ls, ';')); in constructor()
753 check_match(ls, '}', '{', line); in constructor()
763 static void parlist (LexState *ls) { in parlist() argument
765 FuncState *fs = ls->fs; in parlist()
769 if (ls->t.token != ')') { /* is `parlist' not empty? */ in parlist()
771 switch (ls->t.token) { in parlist()
773 new_localvar(ls, str_checkname(ls)); in parlist()
778 luaX_next(ls); in parlist()
782 default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected"); in parlist()
784 } while (!f->is_vararg && testnext(ls, ',')); in parlist()
786 adjustlocalvars(ls, nparams); in parlist()
792 static void body (LexState *ls, expdesc *e, int ismethod, int line) { in body() argument
796 new_fs.f = addprototype(ls); in body()
798 open_func(ls, &new_fs, &bl); in body()
799 checknext(ls, '('); in body()
801 new_localvarliteral(ls, "self"); /* create 'self' parameter */ in body()
802 adjustlocalvars(ls, 1); in body()
804 parlist(ls); in body()
805 checknext(ls, ')'); in body()
806 statlist(ls); in body()
807 new_fs.f->lastlinedefined = ls->linenumber; in body()
808 check_match(ls, TK_END, TK_FUNCTION, line); in body()
809 codeclosure(ls, e); in body()
810 close_func(ls); in body()
814 static int explist (LexState *ls, expdesc *v) { in explist() argument
817 expr(ls, v); in explist()
818 while (testnext(ls, ',')) { in explist()
819 luaK_exp2nextreg(ls->fs, v); in explist()
820 expr(ls, v); in explist()
827 static void funcargs (LexState *ls, expdesc *f, int line) { in funcargs() argument
828 FuncState *fs = ls->fs; in funcargs()
831 switch (ls->t.token) { in funcargs()
833 luaX_next(ls); in funcargs()
834 if (ls->t.token == ')') /* arg list is empty? */ in funcargs()
837 explist(ls, &args); in funcargs()
840 check_match(ls, ')', '(', line); in funcargs()
844 constructor(ls, &args); in funcargs()
848 codestring(ls, &args, ls->t.seminfo.ts); in funcargs()
849 luaX_next(ls); /* must use `seminfo' before `next' */ in funcargs()
853 luaX_syntaxerror(ls, "function arguments expected"); in funcargs()
881 static void primaryexp (LexState *ls, expdesc *v) { in primaryexp() argument
883 switch (ls->t.token) { in primaryexp()
885 int line = ls->linenumber; in primaryexp()
886 luaX_next(ls); in primaryexp()
887 expr(ls, v); in primaryexp()
888 check_match(ls, ')', '(', line); in primaryexp()
889 luaK_dischargevars(ls->fs, v); in primaryexp()
893 singlevar(ls, v); in primaryexp()
897 luaX_syntaxerror(ls, "unexpected symbol"); in primaryexp()
903 static void suffixedexp (LexState *ls, expdesc *v) { in suffixedexp() argument
906 FuncState *fs = ls->fs; in suffixedexp()
907 int line = ls->linenumber; in suffixedexp()
908 primaryexp(ls, v); in suffixedexp()
910 switch (ls->t.token) { in suffixedexp()
912 fieldsel(ls, v); in suffixedexp()
918 yindex(ls, &key); in suffixedexp()
924 luaX_next(ls); in suffixedexp()
925 checkname(ls, &key); in suffixedexp()
927 funcargs(ls, v, line); in suffixedexp()
932 funcargs(ls, v, line); in suffixedexp()
941 static void simpleexp (LexState *ls, expdesc *v) { in simpleexp() argument
944 switch (ls->t.token) { in simpleexp()
947 v->u.nval = ls->t.seminfo.r; in simpleexp()
951 codestring(ls, v, ls->t.seminfo.ts); in simpleexp()
967 FuncState *fs = ls->fs; in simpleexp()
968 check_condition(ls, fs->f->is_vararg, in simpleexp()
974 constructor(ls, v); in simpleexp()
978 luaX_next(ls); in simpleexp()
979 body(ls, v, 0, ls->linenumber); in simpleexp()
983 suffixedexp(ls, v); in simpleexp()
987 luaX_next(ls); in simpleexp()
1041 static BinOpr subexpr (LexState *ls, expdesc *v, int limit) { in subexpr() argument
1044 enterlevel(ls); in subexpr()
1045 uop = getunopr(ls->t.token); in subexpr()
1047 int line = ls->linenumber; in subexpr()
1048 luaX_next(ls); in subexpr()
1049 subexpr(ls, v, UNARY_PRIORITY); in subexpr()
1050 luaK_prefix(ls->fs, uop, v, line); in subexpr()
1052 else simpleexp(ls, v); in subexpr()
1054 op = getbinopr(ls->t.token); in subexpr()
1058 int line = ls->linenumber; in subexpr()
1059 luaX_next(ls); in subexpr()
1060 luaK_infix(ls->fs, op, v); in subexpr()
1062 nextop = subexpr(ls, &v2, priority[op].right); in subexpr()
1063 luaK_posfix(ls->fs, op, v, &v2, line); in subexpr()
1066 leavelevel(ls); in subexpr()
1071 static void expr (LexState *ls, expdesc *v) { in expr() argument
1072 subexpr(ls, v, 0); in expr()
1086 static void block (LexState *ls) { in block() argument
1088 FuncState *fs = ls->fs; in block()
1091 statlist(ls); in block()
1112 static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { in check_conflict() argument
1113 FuncState *fs = ls->fs; in check_conflict()
1140 static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { in assignment() argument
1142 check_condition(ls, vkisvar(lh->v.k), "syntax error"); in assignment()
1143 if (testnext(ls, ',')) { /* assignment -> ',' suffixedexp assignment */ in assignment()
1146 suffixedexp(ls, &nv.v); in assignment()
1148 check_conflict(ls, lh, &nv.v); in assignment()
1149 checklimit(ls->fs, nvars + ls->L->nCcalls, LUAI_MAXCCALLS, in assignment()
1151 assignment(ls, &nv, nvars+1); in assignment()
1155 checknext(ls, '='); in assignment()
1156 nexps = explist(ls, &e); in assignment()
1158 adjust_assign(ls, nvars, nexps, &e); in assignment()
1160 ls->fs->freereg -= nexps - nvars; /* remove extra values */ in assignment()
1163 luaK_setoneret(ls->fs, &e); /* close last expression */ in assignment()
1164 luaK_storevar(ls->fs, &lh->v, &e); in assignment()
1168 init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ in assignment()
1169 luaK_storevar(ls->fs, &lh->v, &e); in assignment()
1173 static int cond (LexState *ls) { in cond() argument
1176 expr(ls, &v); /* read condition */ in cond()
1178 luaK_goiftrue(ls->fs, &v); in cond()
1183 static void gotostat (LexState *ls, int pc) { in gotostat() argument
1184 int line = ls->linenumber; in gotostat()
1187 if (testnext(ls, TK_GOTO)) in gotostat()
1188 label = str_checkname(ls); in gotostat()
1190 luaX_next(ls); /* skip break */ in gotostat()
1191 label = luaS_new(ls->L, "break"); in gotostat()
1193 g = newlabelentry(ls, &ls->dyd->gt, label, line, pc); in gotostat()
1194 findlabel(ls, g); /* close it if label already defined */ in gotostat()
1203 const char *msg = luaO_pushfstring(fs->ls->L, in checkrepeated()
1206 semerror(fs->ls, msg); in checkrepeated()
1213 static void skipnoopstat (LexState *ls) { in skipnoopstat() argument
1214 while (ls->t.token == ';' || ls->t.token == TK_DBCOLON) in skipnoopstat()
1215 statement(ls); in skipnoopstat()
1219 static void labelstat (LexState *ls, TString *label, int line) { in labelstat() argument
1221 FuncState *fs = ls->fs; in labelstat()
1222 Labellist *ll = &ls->dyd->label; in labelstat()
1225 checknext(ls, TK_DBCOLON); /* skip double colon */ in labelstat()
1227 l = newlabelentry(ls, ll, label, line, fs->pc); in labelstat()
1228 skipnoopstat(ls); /* skip other no-op statements */ in labelstat()
1229 if (block_follow(ls, 0)) { /* label is last no-op statement in the block? */ in labelstat()
1233 findgotos(ls, &ll->arr[l]); in labelstat()
1237 static void whilestat (LexState *ls, int line) { in whilestat() argument
1239 FuncState *fs = ls->fs; in whilestat()
1243 luaX_next(ls); /* skip WHILE */ in whilestat()
1245 condexit = cond(ls); in whilestat()
1247 checknext(ls, TK_DO); in whilestat()
1248 block(ls); in whilestat()
1250 check_match(ls, TK_END, TK_WHILE, line); in whilestat()
1256 static void repeatstat (LexState *ls, int line) { in repeatstat() argument
1259 FuncState *fs = ls->fs; in repeatstat()
1264 luaX_next(ls); /* skip REPEAT */ in repeatstat()
1265 statlist(ls); in repeatstat()
1266 check_match(ls, TK_UNTIL, TK_REPEAT, line); in repeatstat()
1267 condexit = cond(ls); /* read condition (inside scope block) */ in repeatstat()
1276 static int exp1 (LexState *ls) { in exp1() argument
1279 expr(ls, &e); in exp1()
1280 luaK_exp2nextreg(ls->fs, &e); in exp1()
1287 static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { in forbody() argument
1290 FuncState *fs = ls->fs; in forbody()
1292 adjustlocalvars(ls, 3); /* control variables */ in forbody()
1293 checknext(ls, TK_DO); in forbody()
1296 adjustlocalvars(ls, nvars); in forbody()
1298 block(ls); in forbody()
1313 static void fornum (LexState *ls, TString *varname, int line) { in fornum() argument
1315 FuncState *fs = ls->fs; in fornum()
1317 new_localvarliteral(ls, "(for index)"); in fornum()
1318 new_localvarliteral(ls, "(for limit)"); in fornum()
1319 new_localvarliteral(ls, "(for step)"); in fornum()
1320 new_localvar(ls, varname); in fornum()
1321 checknext(ls, '='); in fornum()
1322 exp1(ls); /* initial value */ in fornum()
1323 checknext(ls, ','); in fornum()
1324 exp1(ls); /* limit */ in fornum()
1325 if (testnext(ls, ',')) in fornum()
1326 exp1(ls); /* optional step */ in fornum()
1331 forbody(ls, base, line, 1, 1); in fornum()
1335 static void forlist (LexState *ls, TString *indexname) { in forlist() argument
1337 FuncState *fs = ls->fs; in forlist()
1343 new_localvarliteral(ls, "(for generator)"); in forlist()
1344 new_localvarliteral(ls, "(for state)"); in forlist()
1345 new_localvarliteral(ls, "(for control)"); in forlist()
1347 new_localvar(ls, indexname); in forlist()
1348 while (testnext(ls, ',')) { in forlist()
1349 new_localvar(ls, str_checkname(ls)); in forlist()
1352 checknext(ls, TK_IN); in forlist()
1353 line = ls->linenumber; in forlist()
1354 adjust_assign(ls, 3, explist(ls, &e), &e); in forlist()
1356 forbody(ls, base, line, nvars - 3, 0); in forlist()
1360 static void forstat (LexState *ls, int line) { in forstat() argument
1362 FuncState *fs = ls->fs; in forstat()
1366 luaX_next(ls); /* skip `for' */ in forstat()
1367 varname = str_checkname(ls); /* first variable name */ in forstat()
1368 switch (ls->t.token) { in forstat()
1369 case '=': fornum(ls, varname, line); break; in forstat()
1370 case ',': case TK_IN: forlist(ls, varname); break; in forstat()
1371 default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected"); in forstat()
1373 check_match(ls, TK_END, TK_FOR, line); in forstat()
1379 static void test_then_block (LexState *ls, int *escapelist) { in test_then_block() argument
1382 FuncState *fs = ls->fs; in test_then_block()
1385 luaX_next(ls); /* skip IF or ELSEIF */ in test_then_block()
1386 expr(ls, &v); /* read condition */ in test_then_block()
1387 checknext(ls, TK_THEN); in test_then_block()
1388 if (ls->t.token == TK_GOTO || ls->t.token == TK_BREAK) { in test_then_block()
1389 luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */ in test_then_block()
1391 gotostat(ls, v.t); /* handle goto/break */ in test_then_block()
1392 skipnoopstat(ls); /* skip other no-op statements */ in test_then_block()
1393 if (block_follow(ls, 0)) { /* 'goto' is the entire block? */ in test_then_block()
1401 luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */ in test_then_block()
1405 statlist(ls); /* `then' part */ in test_then_block()
1407 if (ls->t.token == TK_ELSE || in test_then_block()
1408 ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */ in test_then_block()
1414 static void ifstat (LexState *ls, int line) { in ifstat() argument
1416 FuncState *fs = ls->fs; in ifstat()
1418 test_then_block(ls, &escapelist); /* IF cond THEN block */ in ifstat()
1419 while (ls->t.token == TK_ELSEIF) in ifstat()
1420 test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */ in ifstat()
1421 if (testnext(ls, TK_ELSE)) in ifstat()
1422 block(ls); /* `else' part */ in ifstat()
1423 check_match(ls, TK_END, TK_IF, line); in ifstat()
1428 static void localfunc (LexState *ls) { in localfunc() argument
1430 FuncState *fs = ls->fs; in localfunc()
1431 new_localvar(ls, str_checkname(ls)); /* new local variable */ in localfunc()
1432 adjustlocalvars(ls, 1); /* enter its scope */ in localfunc()
1433 body(ls, &b, 0, ls->linenumber); /* function created in next register */ in localfunc()
1439 static void localstat (LexState *ls) { in localstat() argument
1445 new_localvar(ls, str_checkname(ls)); in localstat()
1447 } while (testnext(ls, ',')); in localstat()
1448 if (testnext(ls, '=')) in localstat()
1449 nexps = explist(ls, &e); in localstat()
1454 adjust_assign(ls, nvars, nexps, &e); in localstat()
1455 adjustlocalvars(ls, nvars); in localstat()
1459 static int funcname (LexState *ls, expdesc *v) { in funcname() argument
1462 singlevar(ls, v); in funcname()
1463 while (ls->t.token == '.') in funcname()
1464 fieldsel(ls, v); in funcname()
1465 if (ls->t.token == ':') { in funcname()
1467 fieldsel(ls, v); in funcname()
1473 static void funcstat (LexState *ls, int line) { in funcstat() argument
1477 luaX_next(ls); /* skip FUNCTION */ in funcstat()
1478 ismethod = funcname(ls, &v); in funcstat()
1479 body(ls, &b, ismethod, line); in funcstat()
1480 luaK_storevar(ls->fs, &v, &b); in funcstat()
1481 luaK_fixline(ls->fs, line); /* definition `happens' in the first line */ in funcstat()
1485 static void exprstat (LexState *ls) { in exprstat() argument
1487 FuncState *fs = ls->fs; in exprstat()
1489 suffixedexp(ls, &v.v); in exprstat()
1490 if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */ in exprstat()
1492 assignment(ls, &v, 1); in exprstat()
1495 check_condition(ls, v.v.k == VCALL, "syntax error"); in exprstat()
1501 static void retstat (LexState *ls) { in retstat() argument
1503 FuncState *fs = ls->fs; in retstat()
1506 if (block_follow(ls, 1) || ls->t.token == ';') in retstat()
1509 nret = explist(ls, &e); /* optional return values */ in retstat()
1530 (void) testnext(ls, ';'); /* skip optional semicolon */ in retstat()
1534 static void statement (LexState *ls) { in statement() argument
1535 int line = ls->linenumber; /* may be needed for error messages */ in statement()
1536 enterlevel(ls); in statement()
1537 switch (ls->t.token) { in statement()
1539 luaX_next(ls); /* skip ';' */ in statement()
1543 ifstat(ls, line); in statement()
1547 whilestat(ls, line); in statement()
1551 luaX_next(ls); /* skip DO */ in statement()
1552 block(ls); in statement()
1553 check_match(ls, TK_END, TK_DO, line); in statement()
1557 forstat(ls, line); in statement()
1561 repeatstat(ls, line); in statement()
1565 funcstat(ls, line); in statement()
1569 luaX_next(ls); /* skip LOCAL */ in statement()
1570 if (testnext(ls, TK_FUNCTION)) /* local function? */ in statement()
1571 localfunc(ls); in statement()
1573 localstat(ls); in statement()
1577 luaX_next(ls); /* skip double colon */ in statement()
1578 labelstat(ls, str_checkname(ls), line); in statement()
1582 luaX_next(ls); /* skip RETURN */ in statement()
1583 retstat(ls); in statement()
1588 gotostat(ls, luaK_jump(ls->fs)); in statement()
1592 exprstat(ls); in statement()
1596 lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && in statement()
1597 ls->fs->freereg >= ls->fs->nactvar); in statement()
1598 ls->fs->freereg = ls->fs->nactvar; /* free registers */ in statement()
1599 leavelevel(ls); in statement()
1609 static void mainfunc (LexState *ls, FuncState *fs) { in mainfunc() argument
1612 open_func(ls, fs, &bl); in mainfunc()
1615 newupvalue(fs, ls->envn, &v); /* ...set environment upvalue */ in mainfunc()
1616 luaX_next(ls); /* read first token */ in mainfunc()
1617 statlist(ls); /* parse main body */ in mainfunc()
1618 check(ls, TK_EOS); in mainfunc()
1619 close_func(ls); in mainfunc()