Lines Matching refs:ls
53 static void chunk (LexState *ls);
54 static void expr (LexState *ls, expdesc *v);
57 static void anchor_token (LexState *ls) { in anchor_token() argument
58 if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) { in anchor_token()
59 TString *ts = ls->t.seminfo.ts; in anchor_token()
60 luaX_newstring(ls, getstr(ts), ts->tsv.len); in anchor_token()
65 static void error_expected (LexState *ls, int token) { in error_expected() argument
66 luaX_syntaxerror(ls, in error_expected()
67 luaO_pushfstring(ls->L, LUA_QS " expected", luaX_token2str(ls, token))); in error_expected()
76 luaX_lexerror(fs->ls, msg, 0); in errorlimit()
80 static int testnext (LexState *ls, int c) { in testnext() argument
81 if (ls->t.token == c) { in testnext()
82 luaX_next(ls); in testnext()
89 static void check (LexState *ls, int c) { in check() argument
90 if (ls->t.token != c) in check()
91 error_expected(ls, c); in check()
94 static void checknext (LexState *ls, int c) { in checknext() argument
95 check(ls, c); in checknext()
96 luaX_next(ls); in checknext()
100 #define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); } argument
104 static void check_match (LexState *ls, int what, int who, int where) { in check_match() argument
105 if (!testnext(ls, what)) { in check_match()
106 if (where == ls->linenumber) in check_match()
107 error_expected(ls, what); in check_match()
109 luaX_syntaxerror(ls, luaO_pushfstring(ls->L, in check_match()
111 luaX_token2str(ls, what), luaX_token2str(ls, who), where)); in check_match()
117 static TString *str_checkname (LexState *ls) { in str_checkname() argument
119 check(ls, TK_NAME); in str_checkname()
120 ts = ls->t.seminfo.ts; in str_checkname()
121 luaX_next(ls); in str_checkname()
133 static void codestring (LexState *ls, expdesc *e, TString *s) { in codestring() argument
134 init_exp(e, VK, luaK_stringK(ls->fs, s)); in codestring()
138 static void checkname(LexState *ls, expdesc *e) { in checkname() argument
139 codestring(ls, e, str_checkname(ls)); in checkname()
143 static int registerlocalvar (LexState *ls, TString *varname) { in registerlocalvar() argument
144 FuncState *fs = ls->fs; in registerlocalvar()
147 luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars, in registerlocalvar()
151 luaC_objbarrier(ls->L, f, varname); in registerlocalvar()
156 #define new_localvarliteral(ls,v,n) \ argument
157 new_localvar(ls, luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char))-1), n)
160 static void new_localvar (LexState *ls, TString *name, int n) { in new_localvar() argument
161 FuncState *fs = ls->fs; in new_localvar()
163 fs->actvar[fs->nactvar+n] = cast(unsigned short, registerlocalvar(ls, name)); in new_localvar()
167 static void adjustlocalvars (LexState *ls, int nvars) { in adjustlocalvars() argument
168 FuncState *fs = ls->fs; in adjustlocalvars()
176 static void removevars (LexState *ls, int tolevel) { in removevars() argument
177 FuncState *fs = ls->fs; in removevars()
248 static void singlevar (LexState *ls, expdesc *var) { in singlevar() argument
249 TString *varname = str_checkname(ls); in singlevar()
250 FuncState *fs = ls->fs; in singlevar()
256 static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) { in adjust_assign() argument
257 FuncState *fs = ls->fs; in adjust_assign()
276 static void enterlevel (LexState *ls) { in enterlevel() argument
277 if (++ls->L->nCcalls > LUAI_MAXCCALLS) in enterlevel()
278 luaX_lexerror(ls, "chunk has too many syntax levels", 0); in enterlevel()
282 #define leavelevel(ls) ((ls)->L->nCcalls--) argument
299 removevars(fs->ls, bl->nactvar); in leaveblock()
310 static void pushclosure (LexState *ls, FuncState *func, expdesc *v) { in pushclosure() argument
311 FuncState *fs = ls->fs; in pushclosure()
315 luaM_growvector(ls->L, f->p, fs->np, f->sizep, Proto *, in pushclosure()
319 luaC_objbarrier(ls->L, f, func->f); in pushclosure()
328 static void open_func (LexState *ls, FuncState *fs) { in open_func() argument
329 lua_State *L = ls->L; in open_func()
332 fs->prev = ls->fs; /* linked list of funcstates */ in open_func()
333 fs->ls = ls; in open_func()
335 ls->fs = fs; in open_func()
345 f->source = ls->source; in open_func()
356 static void close_func (LexState *ls) { in close_func() argument
357 lua_State *L = ls->L; in close_func()
358 FuncState *fs = ls->fs; in close_func()
360 removevars(ls, 0); in close_func()
376 ls->fs = fs->prev; in close_func()
378 if (fs) anchor_token(ls); in close_func()
407 static void field (LexState *ls, expdesc *v) { in field() argument
409 FuncState *fs = ls->fs; in field()
412 luaX_next(ls); /* skip the dot or colon */ in field()
413 checkname(ls, &key); in field()
418 static void yindex (LexState *ls, expdesc *v) { in yindex() argument
420 luaX_next(ls); /* skip the '[' */ in yindex()
421 expr(ls, v); in yindex()
422 luaK_exp2val(ls->fs, v); in yindex()
423 checknext(ls, ']'); in yindex()
443 static void recfield (LexState *ls, struct ConsControl *cc) { in recfield() argument
445 FuncState *fs = ls->fs; in recfield()
446 int reg = ls->fs->freereg; in recfield()
449 if (ls->t.token == TK_NAME) { in recfield()
451 checkname(ls, &key); in recfield()
454 yindex(ls, &key); in recfield()
456 checknext(ls, '='); in recfield()
458 expr(ls, &val); in recfield()
490 static void listfield (LexState *ls, struct ConsControl *cc) { in listfield() argument
491 expr(ls, &cc->v); in listfield()
492 luaY_checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor"); in listfield()
498 static void constructor (LexState *ls, expdesc *t) { in constructor() argument
500 FuncState *fs = ls->fs; in constructor()
501 int line = ls->linenumber; in constructor()
508 luaK_exp2nextreg(ls->fs, t); /* fix it at stack top (for gc) */ in constructor()
509 checknext(ls, '{'); in constructor()
512 if (ls->t.token == '}') break; in constructor()
514 switch(ls->t.token) { in constructor()
516 luaX_lookahead(ls); in constructor()
517 if (ls->lookahead.token != '=') /* expression? */ in constructor()
518 listfield(ls, &cc); in constructor()
520 recfield(ls, &cc); in constructor()
524 recfield(ls, &cc); in constructor()
528 listfield(ls, &cc); in constructor()
532 } while (testnext(ls, ',') || testnext(ls, ';')); in constructor()
533 check_match(ls, '}', '{', line); in constructor()
543 static void parlist (LexState *ls) { in parlist() argument
545 FuncState *fs = ls->fs; in parlist()
549 if (ls->t.token != ')') { /* is `parlist' not empty? */ in parlist()
551 switch (ls->t.token) { in parlist()
553 new_localvar(ls, str_checkname(ls), nparams++); in parlist()
557 luaX_next(ls); in parlist()
560 new_localvarliteral(ls, "arg", nparams++); in parlist()
566 default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected"); in parlist()
568 } while (!f->is_vararg && testnext(ls, ',')); in parlist()
570 adjustlocalvars(ls, nparams); in parlist()
576 static void body (LexState *ls, expdesc *e, int needself, int line) { in body() argument
579 open_func(ls, &new_fs); in body()
581 checknext(ls, '('); in body()
583 new_localvarliteral(ls, "self", 0); in body()
584 adjustlocalvars(ls, 1); in body()
586 parlist(ls); in body()
587 checknext(ls, ')'); in body()
588 chunk(ls); in body()
589 new_fs.f->lastlinedefined = ls->linenumber; in body()
590 check_match(ls, TK_END, TK_FUNCTION, line); in body()
591 close_func(ls); in body()
592 pushclosure(ls, &new_fs, e); in body()
596 static int explist1 (LexState *ls, expdesc *v) { in explist1() argument
599 expr(ls, v); in explist1()
600 while (testnext(ls, ',')) { in explist1()
601 luaK_exp2nextreg(ls->fs, v); in explist1()
602 expr(ls, v); in explist1()
609 static void funcargs (LexState *ls, expdesc *f) { in funcargs() argument
610 FuncState *fs = ls->fs; in funcargs()
613 int line = ls->linenumber; in funcargs()
614 switch (ls->t.token) { in funcargs()
616 if (line != ls->lastline) in funcargs()
617 luaX_syntaxerror(ls,"ambiguous syntax (function call x new statement)"); in funcargs()
618 luaX_next(ls); in funcargs()
619 if (ls->t.token == ')') /* arg list is empty? */ in funcargs()
622 explist1(ls, &args); in funcargs()
625 check_match(ls, ')', '(', line); in funcargs()
629 constructor(ls, &args); in funcargs()
633 codestring(ls, &args, ls->t.seminfo.ts); in funcargs()
634 luaX_next(ls); /* must use `seminfo' before `next' */ in funcargs()
638 luaX_syntaxerror(ls, "function arguments expected"); in funcargs()
667 static void prefixexp (LexState *ls, expdesc *v) { in prefixexp() argument
669 switch (ls->t.token) { in prefixexp()
671 int line = ls->linenumber; in prefixexp()
672 luaX_next(ls); in prefixexp()
673 expr(ls, v); in prefixexp()
674 check_match(ls, ')', '(', line); in prefixexp()
675 luaK_dischargevars(ls->fs, v); in prefixexp()
679 singlevar(ls, v); in prefixexp()
683 luaX_syntaxerror(ls, "unexpected symbol"); in prefixexp()
690 static void primaryexp (LexState *ls, expdesc *v) { in primaryexp() argument
693 FuncState *fs = ls->fs; in primaryexp()
694 prefixexp(ls, v); in primaryexp()
696 switch (ls->t.token) { in primaryexp()
698 field(ls, v); in primaryexp()
704 yindex(ls, &key); in primaryexp()
710 luaX_next(ls); in primaryexp()
711 checkname(ls, &key); in primaryexp()
713 funcargs(ls, v); in primaryexp()
718 funcargs(ls, v); in primaryexp()
727 static void simpleexp (LexState *ls, expdesc *v) { in simpleexp() argument
730 switch (ls->t.token) { in simpleexp()
733 v->u.nval = ls->t.seminfo.r; in simpleexp()
737 codestring(ls, v, ls->t.seminfo.ts); in simpleexp()
753 FuncState *fs = ls->fs; in simpleexp()
754 check_condition(ls, fs->f->is_vararg, in simpleexp()
761 constructor(ls, v); in simpleexp()
765 luaX_next(ls); in simpleexp()
766 body(ls, v, 0, ls->linenumber); in simpleexp()
770 primaryexp(ls, v); in simpleexp()
774 luaX_next(ls); in simpleexp()
828 static BinOpr subexpr (LexState *ls, expdesc *v, unsigned int limit) { in subexpr() argument
831 enterlevel(ls); in subexpr()
832 uop = getunopr(ls->t.token); in subexpr()
834 luaX_next(ls); in subexpr()
835 subexpr(ls, v, UNARY_PRIORITY); in subexpr()
836 luaK_prefix(ls->fs, uop, v); in subexpr()
838 else simpleexp(ls, v); in subexpr()
840 op = getbinopr(ls->t.token); in subexpr()
844 luaX_next(ls); in subexpr()
845 luaK_infix(ls->fs, op, v); in subexpr()
847 nextop = subexpr(ls, &v2, priority[op].right); in subexpr()
848 luaK_posfix(ls->fs, op, v, &v2); in subexpr()
851 leavelevel(ls); in subexpr()
856 static void expr (LexState *ls, expdesc *v) { in expr() argument
857 subexpr(ls, v, 0); in expr()
881 static void block (LexState *ls) { in block() argument
883 FuncState *fs = ls->fs; in block()
886 chunk(ls); in block()
908 static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) { in check_conflict() argument
909 FuncState *fs = ls->fs; in check_conflict()
931 static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) { in assignment() argument
933 check_condition(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED, in assignment()
935 if (testnext(ls, ',')) { /* assignment -> `,' primaryexp assignment */ in assignment()
938 primaryexp(ls, &nv.v); in assignment()
940 check_conflict(ls, lh, &nv.v); in assignment()
941 luaY_checklimit(ls->fs, nvars, LUAI_MAXCCALLS - ls->L->nCcalls, in assignment()
943 assignment(ls, &nv, nvars+1); in assignment()
947 checknext(ls, '='); in assignment()
948 nexps = explist1(ls, &e); in assignment()
950 adjust_assign(ls, nvars, nexps, &e); in assignment()
952 ls->fs->freereg -= nexps - nvars; /* remove extra values */ in assignment()
955 luaK_setoneret(ls->fs, &e); /* close last expression */ in assignment()
956 luaK_storevar(ls->fs, &lh->v, &e); in assignment()
960 init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */ in assignment()
961 luaK_storevar(ls->fs, &lh->v, &e); in assignment()
965 static int cond (LexState *ls) { in cond() argument
968 expr(ls, &v); /* read condition */ in cond()
970 luaK_goiftrue(ls->fs, &v); in cond()
975 static void breakstat (LexState *ls) { in breakstat() argument
976 FuncState *fs = ls->fs; in breakstat()
984 luaX_syntaxerror(ls, "no loop to break"); in breakstat()
991 static void whilestat (LexState *ls, int line) { in whilestat() argument
993 FuncState *fs = ls->fs; in whilestat()
997 luaX_next(ls); /* skip WHILE */ in whilestat()
999 condexit = cond(ls); in whilestat()
1001 checknext(ls, TK_DO); in whilestat()
1002 block(ls); in whilestat()
1004 check_match(ls, TK_END, TK_WHILE, line); in whilestat()
1010 static void repeatstat (LexState *ls, int line) { in repeatstat() argument
1013 FuncState *fs = ls->fs; in repeatstat()
1018 luaX_next(ls); /* skip REPEAT */ in repeatstat()
1019 chunk(ls); in repeatstat()
1020 check_match(ls, TK_UNTIL, TK_REPEAT, line); in repeatstat()
1021 condexit = cond(ls); /* read condition (inside scope block) */ in repeatstat()
1024 luaK_patchlist(ls->fs, condexit, repeat_init); /* close the loop */ in repeatstat()
1027 breakstat(ls); /* if condition then break */ in repeatstat()
1028 luaK_patchtohere(ls->fs, condexit); /* else... */ in repeatstat()
1030 luaK_patchlist(ls->fs, luaK_jump(fs), repeat_init); /* and repeat */ in repeatstat()
1036 static int exp1 (LexState *ls) { in exp1() argument
1039 expr(ls, &e); in exp1()
1041 luaK_exp2nextreg(ls->fs, &e); in exp1()
1046 static void forbody (LexState *ls, int base, int line, int nvars, int isnum) { in forbody() argument
1049 FuncState *fs = ls->fs; in forbody()
1051 adjustlocalvars(ls, 3); /* control variables */ in forbody()
1052 checknext(ls, TK_DO); in forbody()
1055 adjustlocalvars(ls, nvars); in forbody()
1057 block(ls); in forbody()
1067 static void fornum (LexState *ls, TString *varname, int line) { in fornum() argument
1069 FuncState *fs = ls->fs; in fornum()
1071 new_localvarliteral(ls, "(for index)", 0); in fornum()
1072 new_localvarliteral(ls, "(for limit)", 1); in fornum()
1073 new_localvarliteral(ls, "(for step)", 2); in fornum()
1074 new_localvar(ls, varname, 3); in fornum()
1075 checknext(ls, '='); in fornum()
1076 exp1(ls); /* initial value */ in fornum()
1077 checknext(ls, ','); in fornum()
1078 exp1(ls); /* limit */ in fornum()
1079 if (testnext(ls, ',')) in fornum()
1080 exp1(ls); /* optional step */ in fornum()
1085 forbody(ls, base, line, 1, 1); in fornum()
1089 static void forlist (LexState *ls, TString *indexname) { in forlist() argument
1091 FuncState *fs = ls->fs; in forlist()
1097 new_localvarliteral(ls, "(for generator)", nvars++); in forlist()
1098 new_localvarliteral(ls, "(for state)", nvars++); in forlist()
1099 new_localvarliteral(ls, "(for control)", nvars++); in forlist()
1101 new_localvar(ls, indexname, nvars++); in forlist()
1102 while (testnext(ls, ',')) in forlist()
1103 new_localvar(ls, str_checkname(ls), nvars++); in forlist()
1104 checknext(ls, TK_IN); in forlist()
1105 line = ls->linenumber; in forlist()
1106 adjust_assign(ls, 3, explist1(ls, &e), &e); in forlist()
1108 forbody(ls, base, line, nvars - 3, 0); in forlist()
1112 static void forstat (LexState *ls, int line) { in forstat() argument
1114 FuncState *fs = ls->fs; in forstat()
1118 luaX_next(ls); /* skip `for' */ in forstat()
1119 varname = str_checkname(ls); /* first variable name */ in forstat()
1120 switch (ls->t.token) { in forstat()
1121 case '=': fornum(ls, varname, line); break; in forstat()
1122 case ',': case TK_IN: forlist(ls, varname); break; in forstat()
1123 default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected"); in forstat()
1125 check_match(ls, TK_END, TK_FOR, line); in forstat()
1130 static int test_then_block (LexState *ls) { in test_then_block() argument
1133 luaX_next(ls); /* skip IF or ELSEIF */ in test_then_block()
1134 condexit = cond(ls); in test_then_block()
1135 checknext(ls, TK_THEN); in test_then_block()
1136 block(ls); /* `then' part */ in test_then_block()
1141 static void ifstat (LexState *ls, int line) { in ifstat() argument
1143 FuncState *fs = ls->fs; in ifstat()
1146 flist = test_then_block(ls); /* IF cond THEN block */ in ifstat()
1147 while (ls->t.token == TK_ELSEIF) { in ifstat()
1150 flist = test_then_block(ls); /* ELSEIF cond THEN block */ in ifstat()
1152 if (ls->t.token == TK_ELSE) { in ifstat()
1155 luaX_next(ls); /* skip ELSE (after patch, for correct line info) */ in ifstat()
1156 block(ls); /* `else' part */ in ifstat()
1161 check_match(ls, TK_END, TK_IF, line); in ifstat()
1165 static void localfunc (LexState *ls) { in localfunc() argument
1167 FuncState *fs = ls->fs; in localfunc()
1168 new_localvar(ls, str_checkname(ls), 0); in localfunc()
1171 adjustlocalvars(ls, 1); in localfunc()
1172 body(ls, &b, 0, ls->linenumber); in localfunc()
1179 static void localstat (LexState *ls) { in localstat() argument
1185 new_localvar(ls, str_checkname(ls), nvars++); in localstat()
1186 } while (testnext(ls, ',')); in localstat()
1187 if (testnext(ls, '=')) in localstat()
1188 nexps = explist1(ls, &e); in localstat()
1193 adjust_assign(ls, nvars, nexps, &e); in localstat()
1194 adjustlocalvars(ls, nvars); in localstat()
1198 static int funcname (LexState *ls, expdesc *v) { in funcname() argument
1201 singlevar(ls, v); in funcname()
1202 while (ls->t.token == '.') in funcname()
1203 field(ls, v); in funcname()
1204 if (ls->t.token == ':') { in funcname()
1206 field(ls, v); in funcname()
1212 static void funcstat (LexState *ls, int line) { in funcstat() argument
1216 luaX_next(ls); /* skip FUNCTION */ in funcstat()
1217 needself = funcname(ls, &v); in funcstat()
1218 body(ls, &b, needself, line); in funcstat()
1219 luaK_storevar(ls->fs, &v, &b); in funcstat()
1220 luaK_fixline(ls->fs, line); /* definition `happens' in the first line */ in funcstat()
1224 static void exprstat (LexState *ls) { in exprstat() argument
1226 FuncState *fs = ls->fs; in exprstat()
1228 primaryexp(ls, &v.v); in exprstat()
1233 assignment(ls, &v, 1); in exprstat()
1238 static void retstat (LexState *ls) { in retstat() argument
1240 FuncState *fs = ls->fs; in retstat()
1243 luaX_next(ls); /* skip RETURN */ in retstat()
1244 if (block_follow(ls->t.token) || ls->t.token == ';') in retstat()
1247 nret = explist1(ls, &e); /* optional return values */ in retstat()
1271 static int statement (LexState *ls) { in statement() argument
1272 int line = ls->linenumber; /* may be needed for error messages */ in statement()
1273 switch (ls->t.token) { in statement()
1275 ifstat(ls, line); in statement()
1279 whilestat(ls, line); in statement()
1283 luaX_next(ls); /* skip DO */ in statement()
1284 block(ls); in statement()
1285 check_match(ls, TK_END, TK_DO, line); in statement()
1289 forstat(ls, line); in statement()
1293 repeatstat(ls, line); in statement()
1297 funcstat(ls, line); /* stat -> funcstat */ in statement()
1301 luaX_next(ls); /* skip LOCAL */ in statement()
1302 if (testnext(ls, TK_FUNCTION)) /* local function? */ in statement()
1303 localfunc(ls); in statement()
1305 localstat(ls); in statement()
1309 retstat(ls); in statement()
1313 luaX_next(ls); /* skip BREAK */ in statement()
1314 breakstat(ls); in statement()
1318 exprstat(ls); in statement()
1325 static void chunk (LexState *ls) { in chunk() argument
1328 enterlevel(ls); in chunk()
1329 while (!islast && !block_follow(ls->t.token)) { in chunk()
1330 islast = statement(ls); in chunk()
1331 testnext(ls, ';'); in chunk()
1332 lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg && in chunk()
1333 ls->fs->freereg >= ls->fs->nactvar); in chunk()
1334 ls->fs->freereg = ls->fs->nactvar; /* free registers */ in chunk()
1336 leavelevel(ls); in chunk()