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