4 ** See Copyright Notice in lua.h
33 /* maximum number of local variables per function (must be smaller
34 than 250, due to the bytecode format) */
38 #define hasmultret(k) ((k) == VCALL || (k) == VVARARG)
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))
47 ** nodes for block list (list of active blocks)
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. */
62 ** prototypes for recursive non-terminal functions
64 static void statement (LexState
*ls
);
65 static void expr (LexState
*ls
, expdesc
*v
);
68 static l_noret
error_expected (LexState
*ls
, int token
) {
70 luaO_pushfstring(ls
->L
, "%s expected", luaX_token2str(ls
, token
)));
74 static l_noret
errorlimit (FuncState
*fs
, int limit
, const char *what
) {
75 lua_State
*L
= fs
->ls
->L
;
77 int line
= fs
->f
->linedefined
;
78 const char *where
= (line
== 0)
80 : luaO_pushfstring(L
, "function at line %d", line
);
81 msg
= luaO_pushfstring(L
, "too many %s (limit is %d) in %s",
83 luaX_syntaxerror(fs
->ls
, msg
);
87 static void checklimit (FuncState
*fs
, int v
, int l
, const char *what
) {
88 if (v
> l
) errorlimit(fs
, l
, what
);
93 ** Test whether next token is 'c'; if so, skip it.
95 static int testnext (LexState
*ls
, int c
) {
96 if (ls
->t
.token
== c
) {
105 ** Check that next token is 'c'.
107 static void check (LexState
*ls
, int c
) {
108 if (ls
->t
.token
!= c
)
109 error_expected(ls
, c
);
114 ** Check that next token is 'c' and skip it.
116 static void checknext (LexState
*ls
, int c
) {
122 #define check_condition(ls,c,msg) { if (!(c)) luaX_syntaxerror(ls, msg); }
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).
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 */
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
));
143 static TString
*str_checkname (LexState
*ls
) {
146 ts
= ls
->t
.seminfo
.ts
;
152 static void init_exp (expdesc
*e
, expkind k
, int i
) {
153 e
->f
= e
->t
= NO_JUMP
;
159 static void codestring (expdesc
*e
, TString
*s
) {
160 e
->f
= e
->t
= NO_JUMP
;
166 static void codename (LexState
*ls
, expdesc
*e
) {
167 codestring(e
, str_checkname(ls
));
172 ** Register a new local variable in the active 'Proto' (for debug
175 static int registerlocalvar (LexState
*ls
, FuncState
*fs
, TString
*varname
) {
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
++;
190 ** Create a new local variable with the given 'name'. Return its index
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
;
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 */
205 return dyd
->actvar
.n
- 1 - fs
->firstlocal
;
208 #define new_localvarliteral(ls,v) \
210 luaX_newstring(ls, "" v, (sizeof(v)/sizeof(char)) - 1));
215 ** Return the "variable description" (Vardesc) of a given variable.
216 ** (Unless noted otherwise, all variables are referred to by their
217 ** compiler indices.)
219 static Vardesc
*getlocalvardesc (FuncState
*fs
, int vidx
) {
220 return &fs
->ls
->dyd
->actvar
.arr
[fs
->firstlocal
+ vidx
];
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.
229 static int reglevel (FuncState
*fs
, int nvar
) {
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;
235 return 0; /* no variables in registers */
240 ** Return the number of variables in the register stack for the given
243 int luaY_nvarstack (FuncState
*fs
) {
244 return reglevel(fs
, fs
->nactvar
);
249 ** Get the debug-information entry for current variable 'vidx'.
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 */
256 int idx
= vd
->vd
.pidx
;
257 lua_assert(idx
< fs
->ndebugvars
);
258 return &fs
->f
->locvars
[idx
];
264 ** Create an expression representing variable 'vidx'
266 static void init_var (FuncState
*fs
, expdesc
*e
, int vidx
) {
267 e
->f
= e
->t
= NO_JUMP
;
269 e
->u
.var
.vidx
= vidx
;
270 e
->u
.var
.ridx
= getlocalvardesc(fs
, vidx
)->vd
.ridx
;
275 ** Raises an error if variable described by 'e' is read only
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 */
282 varname
= ls
->dyd
->actvar
.arr
[e
->u
.info
].vd
.name
;
286 Vardesc
*vardesc
= getlocalvardesc(fs
, e
->u
.var
.vidx
);
287 if (vardesc
->vd
.kind
!= VDKREG
) /* not a regular variable? */
288 varname
= vardesc
->vd
.name
;
292 Upvaldesc
*up
= &fs
->f
->upvalues
[e
->u
.info
];
293 if (up
->kind
!= VDKREG
)
298 return; /* other cases cannot be read-only */
301 const char *msg
= luaO_pushfstring(ls
->L
,
302 "attempt to assign to const variable '%s'", getstr(varname
));
303 luaK_semerror(ls
, msg
); /* error */
309 ** Start the scope for the last 'nvars' created variables.
311 static void adjustlocalvars (LexState
*ls
, int nvars
) {
312 FuncState
*fs
= ls
->fs
;
313 int reglevel
= luaY_nvarstack(fs
);
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
);
325 ** Close the scope for all variables up to level 'tolevel'.
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? */
339 ** Search the upvalues of the function 'fs' for one
340 ** with the given 'name'.
342 static int searchupvalue (FuncState
*fs
, TString
*name
) {
344 Upvaldesc
*up
= fs
->f
->upvalues
;
345 for (i
= 0; i
< fs
->nups
; i
++) {
346 if (eqstr(up
[i
].name
, name
)) return i
;
348 return -1; /* not found */
352 static Upvaldesc
*allocupvalue (FuncState
*fs
) {
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
++];
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
) {
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
));
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
));
380 luaC_objbarrier(fs
->ls
->L
, fs
->f
, name
);
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.
390 static int searchvar (FuncState
*fs
, TString
*n
, expdesc
*var
) {
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
);
402 return -1; /* not found */
407 ** Mark block where variable at given level was defined
408 ** (to emit close instructions later).
410 static void markupval (FuncState
*fs
, int level
) {
411 BlockCnt
*bl
= fs
->bl
;
412 while (bl
->nactvar
> level
)
420 ** Mark that current block has a to-be-closed variable.
422 static void marktobeclosed (FuncState
*fs
) {
423 BlockCnt
*bl
= fs
->bl
;
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.
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 */
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 */
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 */
453 init_exp(var
, VUPVAL
, idx
); /* new or old upvalue */
460 ** Find a variable with the given name 'n', handling global variables
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? */
469 singlevaraux(fs
, ls
->envn
, var
, 1); /* get environment variable */
470 lua_assert(var
->k
!= VVOID
); /* this one must exist */
471 luaK_exp2anyregup(fs
, var
); /* but could be a constant */
472 codestring(&key
, varname
); /* key is variable name */
473 luaK_indexed(fs
, var
, &key
); /* env[varname] */
479 ** Adjust the number of results from an expression list 'e' with 'nexps'
480 ** expressions to 'nvars' values.
482 static void adjust_assign (LexState
*ls
, int nvars
, int nexps
, expdesc
*e
) {
483 FuncState
*fs
= ls
->fs
;
484 int needed
= nvars
- nexps
; /* extra values needed */
485 if (hasmultret(e
->k
)) { /* last expression has multiple returns? */
486 int extra
= needed
+ 1; /* discount last expression itself */
489 luaK_setreturns(fs
, e
, extra
); /* last exp. provides the difference */
492 if (e
->k
!= VVOID
) /* at least one expression? */
493 luaK_exp2nextreg(fs
, e
); /* close last expression */
494 if (needed
> 0) /* missing values? */
495 luaK_nil(fs
, fs
->freereg
, needed
); /* complete with nils */
498 luaK_reserveregs(fs
, needed
); /* registers for extra values */
499 else /* adding 'needed' is actually a subtraction */
500 fs
->freereg
+= needed
; /* remove extra values */
504 #define enterlevel(ls) luaE_incCstack(ls->L)
507 #define leavelevel(ls) ((ls)->L->nCcalls--)
511 ** Generates an error that a goto jumps into the scope of some
514 static l_noret
jumpscopeerror (LexState
*ls
, Labeldesc
*gt
) {
515 const char *varname
= getstr(getlocalvardesc(ls
->fs
, gt
->nactvar
)->vd
.name
);
516 const char *msg
= "<goto %s> at line %d jumps into the scope of local '%s'";
517 msg
= luaO_pushfstring(ls
->L
, msg
, getstr(gt
->name
), gt
->line
, varname
);
518 luaK_semerror(ls
, msg
); /* raise the error */
523 ** Solves the goto at index 'g' to given 'label' and removes it
524 ** from the list of pending gotos.
525 ** If it jumps into the scope of some variable, raises an error.
527 static void solvegoto (LexState
*ls
, int g
, Labeldesc
*label
) {
529 Labellist
*gl
= &ls
->dyd
->gt
; /* list of gotos */
530 Labeldesc
*gt
= &gl
->arr
[g
]; /* goto to be resolved */
531 lua_assert(eqstr(gt
->name
, label
->name
));
532 if (l_unlikely(gt
->nactvar
< label
->nactvar
)) /* enter some scope? */
533 jumpscopeerror(ls
, gt
);
534 luaK_patchlist(ls
->fs
, gt
->pc
, label
->pc
);
535 for (i
= g
; i
< gl
->n
- 1; i
++) /* remove goto from pending list */
536 gl
->arr
[i
] = gl
->arr
[i
+ 1];
542 ** Search for an active label with the given name.
544 static Labeldesc
*findlabel (LexState
*ls
, TString
*name
) {
546 Dyndata
*dyd
= ls
->dyd
;
547 /* check labels in current function for a match */
548 for (i
= ls
->fs
->firstlabel
; i
< dyd
->label
.n
; i
++) {
549 Labeldesc
*lb
= &dyd
->label
.arr
[i
];
550 if (eqstr(lb
->name
, name
)) /* correct label? */
553 return NULL
; /* label not found */
558 ** Adds a new label/goto in the corresponding list.
560 static int newlabelentry (LexState
*ls
, Labellist
*l
, TString
*name
,
563 luaM_growvector(ls
->L
, l
->arr
, n
, l
->size
,
564 Labeldesc
, SHRT_MAX
, "labels/gotos");
565 l
->arr
[n
].name
= name
;
566 l
->arr
[n
].line
= line
;
567 l
->arr
[n
].nactvar
= ls
->fs
->nactvar
;
575 static int newgotoentry (LexState
*ls
, TString
*name
, int line
, int pc
) {
576 return newlabelentry(ls
, &ls
->dyd
->gt
, name
, line
, pc
);
581 ** Solves forward jumps. Check whether new label 'lb' matches any
582 ** pending gotos in current block and solves them. Return true
583 ** if any of the gotos need to close upvalues.
585 static int solvegotos (LexState
*ls
, Labeldesc
*lb
) {
586 Labellist
*gl
= &ls
->dyd
->gt
;
587 int i
= ls
->fs
->bl
->firstgoto
;
590 if (eqstr(gl
->arr
[i
].name
, lb
->name
)) {
591 needsclose
|= gl
->arr
[i
].close
;
592 solvegoto(ls
, i
, lb
); /* will remove 'i' from the list */
602 ** Create a new label with the given 'name' at the given 'line'.
603 ** 'last' tells whether label is the last non-op statement in its
604 ** block. Solves all pending gotos to this new label and adds
605 ** a close instruction if necessary.
606 ** Returns true iff it added a close instruction.
608 static int createlabel (LexState
*ls
, TString
*name
, int line
,
610 FuncState
*fs
= ls
->fs
;
611 Labellist
*ll
= &ls
->dyd
->label
;
612 int l
= newlabelentry(ls
, ll
, name
, line
, luaK_getlabel(fs
));
613 if (last
) { /* label is last no-op statement in the block? */
614 /* assume that locals are already out of scope */
615 ll
->arr
[l
].nactvar
= fs
->bl
->nactvar
;
617 if (solvegotos(ls
, &ll
->arr
[l
])) { /* need close? */
618 luaK_codeABC(fs
, OP_CLOSE
, luaY_nvarstack(fs
), 0, 0);
626 ** Adjust pending gotos to outer level of a block.
628 static void movegotosout (FuncState
*fs
, BlockCnt
*bl
) {
630 Labellist
*gl
= &fs
->ls
->dyd
->gt
;
631 /* correct pending gotos to current block */
632 for (i
= bl
->firstgoto
; i
< gl
->n
; i
++) { /* for each pending goto */
633 Labeldesc
*gt
= &gl
->arr
[i
];
634 /* leaving a variable scope? */
635 if (reglevel(fs
, gt
->nactvar
) > reglevel(fs
, bl
->nactvar
))
636 gt
->close
|= bl
->upval
; /* jump may need a close */
637 gt
->nactvar
= bl
->nactvar
; /* update goto level */
642 static void enterblock (FuncState
*fs
, BlockCnt
*bl
, lu_byte isloop
) {
644 bl
->nactvar
= fs
->nactvar
;
645 bl
->firstlabel
= fs
->ls
->dyd
->label
.n
;
646 bl
->firstgoto
= fs
->ls
->dyd
->gt
.n
;
648 bl
->insidetbc
= (fs
->bl
!= NULL
&& fs
->bl
->insidetbc
);
649 bl
->previous
= fs
->bl
;
651 lua_assert(fs
->freereg
== luaY_nvarstack(fs
));
656 ** generates an error for an undefined 'goto'.
658 static l_noret
undefgoto (LexState
*ls
, Labeldesc
*gt
) {
660 if (eqstr(gt
->name
, luaS_newliteral(ls
->L
, "break"))) {
661 msg
= "break outside loop at line %d";
662 msg
= luaO_pushfstring(ls
->L
, msg
, gt
->line
);
665 msg
= "no visible label '%s' for <goto> at line %d";
666 msg
= luaO_pushfstring(ls
->L
, msg
, getstr(gt
->name
), gt
->line
);
668 luaK_semerror(ls
, msg
);
672 static void leaveblock (FuncState
*fs
) {
673 BlockCnt
*bl
= fs
->bl
;
674 LexState
*ls
= fs
->ls
;
676 int stklevel
= reglevel(fs
, bl
->nactvar
); /* level outside the block */
677 removevars(fs
, bl
->nactvar
); /* remove block locals */
678 lua_assert(bl
->nactvar
== fs
->nactvar
); /* back to level on entry */
679 if (bl
->isloop
) /* has to fix pending breaks? */
680 hasclose
= createlabel(ls
, luaS_newliteral(ls
->L
, "break"), 0, 0);
681 if (!hasclose
&& bl
->previous
&& bl
->upval
) /* still need a 'close'? */
682 luaK_codeABC(fs
, OP_CLOSE
, stklevel
, 0, 0);
683 fs
->freereg
= stklevel
; /* free registers */
684 ls
->dyd
->label
.n
= bl
->firstlabel
; /* remove local labels */
685 fs
->bl
= bl
->previous
; /* current block now is previous one */
686 if (bl
->previous
) /* was it a nested block? */
687 movegotosout(fs
, bl
); /* update pending gotos to enclosing block */
689 if (bl
->firstgoto
< ls
->dyd
->gt
.n
) /* still pending gotos? */
690 undefgoto(ls
, &ls
->dyd
->gt
.arr
[bl
->firstgoto
]); /* error */
696 ** adds a new prototype into list of prototypes
698 static Proto
*addprototype (LexState
*ls
) {
700 lua_State
*L
= ls
->L
;
701 FuncState
*fs
= ls
->fs
;
702 Proto
*f
= fs
->f
; /* prototype of current function */
703 if (fs
->np
>= f
->sizep
) {
704 int oldsize
= f
->sizep
;
705 luaM_growvector(L
, f
->p
, fs
->np
, f
->sizep
, Proto
*, MAXARG_Bx
, "functions");
706 while (oldsize
< f
->sizep
)
707 f
->p
[oldsize
++] = NULL
;
709 f
->p
[fs
->np
++] = clp
= luaF_newproto(L
);
710 luaC_objbarrier(L
, f
, clp
);
716 ** codes instruction to create new closure in parent function.
717 ** The OP_CLOSURE instruction uses the last available register,
718 ** so that, if it invokes the GC, the GC knows which registers
719 ** are in use at that time.
722 static void codeclosure (LexState
*ls
, expdesc
*v
) {
723 FuncState
*fs
= ls
->fs
->prev
;
724 init_exp(v
, VRELOC
, luaK_codeABx(fs
, OP_CLOSURE
, 0, fs
->np
- 1));
725 luaK_exp2nextreg(fs
, v
); /* fix it at the last register */
729 static void open_func (LexState
*ls
, FuncState
*fs
, BlockCnt
*bl
) {
731 fs
->prev
= ls
->fs
; /* linked list of funcstates */
735 fs
->previousline
= f
->linedefined
;
740 fs
->nabslineinfo
= 0;
746 fs
->firstlocal
= ls
->dyd
->actvar
.n
;
747 fs
->firstlabel
= ls
->dyd
->label
.n
;
749 f
->source
= ls
->source
;
750 luaC_objbarrier(ls
->L
, f
, f
->source
);
751 f
->maxstacksize
= 2; /* registers 0/1 are always valid */
752 enterblock(fs
, bl
, 0);
756 static void close_func (LexState
*ls
) {
757 lua_State
*L
= ls
->L
;
758 FuncState
*fs
= ls
->fs
;
760 luaK_ret(fs
, luaY_nvarstack(fs
), 0); /* final return */
762 lua_assert(fs
->bl
== NULL
);
764 luaM_shrinkvector(L
, f
->code
, f
->sizecode
, fs
->pc
, Instruction
);
765 luaM_shrinkvector(L
, f
->lineinfo
, f
->sizelineinfo
, fs
->pc
, ls_byte
);
766 luaM_shrinkvector(L
, f
->abslineinfo
, f
->sizeabslineinfo
,
767 fs
->nabslineinfo
, AbsLineInfo
);
768 luaM_shrinkvector(L
, f
->k
, f
->sizek
, fs
->nk
, TValue
);
769 luaM_shrinkvector(L
, f
->p
, f
->sizep
, fs
->np
, Proto
*);
770 luaM_shrinkvector(L
, f
->locvars
, f
->sizelocvars
, fs
->ndebugvars
, LocVar
);
771 luaM_shrinkvector(L
, f
->upvalues
, f
->sizeupvalues
, fs
->nups
, Upvaldesc
);
778 /*============================================================*/
780 /*============================================================*/
784 ** check whether current token is in the follow set of a block.
785 ** 'until' closes syntactical blocks, but do not close scope,
786 ** so it is handled in separate.
788 static int block_follow (LexState
*ls
, int withuntil
) {
789 switch (ls
->t
.token
) {
790 case TK_ELSE
: case TK_ELSEIF
:
791 case TK_END
: case TK_EOS
:
793 case TK_UNTIL
: return withuntil
;
799 static void statlist (LexState
*ls
) {
800 /* statlist -> { stat [';'] } */
801 while (!block_follow(ls
, 1)) {
802 if (ls
->t
.token
== TK_RETURN
) {
804 return; /* 'return' must be last statement */
811 static void fieldsel (LexState
*ls
, expdesc
*v
) {
812 /* fieldsel -> ['.' | ':'] NAME */
813 FuncState
*fs
= ls
->fs
;
815 luaK_exp2anyregup(fs
, v
);
816 luaX_next(ls
); /* skip the dot or colon */
818 luaK_indexed(fs
, v
, &key
);
822 static void yindex (LexState
*ls
, expdesc
*v
) {
823 /* index -> '[' expr ']' */
824 luaX_next(ls
); /* skip the '[' */
826 luaK_exp2val(ls
->fs
, v
);
832 ** {======================================================================
833 ** Rules for Constructors
834 ** =======================================================================
838 typedef struct ConsControl
{
839 expdesc v
; /* last list item read */
840 expdesc
*t
; /* table descriptor */
841 int nh
; /* total number of 'record' elements */
842 int na
; /* number of array elements already stored */
843 int tostore
; /* number of array elements pending to be stored */
847 static void recfield (LexState
*ls
, ConsControl
*cc
) {
848 /* recfield -> (NAME | '['exp']') = exp */
849 FuncState
*fs
= ls
->fs
;
850 int reg
= ls
->fs
->freereg
;
851 expdesc tab
, key
, val
;
852 if (ls
->t
.token
== TK_NAME
) {
853 checklimit(fs
, cc
->nh
, MAX_INT
, "items in a constructor");
856 else /* ls->t.token == '[' */
861 luaK_indexed(fs
, &tab
, &key
);
863 luaK_storevar(fs
, &tab
, &val
);
864 fs
->freereg
= reg
; /* free registers */
868 static void closelistfield (FuncState
*fs
, ConsControl
*cc
) {
869 if (cc
->v
.k
== VVOID
) return; /* there is no list item */
870 luaK_exp2nextreg(fs
, &cc
->v
);
872 if (cc
->tostore
== LFIELDS_PER_FLUSH
) {
873 luaK_setlist(fs
, cc
->t
->u
.info
, cc
->na
, cc
->tostore
); /* flush */
874 cc
->na
+= cc
->tostore
;
875 cc
->tostore
= 0; /* no more items pending */
880 static void lastlistfield (FuncState
*fs
, ConsControl
*cc
) {
881 if (cc
->tostore
== 0) return;
882 if (hasmultret(cc
->v
.k
)) {
883 luaK_setmultret(fs
, &cc
->v
);
884 luaK_setlist(fs
, cc
->t
->u
.info
, cc
->na
, LUA_MULTRET
);
885 cc
->na
--; /* do not count last expression (unknown number of elements) */
888 if (cc
->v
.k
!= VVOID
)
889 luaK_exp2nextreg(fs
, &cc
->v
);
890 luaK_setlist(fs
, cc
->t
->u
.info
, cc
->na
, cc
->tostore
);
892 cc
->na
+= cc
->tostore
;
896 static void listfield (LexState
*ls
, ConsControl
*cc
) {
897 /* listfield -> exp */
903 static void field (LexState
*ls
, ConsControl
*cc
) {
904 /* field -> listfield | recfield */
905 switch(ls
->t
.token
) {
906 case TK_NAME
: { /* may be 'listfield' or 'recfield' */
907 if (luaX_lookahead(ls
) != '=') /* expression? */
925 static void constructor (LexState
*ls
, expdesc
*t
) {
926 /* constructor -> '{' [ field { sep field } [sep] ] '}'
928 FuncState
*fs
= ls
->fs
;
929 int line
= ls
->linenumber
;
930 int pc
= luaK_codeABC(fs
, OP_NEWTABLE
, 0, 0, 0);
932 luaK_code(fs
, 0); /* space for extra arg. */
933 cc
.na
= cc
.nh
= cc
.tostore
= 0;
935 init_exp(t
, VNONRELOC
, fs
->freereg
); /* table will be at stack top */
936 luaK_reserveregs(fs
, 1);
937 init_exp(&cc
.v
, VVOID
, 0); /* no value (yet) */
940 lua_assert(cc
.v
.k
== VVOID
|| cc
.tostore
> 0);
941 if (ls
->t
.token
== '}') break;
942 closelistfield(fs
, &cc
);
944 } while (testnext(ls
, ',') || testnext(ls
, ';'));
945 check_match(ls
, '}', '{', line
);
946 lastlistfield(fs
, &cc
);
947 luaK_settablesize(fs
, pc
, t
->u
.info
, cc
.na
, cc
.nh
);
950 /* }====================================================================== */
953 static void setvararg (FuncState
*fs
, int nparams
) {
954 fs
->f
->is_vararg
= 1;
955 luaK_codeABC(fs
, OP_VARARGPREP
, nparams
, 0, 0);
959 static void parlist (LexState
*ls
) {
960 /* parlist -> [ {NAME ','} (NAME | '...') ] */
961 FuncState
*fs
= ls
->fs
;
965 if (ls
->t
.token
!= ')') { /* is 'parlist' not empty? */
967 switch (ls
->t
.token
) {
969 new_localvar(ls
, str_checkname(ls
));
978 default: luaX_syntaxerror(ls
, "<name> or '...' expected");
980 } while (!isvararg
&& testnext(ls
, ','));
982 adjustlocalvars(ls
, nparams
);
983 f
->numparams
= cast_byte(fs
->nactvar
);
985 setvararg(fs
, f
->numparams
); /* declared vararg */
986 luaK_reserveregs(fs
, fs
->nactvar
); /* reserve registers for parameters */
990 static void body (LexState
*ls
, expdesc
*e
, int ismethod
, int line
) {
991 /* body -> '(' parlist ')' block END */
994 new_fs
.f
= addprototype(ls
);
995 new_fs
.f
->linedefined
= line
;
996 open_func(ls
, &new_fs
, &bl
);
999 new_localvarliteral(ls
, "self"); /* create 'self' parameter */
1000 adjustlocalvars(ls
, 1);
1005 new_fs
.f
->lastlinedefined
= ls
->linenumber
;
1006 check_match(ls
, TK_END
, TK_FUNCTION
, line
);
1012 static int explist (LexState
*ls
, expdesc
*v
) {
1013 /* explist -> expr { ',' expr } */
1014 int n
= 1; /* at least one expression */
1016 while (testnext(ls
, ',')) {
1017 luaK_exp2nextreg(ls
->fs
, v
);
1025 static void funcargs (LexState
*ls
, expdesc
*f
, int line
) {
1026 FuncState
*fs
= ls
->fs
;
1029 switch (ls
->t
.token
) {
1030 case '(': { /* funcargs -> '(' [ explist ] ')' */
1032 if (ls
->t
.token
== ')') /* arg list is empty? */
1036 if (hasmultret(args
.k
))
1037 luaK_setmultret(fs
, &args
);
1039 check_match(ls
, ')', '(', line
);
1042 case '{': { /* funcargs -> constructor */
1043 constructor(ls
, &args
);
1046 case TK_STRING
: { /* funcargs -> STRING */
1047 codestring(&args
, ls
->t
.seminfo
.ts
);
1048 luaX_next(ls
); /* must use 'seminfo' before 'next' */
1052 luaX_syntaxerror(ls
, "function arguments expected");
1055 lua_assert(f
->k
== VNONRELOC
);
1056 base
= f
->u
.info
; /* base register for call */
1057 if (hasmultret(args
.k
))
1058 nparams
= LUA_MULTRET
; /* open call */
1060 if (args
.k
!= VVOID
)
1061 luaK_exp2nextreg(fs
, &args
); /* close last argument */
1062 nparams
= fs
->freereg
- (base
+1);
1064 init_exp(f
, VCALL
, luaK_codeABC(fs
, OP_CALL
, base
, nparams
+1, 2));
1065 luaK_fixline(fs
, line
);
1066 fs
->freereg
= base
+1; /* call remove function and arguments and leaves
1067 (unless changed) one result */
1074 ** {======================================================================
1075 ** Expression parsing
1076 ** =======================================================================
1080 static void primaryexp (LexState
*ls
, expdesc
*v
) {
1081 /* primaryexp -> NAME | '(' expr ')' */
1082 switch (ls
->t
.token
) {
1084 int line
= ls
->linenumber
;
1087 check_match(ls
, ')', '(', line
);
1088 luaK_dischargevars(ls
->fs
, v
);
1096 luaX_syntaxerror(ls
, "unexpected symbol");
1102 static void suffixedexp (LexState
*ls
, expdesc
*v
) {
1104 primaryexp { '.' NAME | '[' exp ']' | ':' NAME funcargs | funcargs } */
1105 FuncState
*fs
= ls
->fs
;
1106 int line
= ls
->linenumber
;
1109 switch (ls
->t
.token
) {
1110 case '.': { /* fieldsel */
1114 case '[': { /* '[' exp ']' */
1116 luaK_exp2anyregup(fs
, v
);
1118 luaK_indexed(fs
, v
, &key
);
1121 case ':': { /* ':' NAME funcargs */
1125 luaK_self(fs
, v
, &key
);
1126 funcargs(ls
, v
, line
);
1129 case '(': case TK_STRING
: case '{': { /* funcargs */
1130 luaK_exp2nextreg(fs
, v
);
1131 funcargs(ls
, v
, line
);
1140 static void simpleexp (LexState
*ls
, expdesc
*v
) {
1141 /* simpleexp -> FLT | INT | STRING | NIL | TRUE | FALSE | ... |
1142 constructor | FUNCTION body | suffixedexp */
1143 switch (ls
->t
.token
) {
1145 init_exp(v
, VKFLT
, 0);
1146 v
->u
.nval
= ls
->t
.seminfo
.r
;
1150 init_exp(v
, VKINT
, 0);
1151 v
->u
.ival
= ls
->t
.seminfo
.i
;
1155 codestring(v
, ls
->t
.seminfo
.ts
);
1159 init_exp(v
, VNIL
, 0);
1163 init_exp(v
, VTRUE
, 0);
1167 init_exp(v
, VFALSE
, 0);
1170 case TK_DOTS
: { /* vararg */
1171 FuncState
*fs
= ls
->fs
;
1172 check_condition(ls
, fs
->f
->is_vararg
,
1173 "cannot use '...' outside a vararg function");
1174 init_exp(v
, VVARARG
, luaK_codeABC(fs
, OP_VARARG
, 0, 0, 1));
1177 case '{': { /* constructor */
1183 body(ls
, v
, 0, ls
->linenumber
);
1195 static UnOpr
getunopr (int op
) {
1197 case TK_NOT
: return OPR_NOT
;
1198 case '-': return OPR_MINUS
;
1199 case '~': return OPR_BNOT
;
1200 case '#': return OPR_LEN
;
1201 default: return OPR_NOUNOPR
;
1206 static BinOpr
getbinopr (int op
) {
1208 case '+': return OPR_ADD
;
1209 case '-': return OPR_SUB
;
1210 case '*': return OPR_MUL
;
1211 case '%': return OPR_MOD
;
1212 case '^': return OPR_POW
;
1213 case '/': return OPR_DIV
;
1214 case TK_IDIV
: return OPR_IDIV
;
1215 case '&': return OPR_BAND
;
1216 case '|': return OPR_BOR
;
1217 case '~': return OPR_BXOR
;
1218 case TK_SHL
: return OPR_SHL
;
1219 case TK_SHR
: return OPR_SHR
;
1220 case TK_CONCAT
: return OPR_CONCAT
;
1221 case TK_NE
: return OPR_NE
;
1222 case TK_EQ
: return OPR_EQ
;
1223 case '<': return OPR_LT
;
1224 case TK_LE
: return OPR_LE
;
1225 case '>': return OPR_GT
;
1226 case TK_GE
: return OPR_GE
;
1227 case TK_AND
: return OPR_AND
;
1228 case TK_OR
: return OPR_OR
;
1229 default: return OPR_NOBINOPR
;
1235 ** Priority table for binary operators.
1237 static const struct {
1238 lu_byte left
; /* left priority for each binary operator */
1239 lu_byte right
; /* right priority */
1240 } priority
[] = { /* ORDER OPR */
1241 {10, 10}, {10, 10}, /* '+' '-' */
1242 {11, 11}, {11, 11}, /* '*' '%' */
1243 {14, 13}, /* '^' (right associative) */
1244 {11, 11}, {11, 11}, /* '/' '//' */
1245 {6, 6}, {4, 4}, {5, 5}, /* '&' '|' '~' */
1246 {7, 7}, {7, 7}, /* '<<' '>>' */
1247 {9, 8}, /* '..' (right associative) */
1248 {3, 3}, {3, 3}, {3, 3}, /* ==, <, <= */
1249 {3, 3}, {3, 3}, {3, 3}, /* ~=, >, >= */
1250 {2, 2}, {1, 1} /* and, or */
1253 #define UNARY_PRIORITY 12 /* priority for unary operators */
1257 ** subexpr -> (simpleexp | unop subexpr) { binop subexpr }
1258 ** where 'binop' is any binary operator with a priority higher than 'limit'
1260 static BinOpr
subexpr (LexState
*ls
, expdesc
*v
, int limit
) {
1264 uop
= getunopr(ls
->t
.token
);
1265 if (uop
!= OPR_NOUNOPR
) { /* prefix (unary) operator? */
1266 int line
= ls
->linenumber
;
1267 luaX_next(ls
); /* skip operator */
1268 subexpr(ls
, v
, UNARY_PRIORITY
);
1269 luaK_prefix(ls
->fs
, uop
, v
, line
);
1271 else simpleexp(ls
, v
);
1272 /* expand while operators have priorities higher than 'limit' */
1273 op
= getbinopr(ls
->t
.token
);
1274 while (op
!= OPR_NOBINOPR
&& priority
[op
].left
> limit
) {
1277 int line
= ls
->linenumber
;
1278 luaX_next(ls
); /* skip operator */
1279 luaK_infix(ls
->fs
, op
, v
);
1280 /* read sub-expression with higher priority */
1281 nextop
= subexpr(ls
, &v2
, priority
[op
].right
);
1282 luaK_posfix(ls
->fs
, op
, v
, &v2
, line
);
1286 return op
; /* return first untreated operator */
1290 static void expr (LexState
*ls
, expdesc
*v
) {
1294 /* }==================================================================== */
1299 ** {======================================================================
1300 ** Rules for Statements
1301 ** =======================================================================
1305 static void block (LexState
*ls
) {
1306 /* block -> statlist */
1307 FuncState
*fs
= ls
->fs
;
1309 enterblock(fs
, &bl
, 0);
1316 ** structure to chain all variables in the left-hand side of an
1320 struct LHS_assign
*prev
;
1321 expdesc v
; /* variable (global, local, upvalue, or indexed) */
1326 ** check whether, in an assignment to an upvalue/local variable, the
1327 ** upvalue/local variable is begin used in a previous assignment to a
1328 ** table. If so, save original upvalue/local value in a safe place and
1329 ** use this safe copy in the previous assignment.
1331 static void check_conflict (LexState
*ls
, struct LHS_assign
*lh
, expdesc
*v
) {
1332 FuncState
*fs
= ls
->fs
;
1333 int extra
= fs
->freereg
; /* eventual position to save local variable */
1335 for (; lh
; lh
= lh
->prev
) { /* check all previous assignments */
1336 if (vkisindexed(lh
->v
.k
)) { /* assignment to table field? */
1337 if (lh
->v
.k
== VINDEXUP
) { /* is table an upvalue? */
1338 if (v
->k
== VUPVAL
&& lh
->v
.u
.ind
.t
== v
->u
.info
) {
1339 conflict
= 1; /* table is the upvalue being assigned now */
1340 lh
->v
.k
= VINDEXSTR
;
1341 lh
->v
.u
.ind
.t
= extra
; /* assignment will use safe copy */
1344 else { /* table is a register */
1345 if (v
->k
== VLOCAL
&& lh
->v
.u
.ind
.t
== v
->u
.var
.ridx
) {
1346 conflict
= 1; /* table is the local being assigned now */
1347 lh
->v
.u
.ind
.t
= extra
; /* assignment will use safe copy */
1349 /* is index the local being assigned? */
1350 if (lh
->v
.k
== VINDEXED
&& v
->k
== VLOCAL
&&
1351 lh
->v
.u
.ind
.idx
== v
->u
.var
.ridx
) {
1353 lh
->v
.u
.ind
.idx
= extra
; /* previous assignment will use safe copy */
1359 /* copy upvalue/local value to a temporary (in position 'extra') */
1361 luaK_codeABC(fs
, OP_MOVE
, extra
, v
->u
.var
.ridx
, 0);
1363 luaK_codeABC(fs
, OP_GETUPVAL
, extra
, v
->u
.info
, 0);
1364 luaK_reserveregs(fs
, 1);
1369 ** Parse and compile a multiple assignment. The first "variable"
1370 ** (a 'suffixedexp') was already read by the caller.
1372 ** assignment -> suffixedexp restassign
1373 ** restassign -> ',' suffixedexp restassign | '=' explist
1375 static void restassign (LexState
*ls
, struct LHS_assign
*lh
, int nvars
) {
1377 check_condition(ls
, vkisvar(lh
->v
.k
), "syntax error");
1378 check_readonly(ls
, &lh
->v
);
1379 if (testnext(ls
, ',')) { /* restassign -> ',' suffixedexp restassign */
1380 struct LHS_assign nv
;
1382 suffixedexp(ls
, &nv
.v
);
1383 if (!vkisindexed(nv
.v
.k
))
1384 check_conflict(ls
, lh
, &nv
.v
);
1385 enterlevel(ls
); /* control recursion depth */
1386 restassign(ls
, &nv
, nvars
+1);
1389 else { /* restassign -> '=' explist */
1392 nexps
= explist(ls
, &e
);
1394 adjust_assign(ls
, nvars
, nexps
, &e
);
1396 luaK_setoneret(ls
->fs
, &e
); /* close last expression */
1397 luaK_storevar(ls
->fs
, &lh
->v
, &e
);
1398 return; /* avoid default */
1401 init_exp(&e
, VNONRELOC
, ls
->fs
->freereg
-1); /* default assignment */
1402 luaK_storevar(ls
->fs
, &lh
->v
, &e
);
1406 static int cond (LexState
*ls
) {
1409 expr(ls
, &v
); /* read condition */
1410 if (v
.k
== VNIL
) v
.k
= VFALSE
; /* 'falses' are all equal here */
1411 luaK_goiftrue(ls
->fs
, &v
);
1416 static void gotostat (LexState
*ls
) {
1417 FuncState
*fs
= ls
->fs
;
1418 int line
= ls
->linenumber
;
1419 TString
*name
= str_checkname(ls
); /* label's name */
1420 Labeldesc
*lb
= findlabel(ls
, name
);
1421 if (lb
== NULL
) /* no label? */
1422 /* forward jump; will be resolved when the label is declared */
1423 newgotoentry(ls
, name
, line
, luaK_jump(fs
));
1424 else { /* found a label */
1425 /* backward jump; will be resolved here */
1426 int lblevel
= reglevel(fs
, lb
->nactvar
); /* label level */
1427 if (luaY_nvarstack(fs
) > lblevel
) /* leaving the scope of a variable? */
1428 luaK_codeABC(fs
, OP_CLOSE
, lblevel
, 0, 0);
1429 /* create jump and link it to the label */
1430 luaK_patchlist(fs
, luaK_jump(fs
), lb
->pc
);
1436 ** Break statement. Semantically equivalent to "goto break".
1438 static void breakstat (LexState
*ls
) {
1439 int line
= ls
->linenumber
;
1440 luaX_next(ls
); /* skip break */
1441 newgotoentry(ls
, luaS_newliteral(ls
->L
, "break"), line
, luaK_jump(ls
->fs
));
1446 ** Check whether there is already a label with the given 'name'.
1448 static void checkrepeated (LexState
*ls
, TString
*name
) {
1449 Labeldesc
*lb
= findlabel(ls
, name
);
1450 if (l_unlikely(lb
!= NULL
)) { /* already defined? */
1451 const char *msg
= "label '%s' already defined on line %d";
1452 msg
= luaO_pushfstring(ls
->L
, msg
, getstr(name
), lb
->line
);
1453 luaK_semerror(ls
, msg
); /* error */
1458 static void labelstat (LexState
*ls
, TString
*name
, int line
) {
1459 /* label -> '::' NAME '::' */
1460 checknext(ls
, TK_DBCOLON
); /* skip double colon */
1461 while (ls
->t
.token
== ';' || ls
->t
.token
== TK_DBCOLON
)
1462 statement(ls
); /* skip other no-op statements */
1463 checkrepeated(ls
, name
); /* check for repeated labels */
1464 createlabel(ls
, name
, line
, block_follow(ls
, 0));
1468 static void whilestat (LexState
*ls
, int line
) {
1469 /* whilestat -> WHILE cond DO block END */
1470 FuncState
*fs
= ls
->fs
;
1474 luaX_next(ls
); /* skip WHILE */
1475 whileinit
= luaK_getlabel(fs
);
1476 condexit
= cond(ls
);
1477 enterblock(fs
, &bl
, 1);
1478 checknext(ls
, TK_DO
);
1480 luaK_jumpto(fs
, whileinit
);
1481 check_match(ls
, TK_END
, TK_WHILE
, line
);
1483 luaK_patchtohere(fs
, condexit
); /* false conditions finish the loop */
1487 static void repeatstat (LexState
*ls
, int line
) {
1488 /* repeatstat -> REPEAT block UNTIL cond */
1490 FuncState
*fs
= ls
->fs
;
1491 int repeat_init
= luaK_getlabel(fs
);
1493 enterblock(fs
, &bl1
, 1); /* loop block */
1494 enterblock(fs
, &bl2
, 0); /* scope block */
1495 luaX_next(ls
); /* skip REPEAT */
1497 check_match(ls
, TK_UNTIL
, TK_REPEAT
, line
);
1498 condexit
= cond(ls
); /* read condition (inside scope block) */
1499 leaveblock(fs
); /* finish scope */
1500 if (bl2
.upval
) { /* upvalues? */
1501 int exit
= luaK_jump(fs
); /* normal exit must jump over fix */
1502 luaK_patchtohere(fs
, condexit
); /* repetition must close upvalues */
1503 luaK_codeABC(fs
, OP_CLOSE
, reglevel(fs
, bl2
.nactvar
), 0, 0);
1504 condexit
= luaK_jump(fs
); /* repeat after closing upvalues */
1505 luaK_patchtohere(fs
, exit
); /* normal exit comes to here */
1507 luaK_patchlist(fs
, condexit
, repeat_init
); /* close the loop */
1508 leaveblock(fs
); /* finish loop */
1513 ** Read an expression and generate code to put its results in next
1517 static void exp1 (LexState
*ls
) {
1520 luaK_exp2nextreg(ls
->fs
, &e
);
1521 lua_assert(e
.k
== VNONRELOC
);
1526 ** Fix for instruction at position 'pc' to jump to 'dest'.
1527 ** (Jump addresses are relative in Lua). 'back' true means
1530 static void fixforjump (FuncState
*fs
, int pc
, int dest
, int back
) {
1531 Instruction
*jmp
= &fs
->f
->code
[pc
];
1532 int offset
= dest
- (pc
+ 1);
1535 if (l_unlikely(offset
> MAXARG_Bx
))
1536 luaX_syntaxerror(fs
->ls
, "control structure too long");
1537 SETARG_Bx(*jmp
, offset
);
1542 ** Generate code for a 'for' loop.
1544 static void forbody (LexState
*ls
, int base
, int line
, int nvars
, int isgen
) {
1545 /* forbody -> DO block */
1546 static const OpCode forprep
[2] = {OP_FORPREP
, OP_TFORPREP
};
1547 static const OpCode forloop
[2] = {OP_FORLOOP
, OP_TFORLOOP
};
1549 FuncState
*fs
= ls
->fs
;
1551 checknext(ls
, TK_DO
);
1552 prep
= luaK_codeABx(fs
, forprep
[isgen
], base
, 0);
1553 enterblock(fs
, &bl
, 0); /* scope for declared variables */
1554 adjustlocalvars(ls
, nvars
);
1555 luaK_reserveregs(fs
, nvars
);
1557 leaveblock(fs
); /* end of scope for declared variables */
1558 fixforjump(fs
, prep
, luaK_getlabel(fs
), 0);
1559 if (isgen
) { /* generic for? */
1560 luaK_codeABC(fs
, OP_TFORCALL
, base
, 0, nvars
);
1561 luaK_fixline(fs
, line
);
1563 endfor
= luaK_codeABx(fs
, forloop
[isgen
], base
, 0);
1564 fixforjump(fs
, endfor
, prep
+ 1, 1);
1565 luaK_fixline(fs
, line
);
1569 static void fornum (LexState
*ls
, TString
*varname
, int line
) {
1570 /* fornum -> NAME = exp,exp[,exp] forbody */
1571 FuncState
*fs
= ls
->fs
;
1572 int base
= fs
->freereg
;
1573 new_localvarliteral(ls
, "(for state)");
1574 new_localvarliteral(ls
, "(for state)");
1575 new_localvarliteral(ls
, "(for state)");
1576 new_localvar(ls
, varname
);
1578 exp1(ls
); /* initial value */
1580 exp1(ls
); /* limit */
1581 if (testnext(ls
, ','))
1582 exp1(ls
); /* optional step */
1583 else { /* default step = 1 */
1584 luaK_int(fs
, fs
->freereg
, 1);
1585 luaK_reserveregs(fs
, 1);
1587 adjustlocalvars(ls
, 3); /* control variables */
1588 forbody(ls
, base
, line
, 1, 0);
1592 static void forlist (LexState
*ls
, TString
*indexname
) {
1593 /* forlist -> NAME {,NAME} IN explist forbody */
1594 FuncState
*fs
= ls
->fs
;
1596 int nvars
= 5; /* gen, state, control, toclose, 'indexname' */
1598 int base
= fs
->freereg
;
1599 /* create control variables */
1600 new_localvarliteral(ls
, "(for state)");
1601 new_localvarliteral(ls
, "(for state)");
1602 new_localvarliteral(ls
, "(for state)");
1603 new_localvarliteral(ls
, "(for state)");
1604 /* create declared variables */
1605 new_localvar(ls
, indexname
);
1606 while (testnext(ls
, ',')) {
1607 new_localvar(ls
, str_checkname(ls
));
1610 checknext(ls
, TK_IN
);
1611 line
= ls
->linenumber
;
1612 adjust_assign(ls
, 4, explist(ls
, &e
), &e
);
1613 adjustlocalvars(ls
, 4); /* control variables */
1614 marktobeclosed(fs
); /* last control var. must be closed */
1615 luaK_checkstack(fs
, 3); /* extra space to call generator */
1616 forbody(ls
, base
, line
, nvars
- 4, 1);
1620 static void forstat (LexState
*ls
, int line
) {
1621 /* forstat -> FOR (fornum | forlist) END */
1622 FuncState
*fs
= ls
->fs
;
1625 enterblock(fs
, &bl
, 1); /* scope for loop and control variables */
1626 luaX_next(ls
); /* skip 'for' */
1627 varname
= str_checkname(ls
); /* first variable name */
1628 switch (ls
->t
.token
) {
1629 case '=': fornum(ls
, varname
, line
); break;
1630 case ',': case TK_IN
: forlist(ls
, varname
); break;
1631 default: luaX_syntaxerror(ls
, "'=' or 'in' expected");
1633 check_match(ls
, TK_END
, TK_FOR
, line
);
1634 leaveblock(fs
); /* loop scope ('break' jumps to this point) */
1638 static void test_then_block (LexState
*ls
, int *escapelist
) {
1639 /* test_then_block -> [IF | ELSEIF] cond THEN block */
1641 FuncState
*fs
= ls
->fs
;
1643 int jf
; /* instruction to skip 'then' code (if condition is false) */
1644 luaX_next(ls
); /* skip IF or ELSEIF */
1645 expr(ls
, &v
); /* read condition */
1646 checknext(ls
, TK_THEN
);
1647 if (ls
->t
.token
== TK_BREAK
) { /* 'if x then break' ? */
1648 int line
= ls
->linenumber
;
1649 luaK_goiffalse(ls
->fs
, &v
); /* will jump if condition is true */
1650 luaX_next(ls
); /* skip 'break' */
1651 enterblock(fs
, &bl
, 0); /* must enter block before 'goto' */
1652 newgotoentry(ls
, luaS_newliteral(ls
->L
, "break"), line
, v
.t
);
1653 while (testnext(ls
, ';')) {} /* skip semicolons */
1654 if (block_follow(ls
, 0)) { /* jump is the entire block? */
1656 return; /* and that is it */
1658 else /* must skip over 'then' part if condition is false */
1661 else { /* regular case (not a break) */
1662 luaK_goiftrue(ls
->fs
, &v
); /* skip over block if condition is false */
1663 enterblock(fs
, &bl
, 0);
1666 statlist(ls
); /* 'then' part */
1668 if (ls
->t
.token
== TK_ELSE
||
1669 ls
->t
.token
== TK_ELSEIF
) /* followed by 'else'/'elseif'? */
1670 luaK_concat(fs
, escapelist
, luaK_jump(fs
)); /* must jump over it */
1671 luaK_patchtohere(fs
, jf
);
1675 static void ifstat (LexState
*ls
, int line
) {
1676 /* ifstat -> IF cond THEN block {ELSEIF cond THEN block} [ELSE block] END */
1677 FuncState
*fs
= ls
->fs
;
1678 int escapelist
= NO_JUMP
; /* exit list for finished parts */
1679 test_then_block(ls
, &escapelist
); /* IF cond THEN block */
1680 while (ls
->t
.token
== TK_ELSEIF
)
1681 test_then_block(ls
, &escapelist
); /* ELSEIF cond THEN block */
1682 if (testnext(ls
, TK_ELSE
))
1683 block(ls
); /* 'else' part */
1684 check_match(ls
, TK_END
, TK_IF
, line
);
1685 luaK_patchtohere(fs
, escapelist
); /* patch escape list to 'if' end */
1689 static void localfunc (LexState
*ls
) {
1691 FuncState
*fs
= ls
->fs
;
1692 int fvar
= fs
->nactvar
; /* function's variable index */
1693 new_localvar(ls
, str_checkname(ls
)); /* new local variable */
1694 adjustlocalvars(ls
, 1); /* enter its scope */
1695 body(ls
, &b
, 0, ls
->linenumber
); /* function created in next register */
1696 /* debug information will only see the variable after this point! */
1697 localdebuginfo(fs
, fvar
)->startpc
= fs
->pc
;
1701 static int getlocalattribute (LexState
*ls
) {
1702 /* ATTRIB -> ['<' Name '>'] */
1703 if (testnext(ls
, '<')) {
1704 const char *attr
= getstr(str_checkname(ls
));
1706 if (strcmp(attr
, "const") == 0)
1707 return RDKCONST
; /* read-only variable */
1708 else if (strcmp(attr
, "close") == 0)
1709 return RDKTOCLOSE
; /* to-be-closed variable */
1712 luaO_pushfstring(ls
->L
, "unknown attribute '%s'", attr
));
1714 return VDKREG
; /* regular variable */
1718 static void checktoclose (FuncState
*fs
, int level
) {
1719 if (level
!= -1) { /* is there a to-be-closed variable? */
1721 luaK_codeABC(fs
, OP_TBC
, reglevel(fs
, level
), 0, 0);
1726 static void localstat (LexState
*ls
) {
1727 /* stat -> LOCAL NAME ATTRIB { ',' NAME ATTRIB } ['=' explist] */
1728 FuncState
*fs
= ls
->fs
;
1729 int toclose
= -1; /* index of to-be-closed variable (if any) */
1730 Vardesc
*var
; /* last variable */
1731 int vidx
, kind
; /* index and kind of last variable */
1736 vidx
= new_localvar(ls
, str_checkname(ls
));
1737 kind
= getlocalattribute(ls
);
1738 getlocalvardesc(fs
, vidx
)->vd
.kind
= kind
;
1739 if (kind
== RDKTOCLOSE
) { /* to-be-closed? */
1740 if (toclose
!= -1) /* one already present? */
1741 luaK_semerror(ls
, "multiple to-be-closed variables in local list");
1742 toclose
= fs
->nactvar
+ nvars
;
1745 } while (testnext(ls
, ','));
1746 if (testnext(ls
, '='))
1747 nexps
= explist(ls
, &e
);
1752 var
= getlocalvardesc(fs
, vidx
); /* get last variable */
1753 if (nvars
== nexps
&& /* no adjustments? */
1754 var
->vd
.kind
== RDKCONST
&& /* last variable is const? */
1755 luaK_exp2const(fs
, &e
, &var
->k
)) { /* compile-time constant? */
1756 var
->vd
.kind
= RDKCTC
; /* variable is a compile-time constant */
1757 adjustlocalvars(ls
, nvars
- 1); /* exclude last variable */
1758 fs
->nactvar
++; /* but count it */
1761 adjust_assign(ls
, nvars
, nexps
, &e
);
1762 adjustlocalvars(ls
, nvars
);
1764 checktoclose(fs
, toclose
);
1768 static int funcname (LexState
*ls
, expdesc
*v
) {
1769 /* funcname -> NAME {fieldsel} [':' NAME] */
1772 while (ls
->t
.token
== '.')
1774 if (ls
->t
.token
== ':') {
1782 static void funcstat (LexState
*ls
, int line
) {
1783 /* funcstat -> FUNCTION funcname body */
1786 luaX_next(ls
); /* skip FUNCTION */
1787 ismethod
= funcname(ls
, &v
);
1788 body(ls
, &b
, ismethod
, line
);
1789 check_readonly(ls
, &v
);
1790 luaK_storevar(ls
->fs
, &v
, &b
);
1791 luaK_fixline(ls
->fs
, line
); /* definition "happens" in the first line */
1795 static void exprstat (LexState
*ls
) {
1796 /* stat -> func | assignment */
1797 FuncState
*fs
= ls
->fs
;
1798 struct LHS_assign v
;
1799 suffixedexp(ls
, &v
.v
);
1800 if (ls
->t
.token
== '=' || ls
->t
.token
== ',') { /* stat -> assignment ? */
1802 restassign(ls
, &v
, 1);
1804 else { /* stat -> func */
1806 check_condition(ls
, v
.v
.k
== VCALL
, "syntax error");
1807 inst
= &getinstruction(fs
, &v
.v
);
1808 SETARG_C(*inst
, 1); /* call statement uses no results */
1813 static void retstat (LexState
*ls
) {
1814 /* stat -> RETURN [explist] [';'] */
1815 FuncState
*fs
= ls
->fs
;
1817 int nret
; /* number of values being returned */
1818 int first
= luaY_nvarstack(fs
); /* first slot to be returned */
1819 if (block_follow(ls
, 1) || ls
->t
.token
== ';')
1820 nret
= 0; /* return no values */
1822 nret
= explist(ls
, &e
); /* optional return values */
1823 if (hasmultret(e
.k
)) {
1824 luaK_setmultret(fs
, &e
);
1825 if (e
.k
== VCALL
&& nret
== 1 && !fs
->bl
->insidetbc
) { /* tail call? */
1826 SET_OPCODE(getinstruction(fs
,&e
), OP_TAILCALL
);
1827 lua_assert(GETARG_A(getinstruction(fs
,&e
)) == luaY_nvarstack(fs
));
1829 nret
= LUA_MULTRET
; /* return all values */
1832 if (nret
== 1) /* only one single value? */
1833 first
= luaK_exp2anyreg(fs
, &e
); /* can use original slot */
1834 else { /* values must go to the top of the stack */
1835 luaK_exp2nextreg(fs
, &e
);
1836 lua_assert(nret
== fs
->freereg
- first
);
1840 luaK_ret(fs
, first
, nret
);
1841 testnext(ls
, ';'); /* skip optional semicolon */
1845 static void statement (LexState
*ls
) {
1846 int line
= ls
->linenumber
; /* may be needed for error messages */
1848 switch (ls
->t
.token
) {
1849 case ';': { /* stat -> ';' (empty statement) */
1850 luaX_next(ls
); /* skip ';' */
1853 case TK_IF
: { /* stat -> ifstat */
1857 case TK_WHILE
: { /* stat -> whilestat */
1858 whilestat(ls
, line
);
1861 case TK_DO
: { /* stat -> DO block END */
1862 luaX_next(ls
); /* skip DO */
1864 check_match(ls
, TK_END
, TK_DO
, line
);
1867 case TK_FOR
: { /* stat -> forstat */
1871 case TK_REPEAT
: { /* stat -> repeatstat */
1872 repeatstat(ls
, line
);
1875 case TK_FUNCTION
: { /* stat -> funcstat */
1879 case TK_LOCAL
: { /* stat -> localstat */
1880 luaX_next(ls
); /* skip LOCAL */
1881 if (testnext(ls
, TK_FUNCTION
)) /* local function? */
1887 case TK_DBCOLON
: { /* stat -> label */
1888 luaX_next(ls
); /* skip double colon */
1889 labelstat(ls
, str_checkname(ls
), line
);
1892 case TK_RETURN
: { /* stat -> retstat */
1893 luaX_next(ls
); /* skip RETURN */
1897 case TK_BREAK
: { /* stat -> breakstat */
1901 case TK_GOTO
: { /* stat -> 'goto' NAME */
1902 luaX_next(ls
); /* skip 'goto' */
1906 default: { /* stat -> func | assignment */
1911 lua_assert(ls
->fs
->f
->maxstacksize
>= ls
->fs
->freereg
&&
1912 ls
->fs
->freereg
>= luaY_nvarstack(ls
->fs
));
1913 ls
->fs
->freereg
= luaY_nvarstack(ls
->fs
); /* free registers */
1917 /* }====================================================================== */
1921 ** compiles the main function, which is a regular vararg function with an
1922 ** upvalue named LUA_ENV
1924 static void mainfunc (LexState
*ls
, FuncState
*fs
) {
1927 open_func(ls
, fs
, &bl
);
1928 setvararg(fs
, 0); /* main function is always declared vararg */
1929 env
= allocupvalue(fs
); /* ...set environment upvalue */
1933 env
->name
= ls
->envn
;
1934 luaC_objbarrier(ls
->L
, fs
->f
, env
->name
);
1935 luaX_next(ls
); /* read first token */
1936 statlist(ls
); /* parse main body */
1942 LClosure
*luaY_parser (lua_State
*L
, ZIO
*z
, Mbuffer
*buff
,
1943 Dyndata
*dyd
, const char *name
, int firstchar
) {
1945 FuncState funcstate
;
1946 LClosure
*cl
= luaF_newLclosure(L
, 1); /* create main closure */
1947 setclLvalue2s(L
, L
->top
.p
, cl
); /* anchor it (to avoid being collected) */
1949 lexstate
.h
= luaH_new(L
); /* create table for scanner */
1950 sethvalue2s(L
, L
->top
.p
, lexstate
.h
); /* anchor it */
1952 funcstate
.f
= cl
->p
= luaF_newproto(L
);
1953 luaC_objbarrier(L
, cl
, cl
->p
);
1954 funcstate
.f
->source
= luaS_new(L
, name
); /* create and anchor TString */
1955 luaC_objbarrier(L
, funcstate
.f
, funcstate
.f
->source
);
1956 lexstate
.buff
= buff
;
1958 dyd
->actvar
.n
= dyd
->gt
.n
= dyd
->label
.n
= 0;
1959 luaX_setinput(L
, &lexstate
, z
, funcstate
.f
->source
, firstchar
);
1960 mainfunc(&lexstate
, &funcstate
);
1961 lua_assert(!funcstate
.prev
&& funcstate
.nups
== 1 && !lexstate
.fs
);
1962 /* all scopes should be correctly finished */
1963 lua_assert(dyd
->actvar
.n
== 0 && dyd
->gt
.n
== 0 && dyd
->label
.n
== 0);
1964 L
->top
.p
--; /* remove scanner's table */
1965 return cl
; /* closure is on the stack, too */