]> git.proxmox.com Git - mirror_zfs.git/blob - module/lua/lparser.c
Fix a potential use-after-free in zfs_setsecattr()
[mirror_zfs.git] / module / lua / lparser.c
1 /*
2 ** $Id: lparser.c,v 2.130.1.1 2013/04/12 18:48:47 roberto Exp $
3 ** Lua Parser
4 ** See Copyright Notice in lua.h
5 */
6
7 #define lparser_c
8 #define LUA_CORE
9
10 #include <sys/lua/lua.h>
11
12 #include "lcode.h"
13 #include "ldebug.h"
14 #include "ldo.h"
15 #include "lfunc.h"
16 #include "llex.h"
17 #include "lmem.h"
18 #include "lobject.h"
19 #include "lopcodes.h"
20 #include "lparser.h"
21 #include "lstate.h"
22 #include "lstring.h"
23 #include "ltable.h"
24
25
26
27 /* maximum number of local variables per function (must be smaller
28 than 250, due to the bytecode format) */
29 #define MAXVARS 200
30
31
32 #define hasmultret(k) ((k) == VCALL || (k) == VVARARG)
33
34
35
36 /*
37 ** nodes for block list (list of active blocks)
38 */
39 typedef struct BlockCnt {
40 struct BlockCnt *previous; /* chain */
41 short firstlabel; /* index of first label in this block */
42 short firstgoto; /* index of first pending goto in this block */
43 lu_byte nactvar; /* # active locals outside the block */
44 lu_byte upval; /* true if some variable in the block is an upvalue */
45 lu_byte isloop; /* true if `block' is a loop */
46 } BlockCnt;
47
48
49
50 /*
51 ** prototypes for recursive non-terminal functions
52 */
53 static void statement (LexState *ls);
54 static void expr (LexState *ls, expdesc *v);
55
56
57 static void anchor_token (LexState *ls) {
58 /* last token from outer function must be EOS */
59 lua_assert(ls->fs != NULL || ls->t.token == TK_EOS);
60 if (ls->t.token == TK_NAME || ls->t.token == TK_STRING) {
61 TString *ts = ls->t.seminfo.ts;
62 luaX_newstring(ls, getstr(ts), ts->tsv.len);
63 }
64 }
65
66
67 /* semantic error */
68 static l_noret semerror (LexState *ls, const char *msg) {
69 ls->t.token = 0; /* remove 'near to' from final message */
70 luaX_syntaxerror(ls, msg);
71 }
72
73
74 static l_noret error_expected (LexState *ls, int token) {
75 luaX_syntaxerror(ls,
76 luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token)));
77 }
78
79
80 static l_noret errorlimit (FuncState *fs, int limit, const char *what) {
81 lua_State *L = fs->ls->L;
82 const char *msg;
83 int line = fs->f->linedefined;
84 const char *where = (line == 0)
85 ? "main function"
86 : luaO_pushfstring(L, "function at line %d", line);
87 msg = luaO_pushfstring(L, "too many %s (limit is %d) in %s",
88 what, limit, where);
89 luaX_syntaxerror(fs->ls, msg);
90 }
91
92
93 static void checklimit (FuncState *fs, int v, int l, const char *what) {
94 if (v > l) errorlimit(fs, l, what);
95 }
96
97
98 static int testnext (LexState *ls, int c) {
99 if (ls->t.token == c) {
100 luaX_next(ls);
101 return 1;
102 }
103 else return 0;
104 }
105
106
107 static void check (LexState *ls, int c) {
108 if (ls->t.token != c)
109 error_expected(ls, c);
110 }
111
112
113 static void checknext (LexState *ls, int c) {
114 check(ls, c);
115 luaX_next(ls);
116 }
117
118
119 #define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); }
120
121
122
123 static void check_match (LexState *ls, int what, int who, int where) {
124 if (!testnext(ls, what)) {
125 if (where == ls->linenumber)
126 error_expected(ls, what);
127 else {
128 luaX_syntaxerror(ls, luaO_pushfstring(ls->L,
129 "%s expected (to close %s at line %d)",
130 luaX_token2str(ls, what), luaX_token2str(ls, who), where));
131 }
132 }
133 }
134
135
136 static TString *str_checkname (LexState *ls) {
137 TString *ts;
138 check(ls, TK_NAME);
139 ts = ls->t.seminfo.ts;
140 luaX_next(ls);
141 return ts;
142 }
143
144
145 static void init_exp (expdesc *e, expkind k, int i) {
146 e->f = e->t = NO_JUMP;
147 e->k = k;
148 e->u.info = i;
149 }
150
151
152 static void codestring (LexState *ls, expdesc *e, TString *s) {
153 init_exp(e, VK, luaK_stringK(ls->fs, s));
154 }
155
156
157 static void checkname (LexState *ls, expdesc *e) {
158 codestring(ls, e, str_checkname(ls));
159 }
160
161
162 static int registerlocalvar (LexState *ls, TString *varname) {
163 FuncState *fs = ls->fs;
164 Proto *f = fs->f;
165 int oldsize = f->sizelocvars;
166 luaM_growvector(ls->L, f->locvars, fs->nlocvars, f->sizelocvars,
167 LocVar, SHRT_MAX, "local variables");
168 while (oldsize < f->sizelocvars) f->locvars[oldsize++].varname = NULL;
169 f->locvars[fs->nlocvars].varname = varname;
170 luaC_objbarrier(ls->L, f, varname);
171 return fs->nlocvars++;
172 }
173
174
175 static void new_localvar (LexState *ls, TString *name) {
176 FuncState *fs = ls->fs;
177 Dyndata *dyd = ls->dyd;
178 int reg = registerlocalvar(ls, name);
179 checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal,
180 MAXVARS, "local variables");
181 luaM_growvector(ls->L, dyd->actvar.arr, dyd->actvar.n + 1,
182 dyd->actvar.size, Vardesc, MAX_INT, "local variables");
183 dyd->actvar.arr[dyd->actvar.n++].idx = cast(short, reg);
184 }
185
186
187 static void new_localvarliteral_ (LexState *ls, const char *name, size_t sz) {
188 new_localvar(ls, luaX_newstring(ls, name, sz));
189 }
190
191 #define new_localvarliteral(ls,v) \
192 new_localvarliteral_(ls, "" v, (sizeof(v)/sizeof(char))-1)
193
194
195 static LocVar *getlocvar (FuncState *fs, int i) {
196 int idx = fs->ls->dyd->actvar.arr[fs->firstlocal + i].idx;
197 lua_assert(idx < fs->nlocvars);
198 return &fs->f->locvars[idx];
199 }
200
201
202 static void adjustlocalvars (LexState *ls, int nvars) {
203 FuncState *fs = ls->fs;
204 fs->nactvar = cast_byte(fs->nactvar + nvars);
205 for (; nvars; nvars--) {
206 getlocvar(fs, fs->nactvar - nvars)->startpc = fs->pc;
207 }
208 }
209
210
211 static void removevars (FuncState *fs, int tolevel) {
212 fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel);
213 while (fs->nactvar > tolevel)
214 getlocvar(fs, --fs->nactvar)->endpc = fs->pc;
215 }
216
217
218 static int searchupvalue (FuncState *fs, TString *name) {
219 int i;
220 Upvaldesc *up = fs->f->upvalues;
221 for (i = 0; i < fs->nups; i++) {
222 if (luaS_eqstr(up[i].name, name)) return i;
223 }
224 return -1; /* not found */
225 }
226
227
228 static int newupvalue (FuncState *fs, TString *name, expdesc *v) {
229 Proto *f = fs->f;
230 int oldsize = f->sizeupvalues;
231 checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues");
232 luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues,
233 Upvaldesc, MAXUPVAL, "upvalues");
234 while (oldsize < f->sizeupvalues) f->upvalues[oldsize++].name = NULL;
235 f->upvalues[fs->nups].instack = (v->k == VLOCAL);
236 f->upvalues[fs->nups].idx = cast_byte(v->u.info);
237 f->upvalues[fs->nups].name = name;
238 luaC_objbarrier(fs->ls->L, f, name);
239 return fs->nups++;
240 }
241
242
243 static int searchvar (FuncState *fs, TString *n) {
244 int i;
245 for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) {
246 if (luaS_eqstr(n, getlocvar(fs, i)->varname))
247 return i;
248 }
249 return -1; /* not found */
250 }
251
252
253 /*
254 Mark block where variable at given level was defined
255 (to emit close instructions later).
256 */
257 static void markupval (FuncState *fs, int level) {
258 BlockCnt *bl = fs->bl;
259 while (bl->nactvar > level) bl = bl->previous;
260 bl->upval = 1;
261 }
262
263
264 /*
265 Find variable with given name 'n'. If it is an upvalue, add this
266 upvalue into all intermediate functions.
267 */
268 static int singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {
269 if (fs == NULL) /* no more levels? */
270 return VVOID; /* default is global */
271 else {
272 int v = searchvar(fs, n); /* look up locals at current level */
273 if (v >= 0) { /* found? */
274 init_exp(var, VLOCAL, v); /* variable is local */
275 if (!base)
276 markupval(fs, v); /* local will be used as an upval */
277 return VLOCAL;
278 }
279 else { /* not found as local at current level; try upvalues */
280 int idx = searchupvalue(fs, n); /* try existing upvalues */
281 if (idx < 0) { /* not found? */
282 if (singlevaraux(fs->prev, n, var, 0) == VVOID) /* try upper levels */
283 return VVOID; /* not found; is a global */
284 /* else was LOCAL or UPVAL */
285 idx = newupvalue(fs, n, var); /* will be a new upvalue */
286 }
287 init_exp(var, VUPVAL, idx);
288 return VUPVAL;
289 }
290 }
291 }
292
293
294 static void singlevar (LexState *ls, expdesc *var) {
295 TString *varname = str_checkname(ls);
296 FuncState *fs = ls->fs;
297 if (singlevaraux(fs, varname, var, 1) == VVOID) { /* global name? */
298 expdesc key;
299 singlevaraux(fs, ls->envn, var, 1); /* get environment variable */
300 lua_assert(var->k == VLOCAL || var->k == VUPVAL);
301 codestring(ls, &key, varname); /* key is variable name */
302 luaK_indexed(fs, var, &key); /* env[varname] */
303 }
304 }
305
306
307 static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) {
308 FuncState *fs = ls->fs;
309 int extra = nvars - nexps;
310 if (hasmultret(e->k)) {
311 extra++; /* includes call itself */
312 if (extra < 0) extra = 0;
313 luaK_setreturns(fs, e, extra); /* last exp. provides the difference */
314 if (extra > 1) luaK_reserveregs(fs, extra-1);
315 }
316 else {
317 if (e->k != VVOID) luaK_exp2nextreg(fs, e); /* close last expression */
318 if (extra > 0) {
319 int reg = fs->freereg;
320 luaK_reserveregs(fs, extra);
321 luaK_nil(fs, reg, extra);
322 }
323 }
324 }
325
326
327 static void enterlevel (LexState *ls) {
328 lua_State *L = ls->L;
329 ++L->nCcalls;
330 checklimit(ls->fs, L->nCcalls, LUAI_MAXCCALLS, "C levels");
331 }
332
333
334 #define leavelevel(ls) ((ls)->L->nCcalls--)
335
336
337 static void closegoto (LexState *ls, int g, Labeldesc *label) {
338 int i;
339 FuncState *fs = ls->fs;
340 Labellist *gl = &ls->dyd->gt;
341 Labeldesc *gt = &gl->arr[g];
342 lua_assert(luaS_eqstr(gt->name, label->name));
343 if (gt->nactvar < label->nactvar) {
344 TString *vname = getlocvar(fs, gt->nactvar)->varname;
345 const char *msg = luaO_pushfstring(ls->L,
346 "<goto %s> at line %d jumps into the scope of local " LUA_QS,
347 getstr(gt->name), gt->line, getstr(vname));
348 semerror(ls, msg);
349 }
350 luaK_patchlist(fs, gt->pc, label->pc);
351 /* remove goto from pending list */
352 for (i = g; i < gl->n - 1; i++)
353 gl->arr[i] = gl->arr[i + 1];
354 gl->n--;
355 }
356
357
358 /*
359 ** try to close a goto with existing labels; this solves backward jumps
360 */
361 static int findlabel (LexState *ls, int g) {
362 int i;
363 BlockCnt *bl = ls->fs->bl;
364 Dyndata *dyd = ls->dyd;
365 Labeldesc *gt = &dyd->gt.arr[g];
366 /* check labels in current block for a match */
367 for (i = bl->firstlabel; i < dyd->label.n; i++) {
368 Labeldesc *lb = &dyd->label.arr[i];
369 if (luaS_eqstr(lb->name, gt->name)) { /* correct label? */
370 if (gt->nactvar > lb->nactvar &&
371 (bl->upval || dyd->label.n > bl->firstlabel))
372 luaK_patchclose(ls->fs, gt->pc, lb->nactvar);
373 closegoto(ls, g, lb); /* close it */
374 return 1;
375 }
376 }
377 return 0; /* label not found; cannot close goto */
378 }
379
380
381 static int newlabelentry (LexState *ls, Labellist *l, TString *name,
382 int line, int pc) {
383 int n = l->n;
384 luaM_growvector(ls->L, l->arr, n, l->size,
385 Labeldesc, SHRT_MAX, "labels/gotos");
386 l->arr[n].name = name;
387 l->arr[n].line = line;
388 l->arr[n].nactvar = ls->fs->nactvar;
389 l->arr[n].pc = pc;
390 l->n++;
391 return n;
392 }
393
394
395 /*
396 ** check whether new label 'lb' matches any pending gotos in current
397 ** block; solves forward jumps
398 */
399 static void findgotos (LexState *ls, Labeldesc *lb) {
400 Labellist *gl = &ls->dyd->gt;
401 int i = ls->fs->bl->firstgoto;
402 while (i < gl->n) {
403 if (luaS_eqstr(gl->arr[i].name, lb->name))
404 closegoto(ls, i, lb);
405 else
406 i++;
407 }
408 }
409
410
411 /*
412 ** "export" pending gotos to outer level, to check them against
413 ** outer labels; if the block being exited has upvalues, and
414 ** the goto exits the scope of any variable (which can be the
415 ** upvalue), close those variables being exited.
416 */
417 static void movegotosout (FuncState *fs, BlockCnt *bl) {
418 int i = bl->firstgoto;
419 Labellist *gl = &fs->ls->dyd->gt;
420 /* correct pending gotos to current block and try to close it
421 with visible labels */
422 while (i < gl->n) {
423 Labeldesc *gt = &gl->arr[i];
424 if (gt->nactvar > bl->nactvar) {
425 if (bl->upval)
426 luaK_patchclose(fs, gt->pc, bl->nactvar);
427 gt->nactvar = bl->nactvar;
428 }
429 if (!findlabel(fs->ls, i))
430 i++; /* move to next one */
431 }
432 }
433
434
435 static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) {
436 bl->isloop = isloop;
437 bl->nactvar = fs->nactvar;
438 bl->firstlabel = fs->ls->dyd->label.n;
439 bl->firstgoto = fs->ls->dyd->gt.n;
440 bl->upval = 0;
441 bl->previous = fs->bl;
442 fs->bl = bl;
443 lua_assert(fs->freereg == fs->nactvar);
444 }
445
446
447 /*
448 ** create a label named "break" to resolve break statements
449 */
450 static void breaklabel (LexState *ls) {
451 TString *n = luaS_new(ls->L, "break");
452 int l = newlabelentry(ls, &ls->dyd->label, n, 0, ls->fs->pc);
453 findgotos(ls, &ls->dyd->label.arr[l]);
454 }
455
456 /*
457 ** generates an error for an undefined 'goto'; choose appropriate
458 ** message when label name is a reserved word (which can only be 'break')
459 */
460 static l_noret undefgoto (LexState *ls, Labeldesc *gt) {
461 const char *msg = isreserved(gt->name)
462 ? "<%s> at line %d not inside a loop"
463 : "no visible label " LUA_QS " for <goto> at line %d";
464 msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line);
465 semerror(ls, msg);
466 }
467
468
469 static void leaveblock (FuncState *fs) {
470 BlockCnt *bl = fs->bl;
471 LexState *ls = fs->ls;
472 if (bl->previous && bl->upval) {
473 /* create a 'jump to here' to close upvalues */
474 int j = luaK_jump(fs);
475 luaK_patchclose(fs, j, bl->nactvar);
476 luaK_patchtohere(fs, j);
477 }
478 if (bl->isloop)
479 breaklabel(ls); /* close pending breaks */
480 fs->bl = bl->previous;
481 removevars(fs, bl->nactvar);
482 lua_assert(bl->nactvar == fs->nactvar);
483 fs->freereg = fs->nactvar; /* free registers */
484 ls->dyd->label.n = bl->firstlabel; /* remove local labels */
485 if (bl->previous) /* inner block? */
486 movegotosout(fs, bl); /* update pending gotos to outer block */
487 else if (bl->firstgoto < ls->dyd->gt.n) /* pending gotos in outer block? */
488 undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]); /* error */
489 }
490
491
492 /*
493 ** adds a new prototype into list of prototypes
494 */
495 static Proto *addprototype (LexState *ls) {
496 Proto *clp;
497 lua_State *L = ls->L;
498 FuncState *fs = ls->fs;
499 Proto *f = fs->f; /* prototype of current function */
500 if (fs->np >= f->sizep) {
501 int oldsize = f->sizep;
502 luaM_growvector(L, f->p, fs->np, f->sizep, Proto *, MAXARG_Bx, "functions");
503 while (oldsize < f->sizep) f->p[oldsize++] = NULL;
504 }
505 f->p[fs->np++] = clp = luaF_newproto(L);
506 luaC_objbarrier(L, f, clp);
507 return clp;
508 }
509
510
511 /*
512 ** codes instruction to create new closure in parent function.
513 ** The OP_CLOSURE instruction must use the last available register,
514 ** so that, if it invokes the GC, the GC knows which registers
515 ** are in use at that time.
516 */
517 static void codeclosure (LexState *ls, expdesc *v) {
518 FuncState *fs = ls->fs->prev;
519 init_exp(v, VRELOCABLE, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np - 1));
520 luaK_exp2nextreg(fs, v); /* fix it at the last register */
521 }
522
523
524 static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) {
525 lua_State *L = ls->L;
526 Proto *f;
527 fs->prev = ls->fs; /* linked list of funcstates */
528 fs->ls = ls;
529 ls->fs = fs;
530 fs->pc = 0;
531 fs->lasttarget = 0;
532 fs->jpc = NO_JUMP;
533 fs->freereg = 0;
534 fs->nk = 0;
535 fs->np = 0;
536 fs->nups = 0;
537 fs->nlocvars = 0;
538 fs->nactvar = 0;
539 fs->firstlocal = ls->dyd->actvar.n;
540 fs->bl = NULL;
541 f = fs->f;
542 f->source = ls->source;
543 f->maxstacksize = 2; /* registers 0/1 are always valid */
544 fs->h = luaH_new(L);
545 /* anchor table of constants (to avoid being collected) */
546 sethvalue2s(L, L->top, fs->h);
547 incr_top(L);
548 enterblock(fs, bl, 0);
549 }
550
551
552 static void close_func (LexState *ls) {
553 lua_State *L = ls->L;
554 FuncState *fs = ls->fs;
555 Proto *f = fs->f;
556 luaK_ret(fs, 0, 0); /* final return */
557 leaveblock(fs);
558 luaM_reallocvector(L, f->code, f->sizecode, fs->pc, Instruction);
559 f->sizecode = fs->pc;
560 luaM_reallocvector(L, f->lineinfo, f->sizelineinfo, fs->pc, int);
561 f->sizelineinfo = fs->pc;
562 luaM_reallocvector(L, f->k, f->sizek, fs->nk, TValue);
563 f->sizek = fs->nk;
564 luaM_reallocvector(L, f->p, f->sizep, fs->np, Proto *);
565 f->sizep = fs->np;
566 luaM_reallocvector(L, f->locvars, f->sizelocvars, fs->nlocvars, LocVar);
567 f->sizelocvars = fs->nlocvars;
568 luaM_reallocvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc);
569 f->sizeupvalues = fs->nups;
570 lua_assert(fs->bl == NULL);
571 ls->fs = fs->prev;
572 /* last token read was anchored in defunct function; must re-anchor it */
573 anchor_token(ls);
574 L->top--; /* pop table of constants */
575 luaC_checkGC(L);
576 }
577
578
579
580 /*============================================================*/
581 /* GRAMMAR RULES */
582 /*============================================================*/
583
584
585 /*
586 ** check whether current token is in the follow set of a block.
587 ** 'until' closes syntactical blocks, but do not close scope,
588 ** so it handled in separate.
589 */
590 static int block_follow (LexState *ls, int withuntil) {
591 switch (ls->t.token) {
592 case TK_ELSE: case TK_ELSEIF:
593 case TK_END: case TK_EOS:
594 return 1;
595 case TK_UNTIL: return withuntil;
596 default: return 0;
597 }
598 }
599
600
601 /*
602 * by inlining statlist() and test_then_block() we cut back the
603 * native stack usage per nested C call from 272 bytes to 152
604 * which allows us to stay within budget for 8K kernel stacks
605 */
606 __attribute__((always_inline)) inline
607 static void statlist (LexState *ls) {
608 /* statlist -> { stat [`;'] } */
609 while (!block_follow(ls, 1)) {
610 if (ls->t.token == TK_RETURN) {
611 statement(ls);
612 return; /* 'return' must be last statement */
613 }
614 statement(ls);
615 }
616 }
617
618
619 static void fieldsel (LexState *ls, expdesc *v) {
620 /* fieldsel -> ['.' | ':'] NAME */
621 FuncState *fs = ls->fs;
622 expdesc key;
623 luaK_exp2anyregup(fs, v);
624 luaX_next(ls); /* skip the dot or colon */
625 checkname(ls, &key);
626 luaK_indexed(fs, v, &key);
627 }
628
629
630 static void yindex (LexState *ls, expdesc *v) {
631 /* index -> '[' expr ']' */
632 luaX_next(ls); /* skip the '[' */
633 expr(ls, v);
634 luaK_exp2val(ls->fs, v);
635 checknext(ls, ']');
636 }
637
638
639 /*
640 ** {======================================================================
641 ** Rules for Constructors
642 ** =======================================================================
643 */
644
645
646 struct ConsControl {
647 expdesc v; /* last list item read */
648 expdesc *t; /* table descriptor */
649 int nh; /* total number of `record' elements */
650 int na; /* total number of array elements */
651 int tostore; /* number of array elements pending to be stored */
652 };
653
654
655 static void recfield (LexState *ls, struct ConsControl *cc) {
656 /* recfield -> (NAME | `['exp1`]') = exp1 */
657 FuncState *fs = ls->fs;
658 int reg = ls->fs->freereg;
659 expdesc key, val;
660 int rkkey;
661 if (ls->t.token == TK_NAME) {
662 checklimit(fs, cc->nh, MAX_INT, "items in a constructor");
663 checkname(ls, &key);
664 }
665 else /* ls->t.token == '[' */
666 yindex(ls, &key);
667 cc->nh++;
668 checknext(ls, '=');
669 rkkey = luaK_exp2RK(fs, &key);
670 expr(ls, &val);
671 luaK_codeABC(fs, OP_SETTABLE, cc->t->u.info, rkkey, luaK_exp2RK(fs, &val));
672 fs->freereg = reg; /* free registers */
673 }
674
675
676 static void closelistfield (FuncState *fs, struct ConsControl *cc) {
677 if (cc->v.k == VVOID) return; /* there is no list item */
678 luaK_exp2nextreg(fs, &cc->v);
679 cc->v.k = VVOID;
680 if (cc->tostore == LFIELDS_PER_FLUSH) {
681 luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore); /* flush */
682 cc->tostore = 0; /* no more items pending */
683 }
684 }
685
686
687 static void lastlistfield (FuncState *fs, struct ConsControl *cc) {
688 if (cc->tostore == 0) return;
689 if (hasmultret(cc->v.k)) {
690 luaK_setmultret(fs, &cc->v);
691 luaK_setlist(fs, cc->t->u.info, cc->na, LUA_MULTRET);
692 cc->na--; /* do not count last expression (unknown number of elements) */
693 }
694 else {
695 if (cc->v.k != VVOID)
696 luaK_exp2nextreg(fs, &cc->v);
697 luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore);
698 }
699 }
700
701
702 static void listfield (LexState *ls, struct ConsControl *cc) {
703 /* listfield -> exp */
704 expr(ls, &cc->v);
705 checklimit(ls->fs, cc->na, MAX_INT, "items in a constructor");
706 cc->na++;
707 cc->tostore++;
708 }
709
710
711 static void field (LexState *ls, struct ConsControl *cc) {
712 /* field -> listfield | recfield */
713 switch(ls->t.token) {
714 case TK_NAME: { /* may be 'listfield' or 'recfield' */
715 if (luaX_lookahead(ls) != '=') /* expression? */
716 listfield(ls, cc);
717 else
718 recfield(ls, cc);
719 break;
720 }
721 case '[': {
722 recfield(ls, cc);
723 break;
724 }
725 default: {
726 listfield(ls, cc);
727 break;
728 }
729 }
730 }
731
732
733 static void constructor (LexState *ls, expdesc *t) {
734 /* constructor -> '{' [ field { sep field } [sep] ] '}'
735 sep -> ',' | ';' */
736 FuncState *fs = ls->fs;
737 int line = ls->linenumber;
738 int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0);
739 struct ConsControl cc;
740 cc.na = cc.nh = cc.tostore = 0;
741 cc.t = t;
742 init_exp(t, VRELOCABLE, pc);
743 init_exp(&cc.v, VVOID, 0); /* no value (yet) */
744 luaK_exp2nextreg(ls->fs, t); /* fix it at stack top */
745 checknext(ls, '{');
746 do {
747 lua_assert(cc.v.k == VVOID || cc.tostore > 0);
748 if (ls->t.token == '}') break;
749 closelistfield(fs, &cc);
750 field(ls, &cc);
751 } while (testnext(ls, ',') || testnext(ls, ';'));
752 check_match(ls, '}', '{', line);
753 lastlistfield(fs, &cc);
754 SETARG_B(fs->f->code[pc], luaO_int2fb(cc.na)); /* set initial array size */
755 SETARG_C(fs->f->code[pc], luaO_int2fb(cc.nh)); /* set initial table size */
756 }
757
758 /* }====================================================================== */
759
760
761
762 static void parlist (LexState *ls) {
763 /* parlist -> [ param { `,' param } ] */
764 FuncState *fs = ls->fs;
765 Proto *f = fs->f;
766 int nparams = 0;
767 f->is_vararg = 0;
768 if (ls->t.token != ')') { /* is `parlist' not empty? */
769 do {
770 switch (ls->t.token) {
771 case TK_NAME: { /* param -> NAME */
772 new_localvar(ls, str_checkname(ls));
773 nparams++;
774 break;
775 }
776 case TK_DOTS: { /* param -> `...' */
777 luaX_next(ls);
778 f->is_vararg = 1;
779 break;
780 }
781 default: luaX_syntaxerror(ls, "<name> or " LUA_QL("...") " expected");
782 }
783 } while (!f->is_vararg && testnext(ls, ','));
784 }
785 adjustlocalvars(ls, nparams);
786 f->numparams = cast_byte(fs->nactvar);
787 luaK_reserveregs(fs, fs->nactvar); /* reserve register for parameters */
788 }
789
790
791 static void body (LexState *ls, expdesc *e, int ismethod, int line) {
792 /* body -> `(' parlist `)' block END */
793 FuncState new_fs;
794 BlockCnt bl;
795 new_fs.f = addprototype(ls);
796 new_fs.f->linedefined = line;
797 open_func(ls, &new_fs, &bl);
798 checknext(ls, '(');
799 if (ismethod) {
800 new_localvarliteral(ls, "self"); /* create 'self' parameter */
801 adjustlocalvars(ls, 1);
802 }
803 parlist(ls);
804 checknext(ls, ')');
805 statlist(ls);
806 new_fs.f->lastlinedefined = ls->linenumber;
807 check_match(ls, TK_END, TK_FUNCTION, line);
808 codeclosure(ls, e);
809 close_func(ls);
810 }
811
812
813 static int explist (LexState *ls, expdesc *v) {
814 /* explist -> expr { `,' expr } */
815 int n = 1; /* at least one expression */
816 expr(ls, v);
817 while (testnext(ls, ',')) {
818 luaK_exp2nextreg(ls->fs, v);
819 expr(ls, v);
820 n++;
821 }
822 return n;
823 }
824
825
826 static void funcargs (LexState *ls, expdesc *f, int line) {
827 FuncState *fs = ls->fs;
828 expdesc args;
829 int base, nparams;
830 switch (ls->t.token) {
831 case '(': { /* funcargs -> `(' [ explist ] `)' */
832 luaX_next(ls);
833 if (ls->t.token == ')') /* arg list is empty? */
834 args.k = VVOID;
835 else {
836 explist(ls, &args);
837 luaK_setmultret(fs, &args);
838 }
839 check_match(ls, ')', '(', line);
840 break;
841 }
842 case '{': { /* funcargs -> constructor */
843 constructor(ls, &args);
844 break;
845 }
846 case TK_STRING: { /* funcargs -> STRING */
847 codestring(ls, &args, ls->t.seminfo.ts);
848 luaX_next(ls); /* must use `seminfo' before `next' */
849 break;
850 }
851 default: {
852 luaX_syntaxerror(ls, "function arguments expected");
853 }
854 }
855 lua_assert(f->k == VNONRELOC);
856 base = f->u.info; /* base register for call */
857 if (hasmultret(args.k))
858 nparams = LUA_MULTRET; /* open call */
859 else {
860 if (args.k != VVOID)
861 luaK_exp2nextreg(fs, &args); /* close last argument */
862 nparams = fs->freereg - (base+1);
863 }
864 init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2));
865 luaK_fixline(fs, line);
866 fs->freereg = base+1; /* call remove function and arguments and leaves
867 (unless changed) one result */
868 }
869
870
871
872
873 /*
874 ** {======================================================================
875 ** Expression parsing
876 ** =======================================================================
877 */
878
879
880 static void primaryexp (LexState *ls, expdesc *v) {
881 /* primaryexp -> NAME | '(' expr ')' */
882 switch (ls->t.token) {
883 case '(': {
884 int line = ls->linenumber;
885 luaX_next(ls);
886 expr(ls, v);
887 check_match(ls, ')', '(', line);
888 luaK_dischargevars(ls->fs, v);
889 return;
890 }
891 case TK_NAME: {
892 singlevar(ls, v);
893 return;
894 }
895 default: {
896 luaX_syntaxerror(ls, "unexpected symbol");
897 }
898 }
899 }
900
901
902 static void suffixedexp (LexState *ls, expdesc *v) {
903 /* suffixedexp ->
904 primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */
905 FuncState *fs = ls->fs;
906 int line = ls->linenumber;
907 primaryexp(ls, v);
908 for (;;) {
909 switch (ls->t.token) {
910 case '.': { /* fieldsel */
911 fieldsel(ls, v);
912 break;
913 }
914 case '[': { /* `[' exp1 `]' */
915 expdesc key;
916 luaK_exp2anyregup(fs, v);
917 yindex(ls, &key);
918 luaK_indexed(fs, v, &key);
919 break;
920 }
921 case ':': { /* `:' NAME funcargs */
922 expdesc key;
923 luaX_next(ls);
924 checkname(ls, &key);
925 luaK_self(fs, v, &key);
926 funcargs(ls, v, line);
927 break;
928 }
929 case '(': case TK_STRING: case '{': { /* funcargs */
930 luaK_exp2nextreg(fs, v);
931 funcargs(ls, v, line);
932 break;
933 }
934 default: return;
935 }
936 }
937 }
938
939
940 static void simpleexp (LexState *ls, expdesc *v) {
941 /* simpleexp -> NUMBER | STRING | NIL | TRUE | FALSE | ... |
942 constructor | FUNCTION body | suffixedexp */
943 switch (ls->t.token) {
944 case TK_NUMBER: {
945 init_exp(v, VKNUM, 0);
946 v->u.nval = ls->t.seminfo.r;
947 break;
948 }
949 case TK_STRING: {
950 codestring(ls, v, ls->t.seminfo.ts);
951 break;
952 }
953 case TK_NIL: {
954 init_exp(v, VNIL, 0);
955 break;
956 }
957 case TK_TRUE: {
958 init_exp(v, VTRUE, 0);
959 break;
960 }
961 case TK_FALSE: {
962 init_exp(v, VFALSE, 0);
963 break;
964 }
965 case TK_DOTS: { /* vararg */
966 FuncState *fs = ls->fs;
967 check_condition(ls, fs->f->is_vararg,
968 "cannot use " LUA_QL("...") " outside a vararg function");
969 init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 1, 0));
970 break;
971 }
972 case '{': { /* constructor */
973 constructor(ls, v);
974 return;
975 }
976 case TK_FUNCTION: {
977 luaX_next(ls);
978 body(ls, v, 0, ls->linenumber);
979 return;
980 }
981 default: {
982 suffixedexp(ls, v);
983 return;
984 }
985 }
986 luaX_next(ls);
987 }
988
989
990 static UnOpr getunopr (int op) {
991 switch (op) {
992 case TK_NOT: return OPR_NOT;
993 case '-': return OPR_MINUS;
994 case '#': return OPR_LEN;
995 default: return OPR_NOUNOPR;
996 }
997 }
998
999
1000 static BinOpr getbinopr (int op) {
1001 switch (op) {
1002 case '+': return OPR_ADD;
1003 case '-': return OPR_SUB;
1004 case '*': return OPR_MUL;
1005 case '/': return OPR_DIV;
1006 case '%': return OPR_MOD;
1007 case '^': return OPR_POW;
1008 case TK_CONCAT: return OPR_CONCAT;
1009 case TK_NE: return OPR_NE;
1010 case TK_EQ: return OPR_EQ;
1011 case '<': return OPR_LT;
1012 case TK_LE: return OPR_LE;
1013 case '>': return OPR_GT;
1014 case TK_GE: return OPR_GE;
1015 case TK_AND: return OPR_AND;
1016 case TK_OR: return OPR_OR;
1017 default: return OPR_NOBINOPR;
1018 }
1019 }
1020
1021
1022 static const struct {
1023 lu_byte left; /* left priority for each binary operator */
1024 lu_byte right; /* right priority */
1025 } priority[] = { /* ORDER OPR */
1026 {6, 6}, {6, 6}, {7, 7}, {7, 7}, {7, 7}, /* `+' `-' `*' `/' `%' */
1027 {10, 9}, {5, 4}, /* ^, .. (right associative) */
1028 {3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */
1029 {3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */
1030 {2, 2}, {1, 1} /* and, or */
1031 };
1032
1033 #define UNARY_PRIORITY 8 /* priority for unary operators */
1034
1035
1036 /*
1037 ** subexpr -> (simpleexp | unop subexpr) { binop subexpr }
1038 ** where `binop' is any binary operator with a priority higher than `limit'
1039 */
1040 static BinOpr subexpr (LexState *ls, expdesc *v, int limit) {
1041 BinOpr op;
1042 UnOpr uop;
1043 enterlevel(ls);
1044 uop = getunopr(ls->t.token);
1045 if (uop != OPR_NOUNOPR) {
1046 int line = ls->linenumber;
1047 luaX_next(ls);
1048 subexpr(ls, v, UNARY_PRIORITY);
1049 luaK_prefix(ls->fs, uop, v, line);
1050 }
1051 else simpleexp(ls, v);
1052 /* expand while operators have priorities higher than `limit' */
1053 op = getbinopr(ls->t.token);
1054 while (op != OPR_NOBINOPR && priority[op].left > limit) {
1055 expdesc v2;
1056 BinOpr nextop;
1057 int line = ls->linenumber;
1058 luaX_next(ls);
1059 luaK_infix(ls->fs, op, v);
1060 /* read sub-expression with higher priority */
1061 nextop = subexpr(ls, &v2, priority[op].right);
1062 luaK_posfix(ls->fs, op, v, &v2, line);
1063 op = nextop;
1064 }
1065 leavelevel(ls);
1066 return op; /* return first untreated operator */
1067 }
1068
1069
1070 static void expr (LexState *ls, expdesc *v) {
1071 subexpr(ls, v, 0);
1072 }
1073
1074 /* }==================================================================== */
1075
1076
1077
1078 /*
1079 ** {======================================================================
1080 ** Rules for Statements
1081 ** =======================================================================
1082 */
1083
1084
1085 static void block (LexState *ls) {
1086 /* block -> statlist */
1087 FuncState *fs = ls->fs;
1088 BlockCnt bl;
1089 enterblock(fs, &bl, 0);
1090 statlist(ls);
1091 leaveblock(fs);
1092 }
1093
1094
1095 /*
1096 ** structure to chain all variables in the left-hand side of an
1097 ** assignment
1098 */
1099 struct LHS_assign {
1100 struct LHS_assign *prev;
1101 expdesc v; /* variable (global, local, upvalue, or indexed) */
1102 };
1103
1104
1105 /*
1106 ** check whether, in an assignment to an upvalue/local variable, the
1107 ** upvalue/local variable is begin used in a previous assignment to a
1108 ** table. If so, save original upvalue/local value in a safe place and
1109 ** use this safe copy in the previous assignment.
1110 */
1111 static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) {
1112 FuncState *fs = ls->fs;
1113 int extra = fs->freereg; /* eventual position to save local variable */
1114 int conflict = 0;
1115 for (; lh; lh = lh->prev) { /* check all previous assignments */
1116 if (lh->v.k == VINDEXED) { /* assigning to a table? */
1117 /* table is the upvalue/local being assigned now? */
1118 if (lh->v.u.ind.vt == v->k && lh->v.u.ind.t == v->u.info) {
1119 conflict = 1;
1120 lh->v.u.ind.vt = VLOCAL;
1121 lh->v.u.ind.t = extra; /* previous assignment will use safe copy */
1122 }
1123 /* index is the local being assigned? (index cannot be upvalue) */
1124 if (v->k == VLOCAL && lh->v.u.ind.idx == v->u.info) {
1125 conflict = 1;
1126 lh->v.u.ind.idx = extra; /* previous assignment will use safe copy */
1127 }
1128 }
1129 }
1130 if (conflict) {
1131 /* copy upvalue/local value to a temporary (in position 'extra') */
1132 OpCode op = (v->k == VLOCAL) ? OP_MOVE : OP_GETUPVAL;
1133 luaK_codeABC(fs, op, extra, v->u.info, 0);
1134 luaK_reserveregs(fs, 1);
1135 }
1136 }
1137
1138
1139 static void assignment (LexState *ls, struct LHS_assign *lh, int nvars) {
1140 expdesc e;
1141 check_condition(ls, vkisvar(lh->v.k), "syntax error");
1142 if (testnext(ls, ',')) { /* assignment -> ',' suffixedexp assignment */
1143 struct LHS_assign nv;
1144 nv.prev = lh;
1145 suffixedexp(ls, &nv.v);
1146 if (nv.v.k != VINDEXED)
1147 check_conflict(ls, lh, &nv.v);
1148 checklimit(ls->fs, nvars + ls->L->nCcalls, LUAI_MAXCCALLS,
1149 "C levels");
1150 assignment(ls, &nv, nvars+1);
1151 }
1152 else { /* assignment -> `=' explist */
1153 int nexps;
1154 checknext(ls, '=');
1155 nexps = explist(ls, &e);
1156 if (nexps != nvars) {
1157 adjust_assign(ls, nvars, nexps, &e);
1158 if (nexps > nvars)
1159 ls->fs->freereg -= nexps - nvars; /* remove extra values */
1160 }
1161 else {
1162 luaK_setoneret(ls->fs, &e); /* close last expression */
1163 luaK_storevar(ls->fs, &lh->v, &e);
1164 return; /* avoid default */
1165 }
1166 }
1167 init_exp(&e, VNONRELOC, ls->fs->freereg-1); /* default assignment */
1168 luaK_storevar(ls->fs, &lh->v, &e);
1169 }
1170
1171
1172 static int cond (LexState *ls) {
1173 /* cond -> exp */
1174 expdesc v;
1175 expr(ls, &v); /* read condition */
1176 if (v.k == VNIL) v.k = VFALSE; /* `falses' are all equal here */
1177 luaK_goiftrue(ls->fs, &v);
1178 return v.f;
1179 }
1180
1181
1182 static void gotostat (LexState *ls, int pc) {
1183 int line = ls->linenumber;
1184 TString *label;
1185 int g;
1186 if (testnext(ls, TK_GOTO))
1187 label = str_checkname(ls);
1188 else {
1189 luaX_next(ls); /* skip break */
1190 label = luaS_new(ls->L, "break");
1191 }
1192 g = newlabelentry(ls, &ls->dyd->gt, label, line, pc);
1193 findlabel(ls, g); /* close it if label already defined */
1194 }
1195
1196
1197 /* check for repeated labels on the same block */
1198 static void checkrepeated (FuncState *fs, Labellist *ll, TString *label) {
1199 int i;
1200 for (i = fs->bl->firstlabel; i < ll->n; i++) {
1201 if (luaS_eqstr(label, ll->arr[i].name)) {
1202 const char *msg = luaO_pushfstring(fs->ls->L,
1203 "label " LUA_QS " already defined on line %d",
1204 getstr(label), ll->arr[i].line);
1205 semerror(fs->ls, msg);
1206 }
1207 }
1208 }
1209
1210
1211 /* skip no-op statements */
1212 static void skipnoopstat (LexState *ls) {
1213 while (ls->t.token == ';' || ls->t.token == TK_DBCOLON)
1214 statement(ls);
1215 }
1216
1217
1218 static void labelstat (LexState *ls, TString *label, int line) {
1219 /* label -> '::' NAME '::' */
1220 FuncState *fs = ls->fs;
1221 Labellist *ll = &ls->dyd->label;
1222 int l; /* index of new label being created */
1223 checkrepeated(fs, ll, label); /* check for repeated labels */
1224 checknext(ls, TK_DBCOLON); /* skip double colon */
1225 /* create new entry for this label */
1226 l = newlabelentry(ls, ll, label, line, fs->pc);
1227 skipnoopstat(ls); /* skip other no-op statements */
1228 if (block_follow(ls, 0)) { /* label is last no-op statement in the block? */
1229 /* assume that locals are already out of scope */
1230 ll->arr[l].nactvar = fs->bl->nactvar;
1231 }
1232 findgotos(ls, &ll->arr[l]);
1233 }
1234
1235
1236 static void whilestat (LexState *ls, int line) {
1237 /* whilestat -> WHILE cond DO block END */
1238 FuncState *fs = ls->fs;
1239 int whileinit;
1240 int condexit;
1241 BlockCnt bl;
1242 luaX_next(ls); /* skip WHILE */
1243 whileinit = luaK_getlabel(fs);
1244 condexit = cond(ls);
1245 enterblock(fs, &bl, 1);
1246 checknext(ls, TK_DO);
1247 block(ls);
1248 luaK_jumpto(fs, whileinit);
1249 check_match(ls, TK_END, TK_WHILE, line);
1250 leaveblock(fs);
1251 luaK_patchtohere(fs, condexit); /* false conditions finish the loop */
1252 }
1253
1254
1255 static void repeatstat (LexState *ls, int line) {
1256 /* repeatstat -> REPEAT block UNTIL cond */
1257 int condexit;
1258 FuncState *fs = ls->fs;
1259 int repeat_init = luaK_getlabel(fs);
1260 BlockCnt bl1, bl2;
1261 enterblock(fs, &bl1, 1); /* loop block */
1262 enterblock(fs, &bl2, 0); /* scope block */
1263 luaX_next(ls); /* skip REPEAT */
1264 statlist(ls);
1265 check_match(ls, TK_UNTIL, TK_REPEAT, line);
1266 condexit = cond(ls); /* read condition (inside scope block) */
1267 if (bl2.upval) /* upvalues? */
1268 luaK_patchclose(fs, condexit, bl2.nactvar);
1269 leaveblock(fs); /* finish scope */
1270 luaK_patchlist(fs, condexit, repeat_init); /* close the loop */
1271 leaveblock(fs); /* finish loop */
1272 }
1273
1274
1275 static int exp1 (LexState *ls) {
1276 expdesc e;
1277 int reg;
1278 expr(ls, &e);
1279 luaK_exp2nextreg(ls->fs, &e);
1280 lua_assert(e.k == VNONRELOC);
1281 reg = e.u.info;
1282 return reg;
1283 }
1284
1285
1286 static void forbody (LexState *ls, int base, int line, int nvars, int isnum) {
1287 /* forbody -> DO block */
1288 BlockCnt bl;
1289 FuncState *fs = ls->fs;
1290 int prep, endfor;
1291 adjustlocalvars(ls, 3); /* control variables */
1292 checknext(ls, TK_DO);
1293 prep = isnum ? luaK_codeAsBx(fs, OP_FORPREP, base, NO_JUMP) : luaK_jump(fs);
1294 enterblock(fs, &bl, 0); /* scope for declared variables */
1295 adjustlocalvars(ls, nvars);
1296 luaK_reserveregs(fs, nvars);
1297 block(ls);
1298 leaveblock(fs); /* end of scope for declared variables */
1299 luaK_patchtohere(fs, prep);
1300 if (isnum) /* numeric for? */
1301 endfor = luaK_codeAsBx(fs, OP_FORLOOP, base, NO_JUMP);
1302 else { /* generic for */
1303 luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars);
1304 luaK_fixline(fs, line);
1305 endfor = luaK_codeAsBx(fs, OP_TFORLOOP, base + 2, NO_JUMP);
1306 }
1307 luaK_patchlist(fs, endfor, prep + 1);
1308 luaK_fixline(fs, line);
1309 }
1310
1311
1312 static void fornum (LexState *ls, TString *varname, int line) {
1313 /* fornum -> NAME = exp1,exp1[,exp1] forbody */
1314 FuncState *fs = ls->fs;
1315 int base = fs->freereg;
1316 new_localvarliteral(ls, "(for index)");
1317 new_localvarliteral(ls, "(for limit)");
1318 new_localvarliteral(ls, "(for step)");
1319 new_localvar(ls, varname);
1320 checknext(ls, '=');
1321 exp1(ls); /* initial value */
1322 checknext(ls, ',');
1323 exp1(ls); /* limit */
1324 if (testnext(ls, ','))
1325 exp1(ls); /* optional step */
1326 else { /* default step = 1 */
1327 luaK_codek(fs, fs->freereg, luaK_numberK(fs, 1));
1328 luaK_reserveregs(fs, 1);
1329 }
1330 forbody(ls, base, line, 1, 1);
1331 }
1332
1333
1334 static void forlist (LexState *ls, TString *indexname) {
1335 /* forlist -> NAME {,NAME} IN explist forbody */
1336 FuncState *fs = ls->fs;
1337 expdesc e;
1338 int nvars = 4; /* gen, state, control, plus at least one declared var */
1339 int line;
1340 int base = fs->freereg;
1341 /* create control variables */
1342 new_localvarliteral(ls, "(for generator)");
1343 new_localvarliteral(ls, "(for state)");
1344 new_localvarliteral(ls, "(for control)");
1345 /* create declared variables */
1346 new_localvar(ls, indexname);
1347 while (testnext(ls, ',')) {
1348 new_localvar(ls, str_checkname(ls));
1349 nvars++;
1350 }
1351 checknext(ls, TK_IN);
1352 line = ls->linenumber;
1353 adjust_assign(ls, 3, explist(ls, &e), &e);
1354 luaK_checkstack(fs, 3); /* extra space to call generator */
1355 forbody(ls, base, line, nvars - 3, 0);
1356 }
1357
1358
1359 static void forstat (LexState *ls, int line) {
1360 /* forstat -> FOR (fornum | forlist) END */
1361 FuncState *fs = ls->fs;
1362 TString *varname;
1363 BlockCnt bl;
1364 enterblock(fs, &bl, 1); /* scope for loop and control variables */
1365 luaX_next(ls); /* skip `for' */
1366 varname = str_checkname(ls); /* first variable name */
1367 switch (ls->t.token) {
1368 case '=': fornum(ls, varname, line); break;
1369 case ',': case TK_IN: forlist(ls, varname); break;
1370 default: luaX_syntaxerror(ls, LUA_QL("=") " or " LUA_QL("in") " expected");
1371 }
1372 check_match(ls, TK_END, TK_FOR, line);
1373 leaveblock(fs); /* loop scope (`break' jumps to this point) */
1374 }
1375
1376
1377 __attribute__((always_inline)) inline
1378 static void test_then_block (LexState *ls, int *escapelist) {
1379 /* test_then_block -> [IF | ELSEIF] cond THEN block */
1380 BlockCnt bl;
1381 FuncState *fs = ls->fs;
1382 expdesc v;
1383 int jf; /* instruction to skip 'then' code (if condition is false) */
1384 luaX_next(ls); /* skip IF or ELSEIF */
1385 expr(ls, &v); /* read condition */
1386 checknext(ls, TK_THEN);
1387 if (ls->t.token == TK_GOTO || ls->t.token == TK_BREAK) {
1388 luaK_goiffalse(ls->fs, &v); /* will jump to label if condition is true */
1389 enterblock(fs, &bl, 0); /* must enter block before 'goto' */
1390 gotostat(ls, v.t); /* handle goto/break */
1391 skipnoopstat(ls); /* skip other no-op statements */
1392 if (block_follow(ls, 0)) { /* 'goto' is the entire block? */
1393 leaveblock(fs);
1394 return; /* and that is it */
1395 }
1396 else /* must skip over 'then' part if condition is false */
1397 jf = luaK_jump(fs);
1398 }
1399 else { /* regular case (not goto/break) */
1400 luaK_goiftrue(ls->fs, &v); /* skip over block if condition is false */
1401 enterblock(fs, &bl, 0);
1402 jf = v.f;
1403 }
1404 statlist(ls); /* `then' part */
1405 leaveblock(fs);
1406 if (ls->t.token == TK_ELSE ||
1407 ls->t.token == TK_ELSEIF) /* followed by 'else'/'elseif'? */
1408 luaK_concat(fs, escapelist, luaK_jump(fs)); /* must jump over it */
1409 luaK_patchtohere(fs, jf);
1410 }
1411
1412
1413 static void ifstat (LexState *ls, int line) {
1414 /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */
1415 FuncState *fs = ls->fs;
1416 int escapelist = NO_JUMP; /* exit list for finished parts */
1417 test_then_block(ls, &escapelist); /* IF cond THEN block */
1418 while (ls->t.token == TK_ELSEIF)
1419 test_then_block(ls, &escapelist); /* ELSEIF cond THEN block */
1420 if (testnext(ls, TK_ELSE))
1421 block(ls); /* `else' part */
1422 check_match(ls, TK_END, TK_IF, line);
1423 luaK_patchtohere(fs, escapelist); /* patch escape list to 'if' end */
1424 }
1425
1426
1427 static void localfunc (LexState *ls) {
1428 expdesc b;
1429 FuncState *fs = ls->fs;
1430 new_localvar(ls, str_checkname(ls)); /* new local variable */
1431 adjustlocalvars(ls, 1); /* enter its scope */
1432 body(ls, &b, 0, ls->linenumber); /* function created in next register */
1433 /* debug information will only see the variable after this point! */
1434 getlocvar(fs, b.u.info)->startpc = fs->pc;
1435 }
1436
1437
1438 static void localstat (LexState *ls) {
1439 /* stat -> LOCAL NAME {`,' NAME} [`=' explist] */
1440 int nvars = 0;
1441 int nexps;
1442 expdesc e;
1443 do {
1444 new_localvar(ls, str_checkname(ls));
1445 nvars++;
1446 } while (testnext(ls, ','));
1447 if (testnext(ls, '='))
1448 nexps = explist(ls, &e);
1449 else {
1450 e.k = VVOID;
1451 nexps = 0;
1452 }
1453 adjust_assign(ls, nvars, nexps, &e);
1454 adjustlocalvars(ls, nvars);
1455 }
1456
1457
1458 static int funcname (LexState *ls, expdesc *v) {
1459 /* funcname -> NAME {fieldsel} [`:' NAME] */
1460 int ismethod = 0;
1461 singlevar(ls, v);
1462 while (ls->t.token == '.')
1463 fieldsel(ls, v);
1464 if (ls->t.token == ':') {
1465 ismethod = 1;
1466 fieldsel(ls, v);
1467 }
1468 return ismethod;
1469 }
1470
1471
1472 static void funcstat (LexState *ls, int line) {
1473 /* funcstat -> FUNCTION funcname body */
1474 int ismethod;
1475 expdesc v, b;
1476 luaX_next(ls); /* skip FUNCTION */
1477 ismethod = funcname(ls, &v);
1478 body(ls, &b, ismethod, line);
1479 luaK_storevar(ls->fs, &v, &b);
1480 luaK_fixline(ls->fs, line); /* definition `happens' in the first line */
1481 }
1482
1483
1484 static void exprstat (LexState *ls) {
1485 /* stat -> func | assignment */
1486 FuncState *fs = ls->fs;
1487 struct LHS_assign v;
1488 suffixedexp(ls, &v.v);
1489 if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */
1490 v.prev = NULL;
1491 assignment(ls, &v, 1);
1492 }
1493 else { /* stat -> func */
1494 check_condition(ls, v.v.k == VCALL, "syntax error");
1495 SETARG_C(getcode(fs, &v.v), 1); /* call statement uses no results */
1496 }
1497 }
1498
1499
1500 static void retstat (LexState *ls) {
1501 /* stat -> RETURN [explist] [';'] */
1502 FuncState *fs = ls->fs;
1503 expdesc e;
1504 int first, nret; /* registers with returned values */
1505 if (block_follow(ls, 1) || ls->t.token == ';')
1506 first = nret = 0; /* return no values */
1507 else {
1508 nret = explist(ls, &e); /* optional return values */
1509 if (hasmultret(e.k)) {
1510 luaK_setmultret(fs, &e);
1511 if (e.k == VCALL && nret == 1) { /* tail call? */
1512 SET_OPCODE(getcode(fs,&e), OP_TAILCALL);
1513 lua_assert(GETARG_A(getcode(fs,&e)) == fs->nactvar);
1514 }
1515 first = fs->nactvar;
1516 nret = LUA_MULTRET; /* return all values */
1517 }
1518 else {
1519 if (nret == 1) /* only one single value? */
1520 first = luaK_exp2anyreg(fs, &e);
1521 else {
1522 luaK_exp2nextreg(fs, &e); /* values must go to the `stack' */
1523 first = fs->nactvar; /* return all `active' values */
1524 lua_assert(nret == fs->freereg - first);
1525 }
1526 }
1527 }
1528 luaK_ret(fs, first, nret);
1529 (void) testnext(ls, ';'); /* skip optional semicolon */
1530 }
1531
1532
1533 static void statement (LexState *ls) {
1534 int line = ls->linenumber; /* may be needed for error messages */
1535 enterlevel(ls);
1536 switch (ls->t.token) {
1537 case ';': { /* stat -> ';' (empty statement) */
1538 luaX_next(ls); /* skip ';' */
1539 break;
1540 }
1541 case TK_IF: { /* stat -> ifstat */
1542 ifstat(ls, line);
1543 break;
1544 }
1545 case TK_WHILE: { /* stat -> whilestat */
1546 whilestat(ls, line);
1547 break;
1548 }
1549 case TK_DO: { /* stat -> DO block END */
1550 luaX_next(ls); /* skip DO */
1551 block(ls);
1552 check_match(ls, TK_END, TK_DO, line);
1553 break;
1554 }
1555 case TK_FOR: { /* stat -> forstat */
1556 forstat(ls, line);
1557 break;
1558 }
1559 case TK_REPEAT: { /* stat -> repeatstat */
1560 repeatstat(ls, line);
1561 break;
1562 }
1563 case TK_FUNCTION: { /* stat -> funcstat */
1564 funcstat(ls, line);
1565 break;
1566 }
1567 case TK_LOCAL: { /* stat -> localstat */
1568 luaX_next(ls); /* skip LOCAL */
1569 if (testnext(ls, TK_FUNCTION)) /* local function? */
1570 localfunc(ls);
1571 else
1572 localstat(ls);
1573 break;
1574 }
1575 case TK_DBCOLON: { /* stat -> label */
1576 luaX_next(ls); /* skip double colon */
1577 labelstat(ls, str_checkname(ls), line);
1578 break;
1579 }
1580 case TK_RETURN: { /* stat -> retstat */
1581 luaX_next(ls); /* skip RETURN */
1582 retstat(ls);
1583 break;
1584 }
1585 case TK_BREAK: /* stat -> breakstat */
1586 case TK_GOTO: { /* stat -> 'goto' NAME */
1587 gotostat(ls, luaK_jump(ls->fs));
1588 break;
1589 }
1590 default: { /* stat -> func | assignment */
1591 exprstat(ls);
1592 break;
1593 }
1594 }
1595 lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg &&
1596 ls->fs->freereg >= ls->fs->nactvar);
1597 ls->fs->freereg = ls->fs->nactvar; /* free registers */
1598 leavelevel(ls);
1599 }
1600
1601 /* }====================================================================== */
1602
1603
1604 /*
1605 ** compiles the main function, which is a regular vararg function with an
1606 ** upvalue named LUA_ENV
1607 */
1608 static void mainfunc (LexState *ls, FuncState *fs) {
1609 BlockCnt bl;
1610 expdesc v;
1611 open_func(ls, fs, &bl);
1612 fs->f->is_vararg = 1; /* main function is always vararg */
1613 init_exp(&v, VLOCAL, 0); /* create and... */
1614 newupvalue(fs, ls->envn, &v); /* ...set environment upvalue */
1615 luaX_next(ls); /* read first token */
1616 statlist(ls); /* parse main body */
1617 check(ls, TK_EOS);
1618 close_func(ls);
1619 }
1620
1621
1622 Closure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
1623 Dyndata *dyd, const char *name, int firstchar) {
1624 LexState lexstate;
1625 FuncState funcstate;
1626 Closure *cl = luaF_newLclosure(L, 1); /* create main closure */
1627 /* anchor closure (to avoid being collected) */
1628 setclLvalue(L, L->top, cl);
1629 incr_top(L);
1630 funcstate.f = cl->l.p = luaF_newproto(L);
1631 funcstate.f->source = luaS_new(L, name); /* create and anchor TString */
1632 lexstate.buff = buff;
1633 lexstate.dyd = dyd;
1634 dyd->actvar.n = dyd->gt.n = dyd->label.n = 0;
1635 luaX_setinput(L, &lexstate, z, funcstate.f->source, firstchar);
1636 mainfunc(&lexstate, &funcstate);
1637 lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs);
1638 /* all scopes should be correctly finished */
1639 lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0);
1640 return cl; /* it's on the stack too */
1641 }