xref: /freebsd/contrib/lua/src/lparser.c (revision 8c784bb8cf36911b828652f0bf7e88f443abec50)
1 /*
2 ** $Id: lparser.c $
3 ** Lua Parser
4 ** See Copyright Notice in lua.h
5 */
6 
7 #define lparser_c
8 #define LUA_CORE
9 
10 #include "lprefix.h"
11 
12 
13 #include <limits.h>
14 #include <string.h>
15 
16 #include "lua.h"
17 
18 #include "lcode.h"
19 #include "ldebug.h"
20 #include "ldo.h"
21 #include "lfunc.h"
22 #include "llex.h"
23 #include "lmem.h"
24 #include "lobject.h"
25 #include "lopcodes.h"
26 #include "lparser.h"
27 #include "lstate.h"
28 #include "lstring.h"
29 #include "ltable.h"
30 
31 
32 
33 /* maximum number of local variables per function (must be smaller
34    than 250, due to the bytecode format) */
35 #define MAXVARS		200
36 
37 
38 #define hasmultret(k)		((k) == VCALL || (k) == VVARARG)
39 
40 
41 /* because all strings are unified by the scanner, the parser
42    can use pointer equality for string equality */
43 #define eqstr(a,b)	((a) == (b))
44 
45 
46 /*
47 ** nodes for block list (list of active blocks)
48 */
49 typedef struct BlockCnt {
50   struct BlockCnt *previous;  /* chain */
51   int firstlabel;  /* index of first label in this block */
52   int firstgoto;  /* index of first pending goto in this block */
53   lu_byte nactvar;  /* # active locals outside the block */
54   lu_byte upval;  /* true if some variable in the block is an upvalue */
55   lu_byte isloop;  /* true if 'block' is a loop */
56   lu_byte insidetbc;  /* true if inside the scope of a to-be-closed var. */
57 } BlockCnt;
58 
59 
60 
61 /*
62 ** prototypes for recursive non-terminal functions
63 */
64 static void statement (LexState *ls);
65 static void expr (LexState *ls, expdesc *v);
66 
67 
68 static l_noret error_expected (LexState *ls, int token) {
69   luaX_syntaxerror(ls,
70       luaO_pushfstring(ls->L, "%s expected", luaX_token2str(ls, token)));
71 }
72 
73 
74 static l_noret errorlimit (FuncState *fs, int limit, const char *what) {
75   lua_State *L = fs->ls->L;
76   const char *msg;
77   int line = fs->f->linedefined;
78   const char *where = (line == 0)
79                       ? "main function"
80                       : luaO_pushfstring(L, "function at line %d", line);
81   msg = luaO_pushfstring(L, "too many %s (limit is %d) in %s",
82                              what, limit, where);
83   luaX_syntaxerror(fs->ls, msg);
84 }
85 
86 
87 static void checklimit (FuncState *fs, int v, int l, const char *what) {
88   if (v > l) errorlimit(fs, l, what);
89 }
90 
91 
92 /*
93 ** Test whether next token is 'c'; if so, skip it.
94 */
95 static int testnext (LexState *ls, int c) {
96   if (ls->t.token == c) {
97     luaX_next(ls);
98     return 1;
99   }
100   else return 0;
101 }
102 
103 
104 /*
105 ** Check that next token is 'c'.
106 */
107 static void check (LexState *ls, int c) {
108   if (ls->t.token != c)
109     error_expected(ls, c);
110 }
111 
112 
113 /*
114 ** Check that next token is 'c' and skip it.
115 */
116 static 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 /*
126 ** Check that next token is 'what' and skip it. In case of error,
127 ** raise an error that the expected 'what' should match a 'who'
128 ** in line 'where' (if that is not the current line).
129 */
130 static void check_match (LexState *ls, int what, int who, int where) {
131   if (l_unlikely(!testnext(ls, what))) {
132     if (where == ls->linenumber)  /* all in the same line? */
133       error_expected(ls, what);  /* do not need a complex message */
134     else {
135       luaX_syntaxerror(ls, luaO_pushfstring(ls->L,
136              "%s expected (to close %s at line %d)",
137               luaX_token2str(ls, what), luaX_token2str(ls, who), where));
138     }
139   }
140 }
141 
142 
143 static TString *str_checkname (LexState *ls) {
144   TString *ts;
145   check(ls, TK_NAME);
146   ts = ls->t.seminfo.ts;
147   luaX_next(ls);
148   return ts;
149 }
150 
151 
152 static void init_exp (expdesc *e, expkind k, int i) {
153   e->f = e->t = NO_JUMP;
154   e->k = k;
155   e->u.info = i;
156 }
157 
158 
159 static void codestring (expdesc *e, TString *s) {
160   e->f = e->t = NO_JUMP;
161   e->k = VKSTR;
162   e->u.strval = s;
163 }
164 
165 
166 static void codename (LexState *ls, expdesc *e) {
167   codestring(e, str_checkname(ls));
168 }
169 
170 
171 /*
172 ** Register a new local variable in the active 'Proto' (for debug
173 ** information).
174 */
175 static int registerlocalvar (LexState *ls, FuncState *fs, TString *varname) {
176   Proto *f = fs->f;
177   int oldsize = f->sizelocvars;
178   luaM_growvector(ls->L, f->locvars, fs->ndebugvars, f->sizelocvars,
179                   LocVar, SHRT_MAX, "local variables");
180   while (oldsize < f->sizelocvars)
181     f->locvars[oldsize++].varname = NULL;
182   f->locvars[fs->ndebugvars].varname = varname;
183   f->locvars[fs->ndebugvars].startpc = fs->pc;
184   luaC_objbarrier(ls->L, f, varname);
185   return fs->ndebugvars++;
186 }
187 
188 
189 /*
190 ** Create a new local variable with the given 'name'. Return its index
191 ** in the function.
192 */
193 static int new_localvar (LexState *ls, TString *name) {
194   lua_State *L = ls->L;
195   FuncState *fs = ls->fs;
196   Dyndata *dyd = ls->dyd;
197   Vardesc *var;
198   checklimit(fs, dyd->actvar.n + 1 - fs->firstlocal,
199                  MAXVARS, "local variables");
200   luaM_growvector(L, dyd->actvar.arr, dyd->actvar.n + 1,
201                   dyd->actvar.size, Vardesc, USHRT_MAX, "local variables");
202   var = &dyd->actvar.arr[dyd->actvar.n++];
203   var->vd.kind = VDKREG;  /* default */
204   var->vd.name = name;
205   return dyd->actvar.n - 1 - fs->firstlocal;
206 }
207 
208 #define new_localvarliteral(ls,v) \
209     new_localvar(ls,  \
210       luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char)) - 1));
211 
212 
213 
214 /*
215 ** Return the "variable description" (Vardesc) of a given variable.
216 ** (Unless noted otherwise, all variables are referred to by their
217 ** compiler indices.)
218 */
219 static Vardesc *getlocalvardesc (FuncState *fs, int vidx) {
220   return &fs->ls->dyd->actvar.arr[fs->firstlocal + vidx];
221 }
222 
223 
224 /*
225 ** Convert 'nvar', a compiler index level, to its corresponding
226 ** register. For that, search for the highest variable below that level
227 ** that is in a register and uses its register index ('ridx') plus one.
228 */
229 static int reglevel (FuncState *fs, int nvar) {
230   while (nvar-- > 0) {
231     Vardesc *vd = getlocalvardesc(fs, nvar);  /* get previous variable */
232     if (vd->vd.kind != RDKCTC)  /* is in a register? */
233       return vd->vd.ridx + 1;
234   }
235   return 0;  /* no variables in registers */
236 }
237 
238 
239 /*
240 ** Return the number of variables in the register stack for the given
241 ** function.
242 */
243 int luaY_nvarstack (FuncState *fs) {
244   return reglevel(fs, fs->nactvar);
245 }
246 
247 
248 /*
249 ** Get the debug-information entry for current variable 'vidx'.
250 */
251 static LocVar *localdebuginfo (FuncState *fs, int vidx) {
252   Vardesc *vd = getlocalvardesc(fs,  vidx);
253   if (vd->vd.kind == RDKCTC)
254     return NULL;  /* no debug info. for constants */
255   else {
256     int idx = vd->vd.pidx;
257     lua_assert(idx < fs->ndebugvars);
258     return &fs->f->locvars[idx];
259   }
260 }
261 
262 
263 /*
264 ** Create an expression representing variable 'vidx'
265 */
266 static void init_var (FuncState *fs, expdesc *e, int vidx) {
267   e->f = e->t = NO_JUMP;
268   e->k = VLOCAL;
269   e->u.var.vidx = vidx;
270   e->u.var.ridx = getlocalvardesc(fs, vidx)->vd.ridx;
271 }
272 
273 
274 /*
275 ** Raises an error if variable described by 'e' is read only
276 */
277 static void check_readonly (LexState *ls, expdesc *e) {
278   FuncState *fs = ls->fs;
279   TString *varname = NULL;  /* to be set if variable is const */
280   switch (e->k) {
281     case VCONST: {
282       varname = ls->dyd->actvar.arr[e->u.info].vd.name;
283       break;
284     }
285     case VLOCAL: {
286       Vardesc *vardesc = getlocalvardesc(fs, e->u.var.vidx);
287       if (vardesc->vd.kind != VDKREG)  /* not a regular variable? */
288         varname = vardesc->vd.name;
289       break;
290     }
291     case VUPVAL: {
292       Upvaldesc *up = &fs->f->upvalues[e->u.info];
293       if (up->kind != VDKREG)
294         varname = up->name;
295       break;
296     }
297     default:
298       return;  /* other cases cannot be read-only */
299   }
300   if (varname) {
301     const char *msg = luaO_pushfstring(ls->L,
302        "attempt to assign to const variable '%s'", getstr(varname));
303     luaK_semerror(ls, msg);  /* error */
304   }
305 }
306 
307 
308 /*
309 ** Start the scope for the last 'nvars' created variables.
310 */
311 static void adjustlocalvars (LexState *ls, int nvars) {
312   FuncState *fs = ls->fs;
313   int reglevel = luaY_nvarstack(fs);
314   int i;
315   for (i = 0; i < nvars; i++) {
316     int vidx = fs->nactvar++;
317     Vardesc *var = getlocalvardesc(fs, vidx);
318     var->vd.ridx = reglevel++;
319     var->vd.pidx = registerlocalvar(ls, fs, var->vd.name);
320   }
321 }
322 
323 
324 /*
325 ** Close the scope for all variables up to level 'tolevel'.
326 ** (debug info.)
327 */
328 static void removevars (FuncState *fs, int tolevel) {
329   fs->ls->dyd->actvar.n -= (fs->nactvar - tolevel);
330   while (fs->nactvar > tolevel) {
331     LocVar *var = localdebuginfo(fs, --fs->nactvar);
332     if (var)  /* does it have debug information? */
333       var->endpc = fs->pc;
334   }
335 }
336 
337 
338 /*
339 ** Search the upvalues of the function 'fs' for one
340 ** with the given 'name'.
341 */
342 static int searchupvalue (FuncState *fs, TString *name) {
343   int i;
344   Upvaldesc *up = fs->f->upvalues;
345   for (i = 0; i < fs->nups; i++) {
346     if (eqstr(up[i].name, name)) return i;
347   }
348   return -1;  /* not found */
349 }
350 
351 
352 static Upvaldesc *allocupvalue (FuncState *fs) {
353   Proto *f = fs->f;
354   int oldsize = f->sizeupvalues;
355   checklimit(fs, fs->nups + 1, MAXUPVAL, "upvalues");
356   luaM_growvector(fs->ls->L, f->upvalues, fs->nups, f->sizeupvalues,
357                   Upvaldesc, MAXUPVAL, "upvalues");
358   while (oldsize < f->sizeupvalues)
359     f->upvalues[oldsize++].name = NULL;
360   return &f->upvalues[fs->nups++];
361 }
362 
363 
364 static int newupvalue (FuncState *fs, TString *name, expdesc *v) {
365   Upvaldesc *up = allocupvalue(fs);
366   FuncState *prev = fs->prev;
367   if (v->k == VLOCAL) {
368     up->instack = 1;
369     up->idx = v->u.var.ridx;
370     up->kind = getlocalvardesc(prev, v->u.var.vidx)->vd.kind;
371     lua_assert(eqstr(name, getlocalvardesc(prev, v->u.var.vidx)->vd.name));
372   }
373   else {
374     up->instack = 0;
375     up->idx = cast_byte(v->u.info);
376     up->kind = prev->f->upvalues[v->u.info].kind;
377     lua_assert(eqstr(name, prev->f->upvalues[v->u.info].name));
378   }
379   up->name = name;
380   luaC_objbarrier(fs->ls->L, fs->f, name);
381   return fs->nups - 1;
382 }
383 
384 
385 /*
386 ** Look for an active local variable with the name 'n' in the
387 ** function 'fs'. If found, initialize 'var' with it and return
388 ** its expression kind; otherwise return -1.
389 */
390 static int searchvar (FuncState *fs, TString *n, expdesc *var) {
391   int i;
392   for (i = cast_int(fs->nactvar) - 1; i >= 0; i--) {
393     Vardesc *vd = getlocalvardesc(fs, i);
394     if (eqstr(n, vd->vd.name)) {  /* found? */
395       if (vd->vd.kind == RDKCTC)  /* compile-time constant? */
396         init_exp(var, VCONST, fs->firstlocal + i);
397       else  /* real variable */
398         init_var(fs, var, i);
399       return var->k;
400     }
401   }
402   return -1;  /* not found */
403 }
404 
405 
406 /*
407 ** Mark block where variable at given level was defined
408 ** (to emit close instructions later).
409 */
410 static void markupval (FuncState *fs, int level) {
411   BlockCnt *bl = fs->bl;
412   while (bl->nactvar > level)
413     bl = bl->previous;
414   bl->upval = 1;
415   fs->needclose = 1;
416 }
417 
418 
419 /*
420 ** Mark that current block has a to-be-closed variable.
421 */
422 static void marktobeclosed (FuncState *fs) {
423   BlockCnt *bl = fs->bl;
424   bl->upval = 1;
425   bl->insidetbc = 1;
426   fs->needclose = 1;
427 }
428 
429 
430 /*
431 ** Find a variable with the given name 'n'. If it is an upvalue, add
432 ** this upvalue into all intermediate functions. If it is a global, set
433 ** 'var' as 'void' as a flag.
434 */
435 static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {
436   if (fs == NULL)  /* no more levels? */
437     init_exp(var, VVOID, 0);  /* default is global */
438   else {
439     int v = searchvar(fs, n, var);  /* look up locals at current level */
440     if (v >= 0) {  /* found? */
441       if (v == VLOCAL && !base)
442         markupval(fs, var->u.var.vidx);  /* local will be used as an upval */
443     }
444     else {  /* not found as local at current level; try upvalues */
445       int idx = searchupvalue(fs, n);  /* try existing upvalues */
446       if (idx < 0) {  /* not found? */
447         singlevaraux(fs->prev, n, var, 0);  /* try upper levels */
448         if (var->k == VLOCAL || var->k == VUPVAL)  /* local or upvalue? */
449           idx  = newupvalue(fs, n, var);  /* will be a new upvalue */
450         else  /* it is a global or a constant */
451           return;  /* don't need to do anything at this level */
452       }
453       init_exp(var, VUPVAL, idx);  /* new or old upvalue */
454     }
455   }
456 }
457 
458 
459 /*
460 ** Find a variable with the given name 'n', handling global variables
461 ** too.
462 */
463 static void singlevar (LexState *ls, expdesc *var) {
464   TString *varname = str_checkname(ls);
465   FuncState *fs = ls->fs;
466   singlevaraux(fs, varname, var, 1);
467   if (var->k == VVOID) {  /* global name? */
468     expdesc key;
469     singlevaraux(fs, ls->envn, var, 1);  /* get environment variable */
470     lua_assert(var->k != VVOID);  /* this one must exist */
471     codestring(&key, varname);  /* key is variable name */
472     luaK_indexed(fs, var, &key);  /* env[varname] */
473   }
474 }
475 
476 
477 /*
478 ** Adjust the number of results from an expression list 'e' with 'nexps'
479 ** expressions to 'nvars' values.
480 */
481 static void adjust_assign (LexState *ls, int nvars, int nexps, expdesc *e) {
482   FuncState *fs = ls->fs;
483   int needed = nvars - nexps;  /* extra values needed */
484   if (hasmultret(e->k)) {  /* last expression has multiple returns? */
485     int extra = needed + 1;  /* discount last expression itself */
486     if (extra < 0)
487       extra = 0;
488     luaK_setreturns(fs, e, extra);  /* last exp. provides the difference */
489   }
490   else {
491     if (e->k != VVOID)  /* at least one expression? */
492       luaK_exp2nextreg(fs, e);  /* close last expression */
493     if (needed > 0)  /* missing values? */
494       luaK_nil(fs, fs->freereg, needed);  /* complete with nils */
495   }
496   if (needed > 0)
497     luaK_reserveregs(fs, needed);  /* registers for extra values */
498   else  /* adding 'needed' is actually a subtraction */
499     fs->freereg += needed;  /* remove extra values */
500 }
501 
502 
503 #define enterlevel(ls)	luaE_incCstack(ls->L)
504 
505 
506 #define leavelevel(ls) ((ls)->L->nCcalls--)
507 
508 
509 /*
510 ** Generates an error that a goto jumps into the scope of some
511 ** local variable.
512 */
513 static l_noret jumpscopeerror (LexState *ls, Labeldesc *gt) {
514   const char *varname = getstr(getlocalvardesc(ls->fs, gt->nactvar)->vd.name);
515   const char *msg = "<goto %s> at line %d jumps into the scope of local '%s'";
516   msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line, varname);
517   luaK_semerror(ls, msg);  /* raise the error */
518 }
519 
520 
521 /*
522 ** Solves the goto at index 'g' to given 'label' and removes it
523 ** from the list of pending goto's.
524 ** If it jumps into the scope of some variable, raises an error.
525 */
526 static void solvegoto (LexState *ls, int g, Labeldesc *label) {
527   int i;
528   Labellist *gl = &ls->dyd->gt;  /* list of goto's */
529   Labeldesc *gt = &gl->arr[g];  /* goto to be resolved */
530   lua_assert(eqstr(gt->name, label->name));
531   if (l_unlikely(gt->nactvar < label->nactvar))  /* enter some scope? */
532     jumpscopeerror(ls, gt);
533   luaK_patchlist(ls->fs, gt->pc, label->pc);
534   for (i = g; i < gl->n - 1; i++)  /* remove goto from pending list */
535     gl->arr[i] = gl->arr[i + 1];
536   gl->n--;
537 }
538 
539 
540 /*
541 ** Search for an active label with the given name.
542 */
543 static Labeldesc *findlabel (LexState *ls, TString *name) {
544   int i;
545   Dyndata *dyd = ls->dyd;
546   /* check labels in current function for a match */
547   for (i = ls->fs->firstlabel; i < dyd->label.n; i++) {
548     Labeldesc *lb = &dyd->label.arr[i];
549     if (eqstr(lb->name, name))  /* correct label? */
550       return lb;
551   }
552   return NULL;  /* label not found */
553 }
554 
555 
556 /*
557 ** Adds a new label/goto in the corresponding list.
558 */
559 static int newlabelentry (LexState *ls, Labellist *l, TString *name,
560                           int line, int pc) {
561   int n = l->n;
562   luaM_growvector(ls->L, l->arr, n, l->size,
563                   Labeldesc, SHRT_MAX, "labels/gotos");
564   l->arr[n].name = name;
565   l->arr[n].line = line;
566   l->arr[n].nactvar = ls->fs->nactvar;
567   l->arr[n].close = 0;
568   l->arr[n].pc = pc;
569   l->n = n + 1;
570   return n;
571 }
572 
573 
574 static int newgotoentry (LexState *ls, TString *name, int line, int pc) {
575   return newlabelentry(ls, &ls->dyd->gt, name, line, pc);
576 }
577 
578 
579 /*
580 ** Solves forward jumps. Check whether new label 'lb' matches any
581 ** pending gotos in current block and solves them. Return true
582 ** if any of the goto's need to close upvalues.
583 */
584 static int solvegotos (LexState *ls, Labeldesc *lb) {
585   Labellist *gl = &ls->dyd->gt;
586   int i = ls->fs->bl->firstgoto;
587   int needsclose = 0;
588   while (i < gl->n) {
589     if (eqstr(gl->arr[i].name, lb->name)) {
590       needsclose |= gl->arr[i].close;
591       solvegoto(ls, i, lb);  /* will remove 'i' from the list */
592     }
593     else
594       i++;
595   }
596   return needsclose;
597 }
598 
599 
600 /*
601 ** Create a new label with the given 'name' at the given 'line'.
602 ** 'last' tells whether label is the last non-op statement in its
603 ** block. Solves all pending goto's to this new label and adds
604 ** a close instruction if necessary.
605 ** Returns true iff it added a close instruction.
606 */
607 static int createlabel (LexState *ls, TString *name, int line,
608                         int last) {
609   FuncState *fs = ls->fs;
610   Labellist *ll = &ls->dyd->label;
611   int l = newlabelentry(ls, ll, name, line, luaK_getlabel(fs));
612   if (last) {  /* label is last no-op statement in the block? */
613     /* assume that locals are already out of scope */
614     ll->arr[l].nactvar = fs->bl->nactvar;
615   }
616   if (solvegotos(ls, &ll->arr[l])) {  /* need close? */
617     luaK_codeABC(fs, OP_CLOSE, luaY_nvarstack(fs), 0, 0);
618     return 1;
619   }
620   return 0;
621 }
622 
623 
624 /*
625 ** Adjust pending gotos to outer level of a block.
626 */
627 static void movegotosout (FuncState *fs, BlockCnt *bl) {
628   int i;
629   Labellist *gl = &fs->ls->dyd->gt;
630   /* correct pending gotos to current block */
631   for (i = bl->firstgoto; i < gl->n; i++) {  /* for each pending goto */
632     Labeldesc *gt = &gl->arr[i];
633     /* leaving a variable scope? */
634     if (reglevel(fs, gt->nactvar) > reglevel(fs, bl->nactvar))
635       gt->close |= bl->upval;  /* jump may need a close */
636     gt->nactvar = bl->nactvar;  /* update goto level */
637   }
638 }
639 
640 
641 static void enterblock (FuncState *fs, BlockCnt *bl, lu_byte isloop) {
642   bl->isloop = isloop;
643   bl->nactvar = fs->nactvar;
644   bl->firstlabel = fs->ls->dyd->label.n;
645   bl->firstgoto = fs->ls->dyd->gt.n;
646   bl->upval = 0;
647   bl->insidetbc = (fs->bl != NULL && fs->bl->insidetbc);
648   bl->previous = fs->bl;
649   fs->bl = bl;
650   lua_assert(fs->freereg == luaY_nvarstack(fs));
651 }
652 
653 
654 /*
655 ** generates an error for an undefined 'goto'.
656 */
657 static l_noret undefgoto (LexState *ls, Labeldesc *gt) {
658   const char *msg;
659   if (eqstr(gt->name, luaS_newliteral(ls->L, "break"))) {
660     msg = "break outside loop at line %d";
661     msg = luaO_pushfstring(ls->L, msg, gt->line);
662   }
663   else {
664     msg = "no visible label '%s' for <goto> at line %d";
665     msg = luaO_pushfstring(ls->L, msg, getstr(gt->name), gt->line);
666   }
667   luaK_semerror(ls, msg);
668 }
669 
670 
671 static void leaveblock (FuncState *fs) {
672   BlockCnt *bl = fs->bl;
673   LexState *ls = fs->ls;
674   int hasclose = 0;
675   int stklevel = reglevel(fs, bl->nactvar);  /* level outside the block */
676   if (bl->isloop)  /* fix pending breaks? */
677     hasclose = createlabel(ls, luaS_newliteral(ls->L, "break"), 0, 0);
678   if (!hasclose && bl->previous && bl->upval)
679     luaK_codeABC(fs, OP_CLOSE, stklevel, 0, 0);
680   fs->bl = bl->previous;
681   removevars(fs, bl->nactvar);
682   lua_assert(bl->nactvar == fs->nactvar);
683   fs->freereg = stklevel;  /* free registers */
684   ls->dyd->label.n = bl->firstlabel;  /* remove local labels */
685   if (bl->previous)  /* inner block? */
686     movegotosout(fs, bl);  /* update pending gotos to outer block */
687   else {
688     if (bl->firstgoto < ls->dyd->gt.n)  /* pending gotos in outer block? */
689       undefgoto(ls, &ls->dyd->gt.arr[bl->firstgoto]);  /* error */
690   }
691 }
692 
693 
694 /*
695 ** adds a new prototype into list of prototypes
696 */
697 static Proto *addprototype (LexState *ls) {
698   Proto *clp;
699   lua_State *L = ls->L;
700   FuncState *fs = ls->fs;
701   Proto *f = fs->f;  /* prototype of current function */
702   if (fs->np >= f->sizep) {
703     int oldsize = f->sizep;
704     luaM_growvector(L, f->p, fs->np, f->sizep, Proto *, MAXARG_Bx, "functions");
705     while (oldsize < f->sizep)
706       f->p[oldsize++] = NULL;
707   }
708   f->p[fs->np++] = clp = luaF_newproto(L);
709   luaC_objbarrier(L, f, clp);
710   return clp;
711 }
712 
713 
714 /*
715 ** codes instruction to create new closure in parent function.
716 ** The OP_CLOSURE instruction uses the last available register,
717 ** so that, if it invokes the GC, the GC knows which registers
718 ** are in use at that time.
719 
720 */
721 static void codeclosure (LexState *ls, expdesc *v) {
722   FuncState *fs = ls->fs->prev;
723   init_exp(v, VRELOC, luaK_codeABx(fs, OP_CLOSURE, 0, fs->np - 1));
724   luaK_exp2nextreg(fs, v);  /* fix it at the last register */
725 }
726 
727 
728 static void open_func (LexState *ls, FuncState *fs, BlockCnt *bl) {
729   Proto *f = fs->f;
730   fs->prev = ls->fs;  /* linked list of funcstates */
731   fs->ls = ls;
732   ls->fs = fs;
733   fs->pc = 0;
734   fs->previousline = f->linedefined;
735   fs->iwthabs = 0;
736   fs->lasttarget = 0;
737   fs->freereg = 0;
738   fs->nk = 0;
739   fs->nabslineinfo = 0;
740   fs->np = 0;
741   fs->nups = 0;
742   fs->ndebugvars = 0;
743   fs->nactvar = 0;
744   fs->needclose = 0;
745   fs->firstlocal = ls->dyd->actvar.n;
746   fs->firstlabel = ls->dyd->label.n;
747   fs->bl = NULL;
748   f->source = ls->source;
749   luaC_objbarrier(ls->L, f, f->source);
750   f->maxstacksize = 2;  /* registers 0/1 are always valid */
751   enterblock(fs, bl, 0);
752 }
753 
754 
755 static void close_func (LexState *ls) {
756   lua_State *L = ls->L;
757   FuncState *fs = ls->fs;
758   Proto *f = fs->f;
759   luaK_ret(fs, luaY_nvarstack(fs), 0);  /* final return */
760   leaveblock(fs);
761   lua_assert(fs->bl == NULL);
762   luaK_finish(fs);
763   luaM_shrinkvector(L, f->code, f->sizecode, fs->pc, Instruction);
764   luaM_shrinkvector(L, f->lineinfo, f->sizelineinfo, fs->pc, ls_byte);
765   luaM_shrinkvector(L, f->abslineinfo, f->sizeabslineinfo,
766                        fs->nabslineinfo, AbsLineInfo);
767   luaM_shrinkvector(L, f->k, f->sizek, fs->nk, TValue);
768   luaM_shrinkvector(L, f->p, f->sizep, fs->np, Proto *);
769   luaM_shrinkvector(L, f->locvars, f->sizelocvars, fs->ndebugvars, LocVar);
770   luaM_shrinkvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc);
771   ls->fs = fs->prev;
772   luaC_checkGC(L);
773 }
774 
775 
776 
777 /*============================================================*/
778 /* GRAMMAR RULES */
779 /*============================================================*/
780 
781 
782 /*
783 ** check whether current token is in the follow set of a block.
784 ** 'until' closes syntactical blocks, but do not close scope,
785 ** so it is handled in separate.
786 */
787 static int block_follow (LexState *ls, int withuntil) {
788   switch (ls->t.token) {
789     case TK_ELSE: case TK_ELSEIF:
790     case TK_END: case TK_EOS:
791       return 1;
792     case TK_UNTIL: return withuntil;
793     default: return 0;
794   }
795 }
796 
797 
798 static void statlist (LexState *ls) {
799   /* statlist -> { stat [';'] } */
800   while (!block_follow(ls, 1)) {
801     if (ls->t.token == TK_RETURN) {
802       statement(ls);
803       return;  /* 'return' must be last statement */
804     }
805     statement(ls);
806   }
807 }
808 
809 
810 static void fieldsel (LexState *ls, expdesc *v) {
811   /* fieldsel -> ['.' | ':'] NAME */
812   FuncState *fs = ls->fs;
813   expdesc key;
814   luaK_exp2anyregup(fs, v);
815   luaX_next(ls);  /* skip the dot or colon */
816   codename(ls, &key);
817   luaK_indexed(fs, v, &key);
818 }
819 
820 
821 static void yindex (LexState *ls, expdesc *v) {
822   /* index -> '[' expr ']' */
823   luaX_next(ls);  /* skip the '[' */
824   expr(ls, v);
825   luaK_exp2val(ls->fs, v);
826   checknext(ls, ']');
827 }
828 
829 
830 /*
831 ** {======================================================================
832 ** Rules for Constructors
833 ** =======================================================================
834 */
835 
836 
837 typedef struct ConsControl {
838   expdesc v;  /* last list item read */
839   expdesc *t;  /* table descriptor */
840   int nh;  /* total number of 'record' elements */
841   int na;  /* number of array elements already stored */
842   int tostore;  /* number of array elements pending to be stored */
843 } ConsControl;
844 
845 
846 static void recfield (LexState *ls, ConsControl *cc) {
847   /* recfield -> (NAME | '['exp']') = exp */
848   FuncState *fs = ls->fs;
849   int reg = ls->fs->freereg;
850   expdesc tab, key, val;
851   if (ls->t.token == TK_NAME) {
852     checklimit(fs, cc->nh, MAX_INT, "items in a constructor");
853     codename(ls, &key);
854   }
855   else  /* ls->t.token == '[' */
856     yindex(ls, &key);
857   cc->nh++;
858   checknext(ls, '=');
859   tab = *cc->t;
860   luaK_indexed(fs, &tab, &key);
861   expr(ls, &val);
862   luaK_storevar(fs, &tab, &val);
863   fs->freereg = reg;  /* free registers */
864 }
865 
866 
867 static void closelistfield (FuncState *fs, ConsControl *cc) {
868   if (cc->v.k == VVOID) return;  /* there is no list item */
869   luaK_exp2nextreg(fs, &cc->v);
870   cc->v.k = VVOID;
871   if (cc->tostore == LFIELDS_PER_FLUSH) {
872     luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore);  /* flush */
873     cc->na += cc->tostore;
874     cc->tostore = 0;  /* no more items pending */
875   }
876 }
877 
878 
879 static void lastlistfield (FuncState *fs, ConsControl *cc) {
880   if (cc->tostore == 0) return;
881   if (hasmultret(cc->v.k)) {
882     luaK_setmultret(fs, &cc->v);
883     luaK_setlist(fs, cc->t->u.info, cc->na, LUA_MULTRET);
884     cc->na--;  /* do not count last expression (unknown number of elements) */
885   }
886   else {
887     if (cc->v.k != VVOID)
888       luaK_exp2nextreg(fs, &cc->v);
889     luaK_setlist(fs, cc->t->u.info, cc->na, cc->tostore);
890   }
891   cc->na += cc->tostore;
892 }
893 
894 
895 static void listfield (LexState *ls, ConsControl *cc) {
896   /* listfield -> exp */
897   expr(ls, &cc->v);
898   cc->tostore++;
899 }
900 
901 
902 static void field (LexState *ls, ConsControl *cc) {
903   /* field -> listfield | recfield */
904   switch(ls->t.token) {
905     case TK_NAME: {  /* may be 'listfield' or 'recfield' */
906       if (luaX_lookahead(ls) != '=')  /* expression? */
907         listfield(ls, cc);
908       else
909         recfield(ls, cc);
910       break;
911     }
912     case '[': {
913       recfield(ls, cc);
914       break;
915     }
916     default: {
917       listfield(ls, cc);
918       break;
919     }
920   }
921 }
922 
923 
924 static void constructor (LexState *ls, expdesc *t) {
925   /* constructor -> '{' [ field { sep field } [sep] ] '}'
926      sep -> ',' | ';' */
927   FuncState *fs = ls->fs;
928   int line = ls->linenumber;
929   int pc = luaK_codeABC(fs, OP_NEWTABLE, 0, 0, 0);
930   ConsControl cc;
931   luaK_code(fs, 0);  /* space for extra arg. */
932   cc.na = cc.nh = cc.tostore = 0;
933   cc.t = t;
934   init_exp(t, VNONRELOC, fs->freereg);  /* table will be at stack top */
935   luaK_reserveregs(fs, 1);
936   init_exp(&cc.v, VVOID, 0);  /* no value (yet) */
937   checknext(ls, '{');
938   do {
939     lua_assert(cc.v.k == VVOID || cc.tostore > 0);
940     if (ls->t.token == '}') break;
941     closelistfield(fs, &cc);
942     field(ls, &cc);
943   } while (testnext(ls, ',') || testnext(ls, ';'));
944   check_match(ls, '}', '{', line);
945   lastlistfield(fs, &cc);
946   luaK_settablesize(fs, pc, t->u.info, cc.na, cc.nh);
947 }
948 
949 /* }====================================================================== */
950 
951 
952 static void setvararg (FuncState *fs, int nparams) {
953   fs->f->is_vararg = 1;
954   luaK_codeABC(fs, OP_VARARGPREP, nparams, 0, 0);
955 }
956 
957 
958 static void parlist (LexState *ls) {
959   /* parlist -> [ {NAME ','} (NAME | '...') ] */
960   FuncState *fs = ls->fs;
961   Proto *f = fs->f;
962   int nparams = 0;
963   int isvararg = 0;
964   if (ls->t.token != ')') {  /* is 'parlist' not empty? */
965     do {
966       switch (ls->t.token) {
967         case TK_NAME: {
968           new_localvar(ls, str_checkname(ls));
969           nparams++;
970           break;
971         }
972         case TK_DOTS: {
973           luaX_next(ls);
974           isvararg = 1;
975           break;
976         }
977         default: luaX_syntaxerror(ls, "<name> or '...' expected");
978       }
979     } while (!isvararg && testnext(ls, ','));
980   }
981   adjustlocalvars(ls, nparams);
982   f->numparams = cast_byte(fs->nactvar);
983   if (isvararg)
984     setvararg(fs, f->numparams);  /* declared vararg */
985   luaK_reserveregs(fs, fs->nactvar);  /* reserve registers for parameters */
986 }
987 
988 
989 static void body (LexState *ls, expdesc *e, int ismethod, int line) {
990   /* body ->  '(' parlist ')' block END */
991   FuncState new_fs;
992   BlockCnt bl;
993   new_fs.f = addprototype(ls);
994   new_fs.f->linedefined = line;
995   open_func(ls, &new_fs, &bl);
996   checknext(ls, '(');
997   if (ismethod) {
998     new_localvarliteral(ls, "self");  /* create 'self' parameter */
999     adjustlocalvars(ls, 1);
1000   }
1001   parlist(ls);
1002   checknext(ls, ')');
1003   statlist(ls);
1004   new_fs.f->lastlinedefined = ls->linenumber;
1005   check_match(ls, TK_END, TK_FUNCTION, line);
1006   codeclosure(ls, e);
1007   close_func(ls);
1008 }
1009 
1010 
1011 static int explist (LexState *ls, expdesc *v) {
1012   /* explist -> expr { ',' expr } */
1013   int n = 1;  /* at least one expression */
1014   expr(ls, v);
1015   while (testnext(ls, ',')) {
1016     luaK_exp2nextreg(ls->fs, v);
1017     expr(ls, v);
1018     n++;
1019   }
1020   return n;
1021 }
1022 
1023 
1024 static void funcargs (LexState *ls, expdesc *f, int line) {
1025   FuncState *fs = ls->fs;
1026   expdesc args;
1027   int base, nparams;
1028   switch (ls->t.token) {
1029     case '(': {  /* funcargs -> '(' [ explist ] ')' */
1030       luaX_next(ls);
1031       if (ls->t.token == ')')  /* arg list is empty? */
1032         args.k = VVOID;
1033       else {
1034         explist(ls, &args);
1035         if (hasmultret(args.k))
1036           luaK_setmultret(fs, &args);
1037       }
1038       check_match(ls, ')', '(', line);
1039       break;
1040     }
1041     case '{': {  /* funcargs -> constructor */
1042       constructor(ls, &args);
1043       break;
1044     }
1045     case TK_STRING: {  /* funcargs -> STRING */
1046       codestring(&args, ls->t.seminfo.ts);
1047       luaX_next(ls);  /* must use 'seminfo' before 'next' */
1048       break;
1049     }
1050     default: {
1051       luaX_syntaxerror(ls, "function arguments expected");
1052     }
1053   }
1054   lua_assert(f->k == VNONRELOC);
1055   base = f->u.info;  /* base register for call */
1056   if (hasmultret(args.k))
1057     nparams = LUA_MULTRET;  /* open call */
1058   else {
1059     if (args.k != VVOID)
1060       luaK_exp2nextreg(fs, &args);  /* close last argument */
1061     nparams = fs->freereg - (base+1);
1062   }
1063   init_exp(f, VCALL, luaK_codeABC(fs, OP_CALL, base, nparams+1, 2));
1064   luaK_fixline(fs, line);
1065   fs->freereg = base+1;  /* call remove function and arguments and leaves
1066                             (unless changed) one result */
1067 }
1068 
1069 
1070 
1071 
1072 /*
1073 ** {======================================================================
1074 ** Expression parsing
1075 ** =======================================================================
1076 */
1077 
1078 
1079 static void primaryexp (LexState *ls, expdesc *v) {
1080   /* primaryexp -> NAME | '(' expr ')' */
1081   switch (ls->t.token) {
1082     case '(': {
1083       int line = ls->linenumber;
1084       luaX_next(ls);
1085       expr(ls, v);
1086       check_match(ls, ')', '(', line);
1087       luaK_dischargevars(ls->fs, v);
1088       return;
1089     }
1090     case TK_NAME: {
1091       singlevar(ls, v);
1092       return;
1093     }
1094     default: {
1095       luaX_syntaxerror(ls, "unexpected symbol");
1096     }
1097   }
1098 }
1099 
1100 
1101 static void suffixedexp (LexState *ls, expdesc *v) {
1102   /* suffixedexp ->
1103        primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */
1104   FuncState *fs = ls->fs;
1105   int line = ls->linenumber;
1106   primaryexp(ls, v);
1107   for (;;) {
1108     switch (ls->t.token) {
1109       case '.': {  /* fieldsel */
1110         fieldsel(ls, v);
1111         break;
1112       }
1113       case '[': {  /* '[' exp ']' */
1114         expdesc key;
1115         luaK_exp2anyregup(fs, v);
1116         yindex(ls, &key);
1117         luaK_indexed(fs, v, &key);
1118         break;
1119       }
1120       case ':': {  /* ':' NAME funcargs */
1121         expdesc key;
1122         luaX_next(ls);
1123         codename(ls, &key);
1124         luaK_self(fs, v, &key);
1125         funcargs(ls, v, line);
1126         break;
1127       }
1128       case '(': case TK_STRING: case '{': {  /* funcargs */
1129         luaK_exp2nextreg(fs, v);
1130         funcargs(ls, v, line);
1131         break;
1132       }
1133       default: return;
1134     }
1135   }
1136 }
1137 
1138 
1139 static void simpleexp (LexState *ls, expdesc *v) {
1140   /* simpleexp -> FLT | INT | STRING | NIL | TRUE | FALSE | ... |
1141                   constructor | FUNCTION body | suffixedexp */
1142   switch (ls->t.token) {
1143     case TK_FLT: {
1144       init_exp(v, VKFLT, 0);
1145       v->u.nval = ls->t.seminfo.r;
1146       break;
1147     }
1148     case TK_INT: {
1149       init_exp(v, VKINT, 0);
1150       v->u.ival = ls->t.seminfo.i;
1151       break;
1152     }
1153     case TK_STRING: {
1154       codestring(v, ls->t.seminfo.ts);
1155       break;
1156     }
1157     case TK_NIL: {
1158       init_exp(v, VNIL, 0);
1159       break;
1160     }
1161     case TK_TRUE: {
1162       init_exp(v, VTRUE, 0);
1163       break;
1164     }
1165     case TK_FALSE: {
1166       init_exp(v, VFALSE, 0);
1167       break;
1168     }
1169     case TK_DOTS: {  /* vararg */
1170       FuncState *fs = ls->fs;
1171       check_condition(ls, fs->f->is_vararg,
1172                       "cannot use '...' outside a vararg function");
1173       init_exp(v, VVARARG, luaK_codeABC(fs, OP_VARARG, 0, 0, 1));
1174       break;
1175     }
1176     case '{': {  /* constructor */
1177       constructor(ls, v);
1178       return;
1179     }
1180     case TK_FUNCTION: {
1181       luaX_next(ls);
1182       body(ls, v, 0, ls->linenumber);
1183       return;
1184     }
1185     default: {
1186       suffixedexp(ls, v);
1187       return;
1188     }
1189   }
1190   luaX_next(ls);
1191 }
1192 
1193 
1194 static UnOpr getunopr (int op) {
1195   switch (op) {
1196     case TK_NOT: return OPR_NOT;
1197     case '-': return OPR_MINUS;
1198     case '~': return OPR_BNOT;
1199     case '#': return OPR_LEN;
1200     default: return OPR_NOUNOPR;
1201   }
1202 }
1203 
1204 
1205 static BinOpr getbinopr (int op) {
1206   switch (op) {
1207     case '+': return OPR_ADD;
1208     case '-': return OPR_SUB;
1209     case '*': return OPR_MUL;
1210     case '%': return OPR_MOD;
1211     case '^': return OPR_POW;
1212     case '/': return OPR_DIV;
1213     case TK_IDIV: return OPR_IDIV;
1214     case '&': return OPR_BAND;
1215     case '|': return OPR_BOR;
1216     case '~': return OPR_BXOR;
1217     case TK_SHL: return OPR_SHL;
1218     case TK_SHR: return OPR_SHR;
1219     case TK_CONCAT: return OPR_CONCAT;
1220     case TK_NE: return OPR_NE;
1221     case TK_EQ: return OPR_EQ;
1222     case '<': return OPR_LT;
1223     case TK_LE: return OPR_LE;
1224     case '>': return OPR_GT;
1225     case TK_GE: return OPR_GE;
1226     case TK_AND: return OPR_AND;
1227     case TK_OR: return OPR_OR;
1228     default: return OPR_NOBINOPR;
1229   }
1230 }
1231 
1232 
1233 /*
1234 ** Priority table for binary operators.
1235 */
1236 static const struct {
1237   lu_byte left;  /* left priority for each binary operator */
1238   lu_byte right; /* right priority */
1239 } priority[] = {  /* ORDER OPR */
1240    {10, 10}, {10, 10},           /* '+' '-' */
1241    {11, 11}, {11, 11},           /* '*' '%' */
1242    {14, 13},                  /* '^' (right associative) */
1243    {11, 11}, {11, 11},           /* '/' '//' */
1244    {6, 6}, {4, 4}, {5, 5},   /* '&' '|' '~' */
1245    {7, 7}, {7, 7},           /* '<<' '>>' */
1246    {9, 8},                   /* '..' (right associative) */
1247    {3, 3}, {3, 3}, {3, 3},   /* ==, <, <= */
1248    {3, 3}, {3, 3}, {3, 3},   /* ~=, >, >= */
1249    {2, 2}, {1, 1}            /* and, or */
1250 };
1251 
1252 #define UNARY_PRIORITY	12  /* priority for unary operators */
1253 
1254 
1255 /*
1256 ** subexpr -> (simpleexp | unop subexpr) { binop subexpr }
1257 ** where 'binop' is any binary operator with a priority higher than 'limit'
1258 */
1259 static BinOpr subexpr (LexState *ls, expdesc *v, int limit) {
1260   BinOpr op;
1261   UnOpr uop;
1262   enterlevel(ls);
1263   uop = getunopr(ls->t.token);
1264   if (uop != OPR_NOUNOPR) {  /* prefix (unary) operator? */
1265     int line = ls->linenumber;
1266     luaX_next(ls);  /* skip operator */
1267     subexpr(ls, v, UNARY_PRIORITY);
1268     luaK_prefix(ls->fs, uop, v, line);
1269   }
1270   else simpleexp(ls, v);
1271   /* expand while operators have priorities higher than 'limit' */
1272   op = getbinopr(ls->t.token);
1273   while (op != OPR_NOBINOPR && priority[op].left > limit) {
1274     expdesc v2;
1275     BinOpr nextop;
1276     int line = ls->linenumber;
1277     luaX_next(ls);  /* skip operator */
1278     luaK_infix(ls->fs, op, v);
1279     /* read sub-expression with higher priority */
1280     nextop = subexpr(ls, &v2, priority[op].right);
1281     luaK_posfix(ls->fs, op, v, &v2, line);
1282     op = nextop;
1283   }
1284   leavelevel(ls);
1285   return op;  /* return first untreated operator */
1286 }
1287 
1288 
1289 static void expr (LexState *ls, expdesc *v) {
1290   subexpr(ls, v, 0);
1291 }
1292 
1293 /* }==================================================================== */
1294 
1295 
1296 
1297 /*
1298 ** {======================================================================
1299 ** Rules for Statements
1300 ** =======================================================================
1301 */
1302 
1303 
1304 static void block (LexState *ls) {
1305   /* block -> statlist */
1306   FuncState *fs = ls->fs;
1307   BlockCnt bl;
1308   enterblock(fs, &bl, 0);
1309   statlist(ls);
1310   leaveblock(fs);
1311 }
1312 
1313 
1314 /*
1315 ** structure to chain all variables in the left-hand side of an
1316 ** assignment
1317 */
1318 struct LHS_assign {
1319   struct LHS_assign *prev;
1320   expdesc v;  /* variable (global, local, upvalue, or indexed) */
1321 };
1322 
1323 
1324 /*
1325 ** check whether, in an assignment to an upvalue/local variable, the
1326 ** upvalue/local variable is begin used in a previous assignment to a
1327 ** table. If so, save original upvalue/local value in a safe place and
1328 ** use this safe copy in the previous assignment.
1329 */
1330 static void check_conflict (LexState *ls, struct LHS_assign *lh, expdesc *v) {
1331   FuncState *fs = ls->fs;
1332   int extra = fs->freereg;  /* eventual position to save local variable */
1333   int conflict = 0;
1334   for (; lh; lh = lh->prev) {  /* check all previous assignments */
1335     if (vkisindexed(lh->v.k)) {  /* assignment to table field? */
1336       if (lh->v.k == VINDEXUP) {  /* is table an upvalue? */
1337         if (v->k == VUPVAL && lh->v.u.ind.t == v->u.info) {
1338           conflict = 1;  /* table is the upvalue being assigned now */
1339           lh->v.k = VINDEXSTR;
1340           lh->v.u.ind.t = extra;  /* assignment will use safe copy */
1341         }
1342       }
1343       else {  /* table is a register */
1344         if (v->k == VLOCAL && lh->v.u.ind.t == v->u.var.ridx) {
1345           conflict = 1;  /* table is the local being assigned now */
1346           lh->v.u.ind.t = extra;  /* assignment will use safe copy */
1347         }
1348         /* is index the local being assigned? */
1349         if (lh->v.k == VINDEXED && v->k == VLOCAL &&
1350             lh->v.u.ind.idx == v->u.var.ridx) {
1351           conflict = 1;
1352           lh->v.u.ind.idx = extra;  /* previous assignment will use safe copy */
1353         }
1354       }
1355     }
1356   }
1357   if (conflict) {
1358     /* copy upvalue/local value to a temporary (in position 'extra') */
1359     if (v->k == VLOCAL)
1360       luaK_codeABC(fs, OP_MOVE, extra, v->u.var.ridx, 0);
1361     else
1362       luaK_codeABC(fs, OP_GETUPVAL, extra, v->u.info, 0);
1363     luaK_reserveregs(fs, 1);
1364   }
1365 }
1366 
1367 /*
1368 ** Parse and compile a multiple assignment. The first "variable"
1369 ** (a 'suffixedexp') was already read by the caller.
1370 **
1371 ** assignment -> suffixedexp restassign
1372 ** restassign -> ',' suffixedexp restassign | '=' explist
1373 */
1374 static void restassign (LexState *ls, struct LHS_assign *lh, int nvars) {
1375   expdesc e;
1376   check_condition(ls, vkisvar(lh->v.k), "syntax error");
1377   check_readonly(ls, &lh->v);
1378   if (testnext(ls, ',')) {  /* restassign -> ',' suffixedexp restassign */
1379     struct LHS_assign nv;
1380     nv.prev = lh;
1381     suffixedexp(ls, &nv.v);
1382     if (!vkisindexed(nv.v.k))
1383       check_conflict(ls, lh, &nv.v);
1384     enterlevel(ls);  /* control recursion depth */
1385     restassign(ls, &nv, nvars+1);
1386     leavelevel(ls);
1387   }
1388   else {  /* restassign -> '=' explist */
1389     int nexps;
1390     checknext(ls, '=');
1391     nexps = explist(ls, &e);
1392     if (nexps != nvars)
1393       adjust_assign(ls, nvars, nexps, &e);
1394     else {
1395       luaK_setoneret(ls->fs, &e);  /* close last expression */
1396       luaK_storevar(ls->fs, &lh->v, &e);
1397       return;  /* avoid default */
1398     }
1399   }
1400   init_exp(&e, VNONRELOC, ls->fs->freereg-1);  /* default assignment */
1401   luaK_storevar(ls->fs, &lh->v, &e);
1402 }
1403 
1404 
1405 static int cond (LexState *ls) {
1406   /* cond -> exp */
1407   expdesc v;
1408   expr(ls, &v);  /* read condition */
1409   if (v.k == VNIL) v.k = VFALSE;  /* 'falses' are all equal here */
1410   luaK_goiftrue(ls->fs, &v);
1411   return v.f;
1412 }
1413 
1414 
1415 static void gotostat (LexState *ls) {
1416   FuncState *fs = ls->fs;
1417   int line = ls->linenumber;
1418   TString *name = str_checkname(ls);  /* label's name */
1419   Labeldesc *lb = findlabel(ls, name);
1420   if (lb == NULL)  /* no label? */
1421     /* forward jump; will be resolved when the label is declared */
1422     newgotoentry(ls, name, line, luaK_jump(fs));
1423   else {  /* found a label */
1424     /* backward jump; will be resolved here */
1425     int lblevel = reglevel(fs, lb->nactvar);  /* label level */
1426     if (luaY_nvarstack(fs) > lblevel)  /* leaving the scope of a variable? */
1427       luaK_codeABC(fs, OP_CLOSE, lblevel, 0, 0);
1428     /* create jump and link it to the label */
1429     luaK_patchlist(fs, luaK_jump(fs), lb->pc);
1430   }
1431 }
1432 
1433 
1434 /*
1435 ** Break statement. Semantically equivalent to "goto break".
1436 */
1437 static void breakstat (LexState *ls) {
1438   int line = ls->linenumber;
1439   luaX_next(ls);  /* skip break */
1440   newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, luaK_jump(ls->fs));
1441 }
1442 
1443 
1444 /*
1445 ** Check whether there is already a label with the given 'name'.
1446 */
1447 static void checkrepeated (LexState *ls, TString *name) {
1448   Labeldesc *lb = findlabel(ls, name);
1449   if (l_unlikely(lb != NULL)) {  /* already defined? */
1450     const char *msg = "label '%s' already defined on line %d";
1451     msg = luaO_pushfstring(ls->L, msg, getstr(name), lb->line);
1452     luaK_semerror(ls, msg);  /* error */
1453   }
1454 }
1455 
1456 
1457 static void labelstat (LexState *ls, TString *name, int line) {
1458   /* label -> '::' NAME '::' */
1459   checknext(ls, TK_DBCOLON);  /* skip double colon */
1460   while (ls->t.token == ';' || ls->t.token == TK_DBCOLON)
1461     statement(ls);  /* skip other no-op statements */
1462   checkrepeated(ls, name);  /* check for repeated labels */
1463   createlabel(ls, name, line, block_follow(ls, 0));
1464 }
1465 
1466 
1467 static void whilestat (LexState *ls, int line) {
1468   /* whilestat -> WHILE cond DO block END */
1469   FuncState *fs = ls->fs;
1470   int whileinit;
1471   int condexit;
1472   BlockCnt bl;
1473   luaX_next(ls);  /* skip WHILE */
1474   whileinit = luaK_getlabel(fs);
1475   condexit = cond(ls);
1476   enterblock(fs, &bl, 1);
1477   checknext(ls, TK_DO);
1478   block(ls);
1479   luaK_jumpto(fs, whileinit);
1480   check_match(ls, TK_END, TK_WHILE, line);
1481   leaveblock(fs);
1482   luaK_patchtohere(fs, condexit);  /* false conditions finish the loop */
1483 }
1484 
1485 
1486 static void repeatstat (LexState *ls, int line) {
1487   /* repeatstat -> REPEAT block UNTIL cond */
1488   int condexit;
1489   FuncState *fs = ls->fs;
1490   int repeat_init = luaK_getlabel(fs);
1491   BlockCnt bl1, bl2;
1492   enterblock(fs, &bl1, 1);  /* loop block */
1493   enterblock(fs, &bl2, 0);  /* scope block */
1494   luaX_next(ls);  /* skip REPEAT */
1495   statlist(ls);
1496   check_match(ls, TK_UNTIL, TK_REPEAT, line);
1497   condexit = cond(ls);  /* read condition (inside scope block) */
1498   leaveblock(fs);  /* finish scope */
1499   if (bl2.upval) {  /* upvalues? */
1500     int exit = luaK_jump(fs);  /* normal exit must jump over fix */
1501     luaK_patchtohere(fs, condexit);  /* repetition must close upvalues */
1502     luaK_codeABC(fs, OP_CLOSE, reglevel(fs, bl2.nactvar), 0, 0);
1503     condexit = luaK_jump(fs);  /* repeat after closing upvalues */
1504     luaK_patchtohere(fs, exit);  /* normal exit comes to here */
1505   }
1506   luaK_patchlist(fs, condexit, repeat_init);  /* close the loop */
1507   leaveblock(fs);  /* finish loop */
1508 }
1509 
1510 
1511 /*
1512 ** Read an expression and generate code to put its results in next
1513 ** stack slot.
1514 **
1515 */
1516 static void exp1 (LexState *ls) {
1517   expdesc e;
1518   expr(ls, &e);
1519   luaK_exp2nextreg(ls->fs, &e);
1520   lua_assert(e.k == VNONRELOC);
1521 }
1522 
1523 
1524 /*
1525 ** Fix for instruction at position 'pc' to jump to 'dest'.
1526 ** (Jump addresses are relative in Lua). 'back' true means
1527 ** a back jump.
1528 */
1529 static void fixforjump (FuncState *fs, int pc, int dest, int back) {
1530   Instruction *jmp = &fs->f->code[pc];
1531   int offset = dest - (pc + 1);
1532   if (back)
1533     offset = -offset;
1534   if (l_unlikely(offset > MAXARG_Bx))
1535     luaX_syntaxerror(fs->ls, "control structure too long");
1536   SETARG_Bx(*jmp, offset);
1537 }
1538 
1539 
1540 /*
1541 ** Generate code for a 'for' loop.
1542 */
1543 static void forbody (LexState *ls, int base, int line, int nvars, int isgen) {
1544   /* forbody -> DO block */
1545   static const OpCode forprep[2] = {OP_FORPREP, OP_TFORPREP};
1546   static const OpCode forloop[2] = {OP_FORLOOP, OP_TFORLOOP};
1547   BlockCnt bl;
1548   FuncState *fs = ls->fs;
1549   int prep, endfor;
1550   checknext(ls, TK_DO);
1551   prep = luaK_codeABx(fs, forprep[isgen], base, 0);
1552   enterblock(fs, &bl, 0);  /* scope for declared variables */
1553   adjustlocalvars(ls, nvars);
1554   luaK_reserveregs(fs, nvars);
1555   block(ls);
1556   leaveblock(fs);  /* end of scope for declared variables */
1557   fixforjump(fs, prep, luaK_getlabel(fs), 0);
1558   if (isgen) {  /* generic for? */
1559     luaK_codeABC(fs, OP_TFORCALL, base, 0, nvars);
1560     luaK_fixline(fs, line);
1561   }
1562   endfor = luaK_codeABx(fs, forloop[isgen], base, 0);
1563   fixforjump(fs, endfor, prep + 1, 1);
1564   luaK_fixline(fs, line);
1565 }
1566 
1567 
1568 static void fornum (LexState *ls, TString *varname, int line) {
1569   /* fornum -> NAME = exp,exp[,exp] forbody */
1570   FuncState *fs = ls->fs;
1571   int base = fs->freereg;
1572   new_localvarliteral(ls, "(for state)");
1573   new_localvarliteral(ls, "(for state)");
1574   new_localvarliteral(ls, "(for state)");
1575   new_localvar(ls, varname);
1576   checknext(ls, '=');
1577   exp1(ls);  /* initial value */
1578   checknext(ls, ',');
1579   exp1(ls);  /* limit */
1580   if (testnext(ls, ','))
1581     exp1(ls);  /* optional step */
1582   else {  /* default step = 1 */
1583     luaK_int(fs, fs->freereg, 1);
1584     luaK_reserveregs(fs, 1);
1585   }
1586   adjustlocalvars(ls, 3);  /* control variables */
1587   forbody(ls, base, line, 1, 0);
1588 }
1589 
1590 
1591 static void forlist (LexState *ls, TString *indexname) {
1592   /* forlist -> NAME {,NAME} IN explist forbody */
1593   FuncState *fs = ls->fs;
1594   expdesc e;
1595   int nvars = 5;  /* gen, state, control, toclose, 'indexname' */
1596   int line;
1597   int base = fs->freereg;
1598   /* create control variables */
1599   new_localvarliteral(ls, "(for state)");
1600   new_localvarliteral(ls, "(for state)");
1601   new_localvarliteral(ls, "(for state)");
1602   new_localvarliteral(ls, "(for state)");
1603   /* create declared variables */
1604   new_localvar(ls, indexname);
1605   while (testnext(ls, ',')) {
1606     new_localvar(ls, str_checkname(ls));
1607     nvars++;
1608   }
1609   checknext(ls, TK_IN);
1610   line = ls->linenumber;
1611   adjust_assign(ls, 4, explist(ls, &e), &e);
1612   adjustlocalvars(ls, 4);  /* control variables */
1613   marktobeclosed(fs);  /* last control var. must be closed */
1614   luaK_checkstack(fs, 3);  /* extra space to call generator */
1615   forbody(ls, base, line, nvars - 4, 1);
1616 }
1617 
1618 
1619 static void forstat (LexState *ls, int line) {
1620   /* forstat -> FOR (fornum | forlist) END */
1621   FuncState *fs = ls->fs;
1622   TString *varname;
1623   BlockCnt bl;
1624   enterblock(fs, &bl, 1);  /* scope for loop and control variables */
1625   luaX_next(ls);  /* skip 'for' */
1626   varname = str_checkname(ls);  /* first variable name */
1627   switch (ls->t.token) {
1628     case '=': fornum(ls, varname, line); break;
1629     case ',': case TK_IN: forlist(ls, varname); break;
1630     default: luaX_syntaxerror(ls, "'=' or 'in' expected");
1631   }
1632   check_match(ls, TK_END, TK_FOR, line);
1633   leaveblock(fs);  /* loop scope ('break' jumps to this point) */
1634 }
1635 
1636 
1637 static void test_then_block (LexState *ls, int *escapelist) {
1638   /* test_then_block -> [IF | ELSEIF] cond THEN block */
1639   BlockCnt bl;
1640   FuncState *fs = ls->fs;
1641   expdesc v;
1642   int jf;  /* instruction to skip 'then' code (if condition is false) */
1643   luaX_next(ls);  /* skip IF or ELSEIF */
1644   expr(ls, &v);  /* read condition */
1645   checknext(ls, TK_THEN);
1646   if (ls->t.token == TK_BREAK) {  /* 'if x then break' ? */
1647     int line = ls->linenumber;
1648     luaK_goiffalse(ls->fs, &v);  /* will jump if condition is true */
1649     luaX_next(ls);  /* skip 'break' */
1650     enterblock(fs, &bl, 0);  /* must enter block before 'goto' */
1651     newgotoentry(ls, luaS_newliteral(ls->L, "break"), line, v.t);
1652     while (testnext(ls, ';')) {}  /* skip semicolons */
1653     if (block_follow(ls, 0)) {  /* jump is the entire block? */
1654       leaveblock(fs);
1655       return;  /* and that is it */
1656     }
1657     else  /* must skip over 'then' part if condition is false */
1658       jf = luaK_jump(fs);
1659   }
1660   else {  /* regular case (not a break) */
1661     luaK_goiftrue(ls->fs, &v);  /* skip over block if condition is false */
1662     enterblock(fs, &bl, 0);
1663     jf = v.f;
1664   }
1665   statlist(ls);  /* 'then' part */
1666   leaveblock(fs);
1667   if (ls->t.token == TK_ELSE ||
1668       ls->t.token == TK_ELSEIF)  /* followed by 'else'/'elseif'? */
1669     luaK_concat(fs, escapelist, luaK_jump(fs));  /* must jump over it */
1670   luaK_patchtohere(fs, jf);
1671 }
1672 
1673 
1674 static void ifstat (LexState *ls, int line) {
1675   /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */
1676   FuncState *fs = ls->fs;
1677   int escapelist = NO_JUMP;  /* exit list for finished parts */
1678   test_then_block(ls, &escapelist);  /* IF cond THEN block */
1679   while (ls->t.token == TK_ELSEIF)
1680     test_then_block(ls, &escapelist);  /* ELSEIF cond THEN block */
1681   if (testnext(ls, TK_ELSE))
1682     block(ls);  /* 'else' part */
1683   check_match(ls, TK_END, TK_IF, line);
1684   luaK_patchtohere(fs, escapelist);  /* patch escape list to 'if' end */
1685 }
1686 
1687 
1688 static void localfunc (LexState *ls) {
1689   expdesc b;
1690   FuncState *fs = ls->fs;
1691   int fvar = fs->nactvar;  /* function's variable index */
1692   new_localvar(ls, str_checkname(ls));  /* new local variable */
1693   adjustlocalvars(ls, 1);  /* enter its scope */
1694   body(ls, &b, 0, ls->linenumber);  /* function created in next register */
1695   /* debug information will only see the variable after this point! */
1696   localdebuginfo(fs, fvar)->startpc = fs->pc;
1697 }
1698 
1699 
1700 static int getlocalattribute (LexState *ls) {
1701   /* ATTRIB -> ['<' Name '>'] */
1702   if (testnext(ls, '<')) {
1703     const char *attr = getstr(str_checkname(ls));
1704     checknext(ls, '>');
1705     if (strcmp(attr, "const") == 0)
1706       return RDKCONST;  /* read-only variable */
1707     else if (strcmp(attr, "close") == 0)
1708       return RDKTOCLOSE;  /* to-be-closed variable */
1709     else
1710       luaK_semerror(ls,
1711         luaO_pushfstring(ls->L, "unknown attribute '%s'", attr));
1712   }
1713   return VDKREG;  /* regular variable */
1714 }
1715 
1716 
1717 static void checktoclose (FuncState *fs, int level) {
1718   if (level != -1) {  /* is there a to-be-closed variable? */
1719     marktobeclosed(fs);
1720     luaK_codeABC(fs, OP_TBC, reglevel(fs, level), 0, 0);
1721   }
1722 }
1723 
1724 
1725 static void localstat (LexState *ls) {
1726   /* stat -> LOCAL NAME ATTRIB { ',' NAME ATTRIB } ['=' explist] */
1727   FuncState *fs = ls->fs;
1728   int toclose = -1;  /* index of to-be-closed variable (if any) */
1729   Vardesc *var;  /* last variable */
1730   int vidx, kind;  /* index and kind of last variable */
1731   int nvars = 0;
1732   int nexps;
1733   expdesc e;
1734   do {
1735     vidx = new_localvar(ls, str_checkname(ls));
1736     kind = getlocalattribute(ls);
1737     getlocalvardesc(fs, vidx)->vd.kind = kind;
1738     if (kind == RDKTOCLOSE) {  /* to-be-closed? */
1739       if (toclose != -1)  /* one already present? */
1740         luaK_semerror(ls, "multiple to-be-closed variables in local list");
1741       toclose = fs->nactvar + nvars;
1742     }
1743     nvars++;
1744   } while (testnext(ls, ','));
1745   if (testnext(ls, '='))
1746     nexps = explist(ls, &e);
1747   else {
1748     e.k = VVOID;
1749     nexps = 0;
1750   }
1751   var = getlocalvardesc(fs, vidx);  /* get last variable */
1752   if (nvars == nexps &&  /* no adjustments? */
1753       var->vd.kind == RDKCONST &&  /* last variable is const? */
1754       luaK_exp2const(fs, &e, &var->k)) {  /* compile-time constant? */
1755     var->vd.kind = RDKCTC;  /* variable is a compile-time constant */
1756     adjustlocalvars(ls, nvars - 1);  /* exclude last variable */
1757     fs->nactvar++;  /* but count it */
1758   }
1759   else {
1760     adjust_assign(ls, nvars, nexps, &e);
1761     adjustlocalvars(ls, nvars);
1762   }
1763   checktoclose(fs, toclose);
1764 }
1765 
1766 
1767 static int funcname (LexState *ls, expdesc *v) {
1768   /* funcname -> NAME {fieldsel} [':' NAME] */
1769   int ismethod = 0;
1770   singlevar(ls, v);
1771   while (ls->t.token == '.')
1772     fieldsel(ls, v);
1773   if (ls->t.token == ':') {
1774     ismethod = 1;
1775     fieldsel(ls, v);
1776   }
1777   return ismethod;
1778 }
1779 
1780 
1781 static void funcstat (LexState *ls, int line) {
1782   /* funcstat -> FUNCTION funcname body */
1783   int ismethod;
1784   expdesc v, b;
1785   luaX_next(ls);  /* skip FUNCTION */
1786   ismethod = funcname(ls, &v);
1787   body(ls, &b, ismethod, line);
1788   check_readonly(ls, &v);
1789   luaK_storevar(ls->fs, &v, &b);
1790   luaK_fixline(ls->fs, line);  /* definition "happens" in the first line */
1791 }
1792 
1793 
1794 static void exprstat (LexState *ls) {
1795   /* stat -> func | assignment */
1796   FuncState *fs = ls->fs;
1797   struct LHS_assign v;
1798   suffixedexp(ls, &v.v);
1799   if (ls->t.token == '=' || ls->t.token == ',') { /* stat -> assignment ? */
1800     v.prev = NULL;
1801     restassign(ls, &v, 1);
1802   }
1803   else {  /* stat -> func */
1804     Instruction *inst;
1805     check_condition(ls, v.v.k == VCALL, "syntax error");
1806     inst = &getinstruction(fs, &v.v);
1807     SETARG_C(*inst, 1);  /* call statement uses no results */
1808   }
1809 }
1810 
1811 
1812 static void retstat (LexState *ls) {
1813   /* stat -> RETURN [explist] [';'] */
1814   FuncState *fs = ls->fs;
1815   expdesc e;
1816   int nret;  /* number of values being returned */
1817   int first = luaY_nvarstack(fs);  /* first slot to be returned */
1818   if (block_follow(ls, 1) || ls->t.token == ';')
1819     nret = 0;  /* return no values */
1820   else {
1821     nret = explist(ls, &e);  /* optional return values */
1822     if (hasmultret(e.k)) {
1823       luaK_setmultret(fs, &e);
1824       if (e.k == VCALL && nret == 1 && !fs->bl->insidetbc) {  /* tail call? */
1825         SET_OPCODE(getinstruction(fs,&e), OP_TAILCALL);
1826         lua_assert(GETARG_A(getinstruction(fs,&e)) == luaY_nvarstack(fs));
1827       }
1828       nret = LUA_MULTRET;  /* return all values */
1829     }
1830     else {
1831       if (nret == 1)  /* only one single value? */
1832         first = luaK_exp2anyreg(fs, &e);  /* can use original slot */
1833       else {  /* values must go to the top of the stack */
1834         luaK_exp2nextreg(fs, &e);
1835         lua_assert(nret == fs->freereg - first);
1836       }
1837     }
1838   }
1839   luaK_ret(fs, first, nret);
1840   testnext(ls, ';');  /* skip optional semicolon */
1841 }
1842 
1843 
1844 static void statement (LexState *ls) {
1845   int line = ls->linenumber;  /* may be needed for error messages */
1846   enterlevel(ls);
1847   switch (ls->t.token) {
1848     case ';': {  /* stat -> ';' (empty statement) */
1849       luaX_next(ls);  /* skip ';' */
1850       break;
1851     }
1852     case TK_IF: {  /* stat -> ifstat */
1853       ifstat(ls, line);
1854       break;
1855     }
1856     case TK_WHILE: {  /* stat -> whilestat */
1857       whilestat(ls, line);
1858       break;
1859     }
1860     case TK_DO: {  /* stat -> DO block END */
1861       luaX_next(ls);  /* skip DO */
1862       block(ls);
1863       check_match(ls, TK_END, TK_DO, line);
1864       break;
1865     }
1866     case TK_FOR: {  /* stat -> forstat */
1867       forstat(ls, line);
1868       break;
1869     }
1870     case TK_REPEAT: {  /* stat -> repeatstat */
1871       repeatstat(ls, line);
1872       break;
1873     }
1874     case TK_FUNCTION: {  /* stat -> funcstat */
1875       funcstat(ls, line);
1876       break;
1877     }
1878     case TK_LOCAL: {  /* stat -> localstat */
1879       luaX_next(ls);  /* skip LOCAL */
1880       if (testnext(ls, TK_FUNCTION))  /* local function? */
1881         localfunc(ls);
1882       else
1883         localstat(ls);
1884       break;
1885     }
1886     case TK_DBCOLON: {  /* stat -> label */
1887       luaX_next(ls);  /* skip double colon */
1888       labelstat(ls, str_checkname(ls), line);
1889       break;
1890     }
1891     case TK_RETURN: {  /* stat -> retstat */
1892       luaX_next(ls);  /* skip RETURN */
1893       retstat(ls);
1894       break;
1895     }
1896     case TK_BREAK: {  /* stat -> breakstat */
1897       breakstat(ls);
1898       break;
1899     }
1900     case TK_GOTO: {  /* stat -> 'goto' NAME */
1901       luaX_next(ls);  /* skip 'goto' */
1902       gotostat(ls);
1903       break;
1904     }
1905     default: {  /* stat -> func | assignment */
1906       exprstat(ls);
1907       break;
1908     }
1909   }
1910   lua_assert(ls->fs->f->maxstacksize >= ls->fs->freereg &&
1911              ls->fs->freereg >= luaY_nvarstack(ls->fs));
1912   ls->fs->freereg = luaY_nvarstack(ls->fs);  /* free registers */
1913   leavelevel(ls);
1914 }
1915 
1916 /* }====================================================================== */
1917 
1918 
1919 /*
1920 ** compiles the main function, which is a regular vararg function with an
1921 ** upvalue named LUA_ENV
1922 */
1923 static void mainfunc (LexState *ls, FuncState *fs) {
1924   BlockCnt bl;
1925   Upvaldesc *env;
1926   open_func(ls, fs, &bl);
1927   setvararg(fs, 0);  /* main function is always declared vararg */
1928   env = allocupvalue(fs);  /* ...set environment upvalue */
1929   env->instack = 1;
1930   env->idx = 0;
1931   env->kind = VDKREG;
1932   env->name = ls->envn;
1933   luaC_objbarrier(ls->L, fs->f, env->name);
1934   luaX_next(ls);  /* read first token */
1935   statlist(ls);  /* parse main body */
1936   check(ls, TK_EOS);
1937   close_func(ls);
1938 }
1939 
1940 
1941 LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
1942                        Dyndata *dyd, const char *name, int firstchar) {
1943   LexState lexstate;
1944   FuncState funcstate;
1945   LClosure *cl = luaF_newLclosure(L, 1);  /* create main closure */
1946   setclLvalue2s(L, L->top, cl);  /* anchor it (to avoid being collected) */
1947   luaD_inctop(L);
1948   lexstate.h = luaH_new(L);  /* create table for scanner */
1949   sethvalue2s(L, L->top, lexstate.h);  /* anchor it */
1950   luaD_inctop(L);
1951   funcstate.f = cl->p = luaF_newproto(L);
1952   luaC_objbarrier(L, cl, cl->p);
1953   funcstate.f->source = luaS_new(L, name);  /* create and anchor TString */
1954   luaC_objbarrier(L, funcstate.f, funcstate.f->source);
1955   lexstate.buff = buff;
1956   lexstate.dyd = dyd;
1957   dyd->actvar.n = dyd->gt.n = dyd->label.n = 0;
1958   luaX_setinput(L, &lexstate, z, funcstate.f->source, firstchar);
1959   mainfunc(&lexstate, &funcstate);
1960   lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs);
1961   /* all scopes should be correctly finished */
1962   lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0);
1963   L->top--;  /* remove scanner's table */
1964   return cl;  /* closure is on the stack, too */
1965 }
1966 
1967