Add LJ_TARGET_UNALIGNED.
[luajit-2.0/celess22.git] / src / lj_parse.c
bloba3a96535cae288d1dd020294f1ad4be7938f1032
1 /*
2 ** Lua parser (source code -> bytecode).
3 ** Copyright (C) 2005-2012 Mike Pall. See Copyright Notice in luajit.h
4 **
5 ** Major portions taken verbatim or adapted from the Lua interpreter.
6 ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
7 */
9 #define lj_parse_c
10 #define LUA_CORE
12 #include "lj_obj.h"
13 #include "lj_gc.h"
14 #include "lj_err.h"
15 #include "lj_debug.h"
16 #include "lj_str.h"
17 #include "lj_tab.h"
18 #include "lj_func.h"
19 #include "lj_state.h"
20 #include "lj_bc.h"
21 #if LJ_HASFFI
22 #include "lj_ctype.h"
23 #endif
24 #include "lj_lex.h"
25 #include "lj_parse.h"
26 #include "lj_vm.h"
27 #include "lj_vmevent.h"
29 /* -- Parser structures and definitions ----------------------------------- */
31 /* Expression kinds. */
32 typedef enum {
33 /* Constant expressions must be first and in this order: */
34 VKNIL,
35 VKFALSE,
36 VKTRUE,
37 VKSTR, /* sval = string value */
38 VKNUM, /* nval = number value */
39 VKLAST = VKNUM,
40 VKCDATA, /* nval = cdata value, not treated as a constant expression */
41 /* Non-constant expressions follow: */
42 VLOCAL, /* info = local register, aux = vstack index */
43 VUPVAL, /* info = upvalue index, aux = vstack index */
44 VGLOBAL, /* sval = string value */
45 VINDEXED, /* info = table register, aux = index reg/byte/string const */
46 VJMP, /* info = instruction PC */
47 VRELOCABLE, /* info = instruction PC */
48 VNONRELOC, /* info = result register */
49 VCALL, /* info = instruction PC, aux = base */
50 VVOID
51 } ExpKind;
53 /* Expression descriptor. */
54 typedef struct ExpDesc {
55 union {
56 struct {
57 uint32_t info; /* Primary info. */
58 uint32_t aux; /* Secondary info. */
59 } s;
60 TValue nval; /* Number value. */
61 GCstr *sval; /* String value. */
62 } u;
63 ExpKind k;
64 BCPos t; /* True condition jump list. */
65 BCPos f; /* False condition jump list. */
66 } ExpDesc;
68 /* Macros for expressions. */
69 #define expr_hasjump(e) ((e)->t != (e)->f)
71 #define expr_isk(e) ((e)->k <= VKLAST)
72 #define expr_isk_nojump(e) (expr_isk(e) && !expr_hasjump(e))
73 #define expr_isnumk(e) ((e)->k == VKNUM)
74 #define expr_isnumk_nojump(e) (expr_isnumk(e) && !expr_hasjump(e))
75 #define expr_isstrk(e) ((e)->k == VKSTR)
77 #define expr_numtv(e) check_exp(expr_isnumk((e)), &(e)->u.nval)
78 #define expr_numberV(e) numberVnum(expr_numtv((e)))
80 /* Initialize expression. */
81 static LJ_AINLINE void expr_init(ExpDesc *e, ExpKind k, uint32_t info)
83 e->k = k;
84 e->u.s.info = info;
85 e->f = e->t = NO_JMP;
88 /* Check number constant for +-0. */
89 static int expr_numiszero(ExpDesc *e)
91 TValue *o = expr_numtv(e);
92 return tvisint(o) ? (intV(o) == 0) : tviszero(o);
95 /* Per-function linked list of scope blocks. */
96 typedef struct FuncScope {
97 struct FuncScope *prev; /* Link to outer scope. */
98 MSize vstart; /* Start of block-local variables. */
99 uint8_t nactvar; /* Number of active vars outside the scope. */
100 uint8_t flags; /* Scope flags. */
101 } FuncScope;
103 #define FSCOPE_LOOP 0x01 /* Scope is a (breakable) loop. */
104 #define FSCOPE_BREAK 0x02 /* Break used in scope. */
105 #define FSCOPE_GOLA 0x04 /* Goto or label used in scope. */
106 #define FSCOPE_UPVAL 0x08 /* Upvalue in scope. */
107 #define FSCOPE_NOCLOSE 0x10 /* Do not close upvalues. */
109 #define NAME_BREAK ((GCstr *)(uintptr_t)1)
111 /* Index into variable stack. */
112 typedef uint16_t VarIndex;
113 #define LJ_MAX_VSTACK 65536
115 /* Flags stored in upper bits of endpc. */
116 #define VSTACK_MASK 0x1fffffff /* Mask for actual endpc. */
117 #define VSTACK_VAR_RW 0x80000000 /* R/W variable. */
118 #define VSTACK_GOTO 0x40000000 /* Pending goto. */
119 #define VSTACK_LABEL 0x20000000 /* Label. */
121 /* Upvalue map. */
122 typedef struct UVMap {
123 VarIndex vidx; /* Varinfo index. */
124 uint16_t slot; /* Slot or parent upvalue index. */
125 } UVMap;
127 /* Per-function state. */
128 typedef struct FuncState {
129 GCtab *kt; /* Hash table for constants. */
130 LexState *ls; /* Lexer state. */
131 lua_State *L; /* Lua state. */
132 FuncScope *bl; /* Current scope. */
133 struct FuncState *prev; /* Enclosing function. */
134 BCPos pc; /* Next bytecode position. */
135 BCPos lasttarget; /* Bytecode position of last jump target. */
136 BCPos jpc; /* Pending jump list to next bytecode. */
137 BCReg freereg; /* First free register. */
138 BCReg nactvar; /* Number of active local variables. */
139 BCReg nkn, nkgc; /* Number of lua_Number/GCobj constants */
140 BCLine linedefined; /* First line of the function definition. */
141 BCInsLine *bcbase; /* Base of bytecode stack. */
142 BCPos bclim; /* Limit of bytecode stack. */
143 MSize vbase; /* Base of variable stack for this function. */
144 uint8_t flags; /* Prototype flags. */
145 uint8_t numparams; /* Number of parameters. */
146 uint8_t framesize; /* Fixed frame size. */
147 uint8_t nuv; /* Number of upvalues */
148 VarIndex varmap[LJ_MAX_LOCVAR]; /* Map from register to variable idx. */
149 UVMap uvloc[LJ_MAX_UPVAL]; /* Map from upvalue to variable idx and slot. */
150 } FuncState;
152 /* Binary and unary operators. ORDER OPR */
153 typedef enum BinOpr {
154 OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW, /* ORDER ARITH */
155 OPR_CONCAT,
156 OPR_NE, OPR_EQ,
157 OPR_LT, OPR_GE, OPR_LE, OPR_GT,
158 OPR_AND, OPR_OR,
159 OPR_NOBINOPR
160 } BinOpr;
162 LJ_STATIC_ASSERT((int)BC_ISGE-(int)BC_ISLT == (int)OPR_GE-(int)OPR_LT);
163 LJ_STATIC_ASSERT((int)BC_ISLE-(int)BC_ISLT == (int)OPR_LE-(int)OPR_LT);
164 LJ_STATIC_ASSERT((int)BC_ISGT-(int)BC_ISLT == (int)OPR_GT-(int)OPR_LT);
165 LJ_STATIC_ASSERT((int)BC_SUBVV-(int)BC_ADDVV == (int)OPR_SUB-(int)OPR_ADD);
166 LJ_STATIC_ASSERT((int)BC_MULVV-(int)BC_ADDVV == (int)OPR_MUL-(int)OPR_ADD);
167 LJ_STATIC_ASSERT((int)BC_DIVVV-(int)BC_ADDVV == (int)OPR_DIV-(int)OPR_ADD);
168 LJ_STATIC_ASSERT((int)BC_MODVV-(int)BC_ADDVV == (int)OPR_MOD-(int)OPR_ADD);
170 /* -- Error handling ------------------------------------------------------ */
172 LJ_NORET LJ_NOINLINE static void err_syntax(LexState *ls, ErrMsg em)
174 lj_lex_error(ls, ls->token, em);
177 LJ_NORET LJ_NOINLINE static void err_token(LexState *ls, LexToken token)
179 lj_lex_error(ls, ls->token, LJ_ERR_XTOKEN, lj_lex_token2str(ls, token));
182 LJ_NORET static void err_limit(FuncState *fs, uint32_t limit, const char *what)
184 if (fs->linedefined == 0)
185 lj_lex_error(fs->ls, 0, LJ_ERR_XLIMM, limit, what);
186 else
187 lj_lex_error(fs->ls, 0, LJ_ERR_XLIMF, fs->linedefined, limit, what);
190 #define checklimit(fs, v, l, m) if ((v) >= (l)) err_limit(fs, l, m)
191 #define checklimitgt(fs, v, l, m) if ((v) > (l)) err_limit(fs, l, m)
192 #define checkcond(ls, c, em) { if (!(c)) err_syntax(ls, em); }
194 /* -- Management of constants --------------------------------------------- */
196 /* Return bytecode encoding for primitive constant. */
197 #define const_pri(e) check_exp((e)->k <= VKTRUE, (e)->k)
199 #define tvhaskslot(o) ((o)->u32.hi == 0)
200 #define tvkslot(o) ((o)->u32.lo)
202 /* Add a number constant. */
203 static BCReg const_num(FuncState *fs, ExpDesc *e)
205 lua_State *L = fs->L;
206 TValue *o;
207 lua_assert(expr_isnumk(e));
208 o = lj_tab_set(L, fs->kt, &e->u.nval);
209 if (tvhaskslot(o))
210 return tvkslot(o);
211 o->u64 = fs->nkn;
212 return fs->nkn++;
215 /* Add a GC object constant. */
216 static BCReg const_gc(FuncState *fs, GCobj *gc, uint32_t itype)
218 lua_State *L = fs->L;
219 TValue key, *o;
220 setgcV(L, &key, gc, itype);
221 /* NOBARRIER: the key is new or kept alive. */
222 o = lj_tab_set(L, fs->kt, &key);
223 if (tvhaskslot(o))
224 return tvkslot(o);
225 o->u64 = fs->nkgc;
226 return fs->nkgc++;
229 /* Add a string constant. */
230 static BCReg const_str(FuncState *fs, ExpDesc *e)
232 lua_assert(expr_isstrk(e) || e->k == VGLOBAL);
233 return const_gc(fs, obj2gco(e->u.sval), LJ_TSTR);
236 /* Anchor string constant to avoid GC. */
237 GCstr *lj_parse_keepstr(LexState *ls, const char *str, size_t len)
239 /* NOBARRIER: the key is new or kept alive. */
240 lua_State *L = ls->L;
241 GCstr *s = lj_str_new(L, str, len);
242 TValue *tv = lj_tab_setstr(L, ls->fs->kt, s);
243 if (tvisnil(tv)) setboolV(tv, 1);
244 lj_gc_check(L);
245 return s;
248 #if LJ_HASFFI
249 /* Anchor cdata to avoid GC. */
250 void lj_parse_keepcdata(LexState *ls, TValue *tv, GCcdata *cd)
252 /* NOBARRIER: the key is new or kept alive. */
253 lua_State *L = ls->L;
254 setcdataV(L, tv, cd);
255 setboolV(lj_tab_set(L, ls->fs->kt, tv), 1);
257 #endif
259 /* -- Jump list handling -------------------------------------------------- */
261 /* Get next element in jump list. */
262 static BCPos jmp_next(FuncState *fs, BCPos pc)
264 ptrdiff_t delta = bc_j(fs->bcbase[pc].ins);
265 if ((BCPos)delta == NO_JMP)
266 return NO_JMP;
267 else
268 return (BCPos)(((ptrdiff_t)pc+1)+delta);
271 /* Check if any of the instructions on the jump list produce no value. */
272 static int jmp_novalue(FuncState *fs, BCPos list)
274 for (; list != NO_JMP; list = jmp_next(fs, list)) {
275 BCIns p = fs->bcbase[list >= 1 ? list-1 : list].ins;
276 if (!(bc_op(p) == BC_ISTC || bc_op(p) == BC_ISFC || bc_a(p) == NO_REG))
277 return 1;
279 return 0;
282 /* Patch register of test instructions. */
283 static int jmp_patchtestreg(FuncState *fs, BCPos pc, BCReg reg)
285 BCInsLine *ilp = &fs->bcbase[pc >= 1 ? pc-1 : pc];
286 BCOp op = bc_op(ilp->ins);
287 if (op == BC_ISTC || op == BC_ISFC) {
288 if (reg != NO_REG && reg != bc_d(ilp->ins)) {
289 setbc_a(&ilp->ins, reg);
290 } else { /* Nothing to store or already in the right register. */
291 setbc_op(&ilp->ins, op+(BC_IST-BC_ISTC));
292 setbc_a(&ilp->ins, 0);
294 } else if (bc_a(ilp->ins) == NO_REG) {
295 if (reg == NO_REG) {
296 ilp->ins = BCINS_AJ(BC_JMP, bc_a(fs->bcbase[pc].ins), 0);
297 } else {
298 setbc_a(&ilp->ins, reg);
299 if (reg >= bc_a(ilp[1].ins))
300 setbc_a(&ilp[1].ins, reg+1);
302 } else {
303 return 0; /* Cannot patch other instructions. */
305 return 1;
308 /* Drop values for all instructions on jump list. */
309 static void jmp_dropval(FuncState *fs, BCPos list)
311 for (; list != NO_JMP; list = jmp_next(fs, list))
312 jmp_patchtestreg(fs, list, NO_REG);
315 /* Patch jump instruction to target. */
316 static void jmp_patchins(FuncState *fs, BCPos pc, BCPos dest)
318 BCIns *jmp = &fs->bcbase[pc].ins;
319 BCPos offset = dest-(pc+1)+BCBIAS_J;
320 lua_assert(dest != NO_JMP);
321 if (offset > BCMAX_D)
322 err_syntax(fs->ls, LJ_ERR_XJUMP);
323 setbc_d(jmp, offset);
326 /* Append to jump list. */
327 static void jmp_append(FuncState *fs, BCPos *l1, BCPos l2)
329 if (l2 == NO_JMP) {
330 return;
331 } else if (*l1 == NO_JMP) {
332 *l1 = l2;
333 } else {
334 BCPos list = *l1;
335 BCPos next;
336 while ((next = jmp_next(fs, list)) != NO_JMP) /* Find last element. */
337 list = next;
338 jmp_patchins(fs, list, l2);
342 /* Patch jump list and preserve produced values. */
343 static void jmp_patchval(FuncState *fs, BCPos list, BCPos vtarget,
344 BCReg reg, BCPos dtarget)
346 while (list != NO_JMP) {
347 BCPos next = jmp_next(fs, list);
348 if (jmp_patchtestreg(fs, list, reg))
349 jmp_patchins(fs, list, vtarget); /* Jump to target with value. */
350 else
351 jmp_patchins(fs, list, dtarget); /* Jump to default target. */
352 list = next;
356 /* Jump to following instruction. Append to list of pending jumps. */
357 static void jmp_tohere(FuncState *fs, BCPos list)
359 fs->lasttarget = fs->pc;
360 jmp_append(fs, &fs->jpc, list);
363 /* Patch jump list to target. */
364 static void jmp_patch(FuncState *fs, BCPos list, BCPos target)
366 if (target == fs->pc) {
367 jmp_tohere(fs, list);
368 } else {
369 lua_assert(target < fs->pc);
370 jmp_patchval(fs, list, target, NO_REG, target);
374 /* -- Bytecode register allocator ----------------------------------------- */
376 /* Bump frame size. */
377 static void bcreg_bump(FuncState *fs, BCReg n)
379 BCReg sz = fs->freereg + n;
380 if (sz > fs->framesize) {
381 if (sz >= LJ_MAX_SLOTS)
382 err_syntax(fs->ls, LJ_ERR_XSLOTS);
383 fs->framesize = (uint8_t)sz;
387 /* Reserve registers. */
388 static void bcreg_reserve(FuncState *fs, BCReg n)
390 bcreg_bump(fs, n);
391 fs->freereg += n;
394 /* Free register. */
395 static void bcreg_free(FuncState *fs, BCReg reg)
397 if (reg >= fs->nactvar) {
398 fs->freereg--;
399 lua_assert(reg == fs->freereg);
403 /* Free register for expression. */
404 static void expr_free(FuncState *fs, ExpDesc *e)
406 if (e->k == VNONRELOC)
407 bcreg_free(fs, e->u.s.info);
410 /* -- Bytecode emitter ---------------------------------------------------- */
412 /* Emit bytecode instruction. */
413 static BCPos bcemit_INS(FuncState *fs, BCIns ins)
415 BCPos pc = fs->pc;
416 LexState *ls = fs->ls;
417 jmp_patchval(fs, fs->jpc, pc, NO_REG, pc);
418 fs->jpc = NO_JMP;
419 if (LJ_UNLIKELY(pc >= fs->bclim)) {
420 ptrdiff_t base = fs->bcbase - ls->bcstack;
421 checklimit(fs, ls->sizebcstack, LJ_MAX_BCINS, "bytecode instructions");
422 lj_mem_growvec(fs->L, ls->bcstack, ls->sizebcstack, LJ_MAX_BCINS,BCInsLine);
423 fs->bclim = (BCPos)(ls->sizebcstack - base);
424 fs->bcbase = ls->bcstack + base;
426 fs->bcbase[pc].ins = ins;
427 fs->bcbase[pc].line = ls->lastline;
428 fs->pc = pc+1;
429 return pc;
432 #define bcemit_ABC(fs, o, a, b, c) bcemit_INS(fs, BCINS_ABC(o, a, b, c))
433 #define bcemit_AD(fs, o, a, d) bcemit_INS(fs, BCINS_AD(o, a, d))
434 #define bcemit_AJ(fs, o, a, j) bcemit_INS(fs, BCINS_AJ(o, a, j))
436 #define bcptr(fs, e) (&(fs)->bcbase[(e)->u.s.info].ins)
438 /* -- Bytecode emitter for expressions ------------------------------------ */
440 /* Discharge non-constant expression to any register. */
441 static void expr_discharge(FuncState *fs, ExpDesc *e)
443 BCIns ins;
444 if (e->k == VUPVAL) {
445 ins = BCINS_AD(BC_UGET, 0, e->u.s.info);
446 } else if (e->k == VGLOBAL) {
447 ins = BCINS_AD(BC_GGET, 0, const_str(fs, e));
448 } else if (e->k == VINDEXED) {
449 BCReg rc = e->u.s.aux;
450 if ((int32_t)rc < 0) {
451 ins = BCINS_ABC(BC_TGETS, 0, e->u.s.info, ~rc);
452 } else if (rc > BCMAX_C) {
453 ins = BCINS_ABC(BC_TGETB, 0, e->u.s.info, rc-(BCMAX_C+1));
454 } else {
455 bcreg_free(fs, rc);
456 ins = BCINS_ABC(BC_TGETV, 0, e->u.s.info, rc);
458 bcreg_free(fs, e->u.s.info);
459 } else if (e->k == VCALL) {
460 e->u.s.info = e->u.s.aux;
461 e->k = VNONRELOC;
462 return;
463 } else if (e->k == VLOCAL) {
464 e->k = VNONRELOC;
465 return;
466 } else {
467 return;
469 e->u.s.info = bcemit_INS(fs, ins);
470 e->k = VRELOCABLE;
473 /* Emit bytecode to set a range of registers to nil. */
474 static void bcemit_nil(FuncState *fs, BCReg from, BCReg n)
476 if (fs->pc > fs->lasttarget) { /* No jumps to current position? */
477 BCIns *ip = &fs->bcbase[fs->pc-1].ins;
478 BCReg pto, pfrom = bc_a(*ip);
479 switch (bc_op(*ip)) { /* Try to merge with the previous instruction. */
480 case BC_KPRI:
481 if (bc_d(*ip) != ~LJ_TNIL) break;
482 if (from == pfrom) {
483 if (n == 1) return;
484 } else if (from == pfrom+1) {
485 from = pfrom;
486 n++;
487 } else {
488 break;
490 fs->pc--; /* Drop KPRI. */
491 break;
492 case BC_KNIL:
493 pto = bc_d(*ip);
494 if (pfrom <= from && from <= pto+1) { /* Can we connect both ranges? */
495 if (from+n-1 > pto)
496 setbc_d(ip, from+n-1); /* Patch previous instruction range. */
497 return;
499 break;
500 default:
501 break;
504 /* Emit new instruction or replace old instruction. */
505 bcemit_INS(fs, n == 1 ? BCINS_AD(BC_KPRI, from, VKNIL) :
506 BCINS_AD(BC_KNIL, from, from+n-1));
509 /* Discharge an expression to a specific register. Ignore branches. */
510 static void expr_toreg_nobranch(FuncState *fs, ExpDesc *e, BCReg reg)
512 BCIns ins;
513 expr_discharge(fs, e);
514 if (e->k == VKSTR) {
515 ins = BCINS_AD(BC_KSTR, reg, const_str(fs, e));
516 } else if (e->k == VKNUM) {
517 #if LJ_DUALNUM
518 cTValue *tv = expr_numtv(e);
519 if (tvisint(tv) && checki16(intV(tv)))
520 ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)intV(tv));
521 else
522 #else
523 lua_Number n = expr_numberV(e);
524 int32_t k = lj_num2int(n);
525 if (checki16(k) && n == (lua_Number)k)
526 ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)k);
527 else
528 #endif
529 ins = BCINS_AD(BC_KNUM, reg, const_num(fs, e));
530 #if LJ_HASFFI
531 } else if (e->k == VKCDATA) {
532 fs->flags |= PROTO_FFI;
533 ins = BCINS_AD(BC_KCDATA, reg,
534 const_gc(fs, obj2gco(cdataV(&e->u.nval)), LJ_TCDATA));
535 #endif
536 } else if (e->k == VRELOCABLE) {
537 setbc_a(bcptr(fs, e), reg);
538 goto noins;
539 } else if (e->k == VNONRELOC) {
540 if (reg == e->u.s.info)
541 goto noins;
542 ins = BCINS_AD(BC_MOV, reg, e->u.s.info);
543 } else if (e->k == VKNIL) {
544 bcemit_nil(fs, reg, 1);
545 goto noins;
546 } else if (e->k <= VKTRUE) {
547 ins = BCINS_AD(BC_KPRI, reg, const_pri(e));
548 } else {
549 lua_assert(e->k == VVOID || e->k == VJMP);
550 return;
552 bcemit_INS(fs, ins);
553 noins:
554 e->u.s.info = reg;
555 e->k = VNONRELOC;
558 /* Forward declaration. */
559 static BCPos bcemit_jmp(FuncState *fs);
561 /* Discharge an expression to a specific register. */
562 static void expr_toreg(FuncState *fs, ExpDesc *e, BCReg reg)
564 expr_toreg_nobranch(fs, e, reg);
565 if (e->k == VJMP)
566 jmp_append(fs, &e->t, e->u.s.info); /* Add it to the true jump list. */
567 if (expr_hasjump(e)) { /* Discharge expression with branches. */
568 BCPos jend, jfalse = NO_JMP, jtrue = NO_JMP;
569 if (jmp_novalue(fs, e->t) || jmp_novalue(fs, e->f)) {
570 BCPos jval = (e->k == VJMP) ? NO_JMP : bcemit_jmp(fs);
571 jfalse = bcemit_AD(fs, BC_KPRI, reg, VKFALSE);
572 bcemit_AJ(fs, BC_JMP, fs->freereg, 1);
573 jtrue = bcemit_AD(fs, BC_KPRI, reg, VKTRUE);
574 jmp_tohere(fs, jval);
576 jend = fs->pc;
577 fs->lasttarget = jend;
578 jmp_patchval(fs, e->f, jend, reg, jfalse);
579 jmp_patchval(fs, e->t, jend, reg, jtrue);
581 e->f = e->t = NO_JMP;
582 e->u.s.info = reg;
583 e->k = VNONRELOC;
586 /* Discharge an expression to the next free register. */
587 static void expr_tonextreg(FuncState *fs, ExpDesc *e)
589 expr_discharge(fs, e);
590 expr_free(fs, e);
591 bcreg_reserve(fs, 1);
592 expr_toreg(fs, e, fs->freereg - 1);
595 /* Discharge an expression to any register. */
596 static BCReg expr_toanyreg(FuncState *fs, ExpDesc *e)
598 expr_discharge(fs, e);
599 if (e->k == VNONRELOC) {
600 if (!expr_hasjump(e)) return e->u.s.info; /* Already in a register. */
601 if (e->u.s.info >= fs->nactvar) {
602 expr_toreg(fs, e, e->u.s.info); /* Discharge to temp. register. */
603 return e->u.s.info;
606 expr_tonextreg(fs, e); /* Discharge to next register. */
607 return e->u.s.info;
610 /* Partially discharge expression to a value. */
611 static void expr_toval(FuncState *fs, ExpDesc *e)
613 if (expr_hasjump(e))
614 expr_toanyreg(fs, e);
615 else
616 expr_discharge(fs, e);
619 /* Emit store for LHS expression. */
620 static void bcemit_store(FuncState *fs, ExpDesc *var, ExpDesc *e)
622 BCIns ins;
623 if (var->k == VLOCAL) {
624 fs->ls->vstack[var->u.s.aux].endpc |= VSTACK_VAR_RW;
625 expr_free(fs, e);
626 expr_toreg(fs, e, var->u.s.info);
627 return;
628 } else if (var->k == VUPVAL) {
629 fs->ls->vstack[var->u.s.aux].endpc |= VSTACK_VAR_RW;
630 expr_toval(fs, e);
631 if (e->k <= VKTRUE)
632 ins = BCINS_AD(BC_USETP, var->u.s.info, const_pri(e));
633 else if (e->k == VKSTR)
634 ins = BCINS_AD(BC_USETS, var->u.s.info, const_str(fs, e));
635 else if (e->k == VKNUM)
636 ins = BCINS_AD(BC_USETN, var->u.s.info, const_num(fs, e));
637 else
638 ins = BCINS_AD(BC_USETV, var->u.s.info, expr_toanyreg(fs, e));
639 } else if (var->k == VGLOBAL) {
640 BCReg ra = expr_toanyreg(fs, e);
641 ins = BCINS_AD(BC_GSET, ra, const_str(fs, var));
642 } else {
643 BCReg ra, rc;
644 lua_assert(var->k == VINDEXED);
645 ra = expr_toanyreg(fs, e);
646 rc = var->u.s.aux;
647 if ((int32_t)rc < 0) {
648 ins = BCINS_ABC(BC_TSETS, ra, var->u.s.info, ~rc);
649 } else if (rc > BCMAX_C) {
650 ins = BCINS_ABC(BC_TSETB, ra, var->u.s.info, rc-(BCMAX_C+1));
651 } else {
652 /* Free late alloced key reg to avoid assert on free of value reg. */
653 /* This can only happen when called from expr_table(). */
654 lua_assert(e->k != VNONRELOC || ra < fs->nactvar ||
655 rc < ra || (bcreg_free(fs, rc),1));
656 ins = BCINS_ABC(BC_TSETV, ra, var->u.s.info, rc);
659 bcemit_INS(fs, ins);
660 expr_free(fs, e);
663 /* Emit method lookup expression. */
664 static void bcemit_method(FuncState *fs, ExpDesc *e, ExpDesc *key)
666 BCReg idx, func, obj = expr_toanyreg(fs, e);
667 expr_free(fs, e);
668 func = fs->freereg;
669 bcemit_AD(fs, BC_MOV, func+1, obj); /* Copy object to first argument. */
670 lua_assert(expr_isstrk(key));
671 idx = const_str(fs, key);
672 if (idx <= BCMAX_C) {
673 bcreg_reserve(fs, 2);
674 bcemit_ABC(fs, BC_TGETS, func, obj, idx);
675 } else {
676 bcreg_reserve(fs, 3);
677 bcemit_AD(fs, BC_KSTR, func+2, idx);
678 bcemit_ABC(fs, BC_TGETV, func, obj, func+2);
679 fs->freereg--;
681 e->u.s.info = func;
682 e->k = VNONRELOC;
685 /* -- Bytecode emitter for branches --------------------------------------- */
687 /* Emit unconditional branch. */
688 static BCPos bcemit_jmp(FuncState *fs)
690 BCPos jpc = fs->jpc;
691 BCPos j = fs->pc - 1;
692 BCIns *ip = &fs->bcbase[j].ins;
693 fs->jpc = NO_JMP;
694 if ((int32_t)j >= (int32_t)fs->lasttarget && bc_op(*ip) == BC_UCLO)
695 setbc_j(ip, NO_JMP);
696 else
697 j = bcemit_AJ(fs, BC_JMP, fs->freereg, NO_JMP);
698 jmp_append(fs, &j, jpc);
699 return j;
702 /* Invert branch condition of bytecode instruction. */
703 static void invertcond(FuncState *fs, ExpDesc *e)
705 BCIns *ip = &fs->bcbase[e->u.s.info - 1].ins;
706 setbc_op(ip, bc_op(*ip)^1);
709 /* Emit conditional branch. */
710 static BCPos bcemit_branch(FuncState *fs, ExpDesc *e, int cond)
712 BCPos pc;
713 if (e->k == VRELOCABLE) {
714 BCIns *ip = bcptr(fs, e);
715 if (bc_op(*ip) == BC_NOT) {
716 *ip = BCINS_AD(cond ? BC_ISF : BC_IST, 0, bc_d(*ip));
717 return bcemit_jmp(fs);
720 if (e->k != VNONRELOC) {
721 bcreg_reserve(fs, 1);
722 expr_toreg_nobranch(fs, e, fs->freereg-1);
724 bcemit_AD(fs, cond ? BC_ISTC : BC_ISFC, NO_REG, e->u.s.info);
725 pc = bcemit_jmp(fs);
726 expr_free(fs, e);
727 return pc;
730 /* Emit branch on true condition. */
731 static void bcemit_branch_t(FuncState *fs, ExpDesc *e)
733 BCPos pc;
734 expr_discharge(fs, e);
735 if (e->k == VKSTR || e->k == VKNUM || e->k == VKTRUE)
736 pc = NO_JMP; /* Never jump. */
737 else if (e->k == VJMP)
738 invertcond(fs, e), pc = e->u.s.info;
739 else if (e->k == VKFALSE || e->k == VKNIL)
740 expr_toreg_nobranch(fs, e, NO_REG), pc = bcemit_jmp(fs);
741 else
742 pc = bcemit_branch(fs, e, 0);
743 jmp_append(fs, &e->f, pc);
744 jmp_tohere(fs, e->t);
745 e->t = NO_JMP;
748 /* Emit branch on false condition. */
749 static void bcemit_branch_f(FuncState *fs, ExpDesc *e)
751 BCPos pc;
752 expr_discharge(fs, e);
753 if (e->k == VKNIL || e->k == VKFALSE)
754 pc = NO_JMP; /* Never jump. */
755 else if (e->k == VJMP)
756 pc = e->u.s.info;
757 else if (e->k == VKSTR || e->k == VKNUM || e->k == VKTRUE)
758 expr_toreg_nobranch(fs, e, NO_REG), pc = bcemit_jmp(fs);
759 else
760 pc = bcemit_branch(fs, e, 1);
761 jmp_append(fs, &e->t, pc);
762 jmp_tohere(fs, e->f);
763 e->f = NO_JMP;
766 /* -- Bytecode emitter for operators -------------------------------------- */
768 /* Try constant-folding of arithmetic operators. */
769 static int foldarith(BinOpr opr, ExpDesc *e1, ExpDesc *e2)
771 TValue o;
772 lua_Number n;
773 if (!expr_isnumk_nojump(e1) || !expr_isnumk_nojump(e2)) return 0;
774 n = lj_vm_foldarith(expr_numberV(e1), expr_numberV(e2), (int)opr-OPR_ADD);
775 setnumV(&o, n);
776 if (tvisnan(&o) || tvismzero(&o)) return 0; /* Avoid NaN and -0 as consts. */
777 if (LJ_DUALNUM) {
778 int32_t k = lj_num2int(n);
779 if ((lua_Number)k == n) {
780 setintV(&e1->u.nval, k);
781 return 1;
784 setnumV(&e1->u.nval, n);
785 return 1;
788 /* Emit arithmetic operator. */
789 static void bcemit_arith(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2)
791 BCReg rb, rc, t;
792 uint32_t op;
793 if (foldarith(opr, e1, e2))
794 return;
795 if (opr == OPR_POW) {
796 op = BC_POW;
797 rc = expr_toanyreg(fs, e2);
798 rb = expr_toanyreg(fs, e1);
799 } else {
800 op = opr-OPR_ADD+BC_ADDVV;
801 /* Must discharge 2nd operand first since VINDEXED might free regs. */
802 expr_toval(fs, e2);
803 if (expr_isnumk(e2) && (rc = const_num(fs, e2)) <= BCMAX_C)
804 op -= BC_ADDVV-BC_ADDVN;
805 else
806 rc = expr_toanyreg(fs, e2);
807 /* 1st operand discharged by bcemit_binop_left, but need KNUM/KSHORT. */
808 lua_assert(expr_isnumk(e1) || e1->k == VNONRELOC);
809 expr_toval(fs, e1);
810 /* Avoid two consts to satisfy bytecode constraints. */
811 if (expr_isnumk(e1) && !expr_isnumk(e2) &&
812 (t = const_num(fs, e1)) <= BCMAX_B) {
813 rb = rc; rc = t; op -= BC_ADDVV-BC_ADDNV;
814 } else {
815 rb = expr_toanyreg(fs, e1);
818 /* Using expr_free might cause asserts if the order is wrong. */
819 if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--;
820 if (e2->k == VNONRELOC && e2->u.s.info >= fs->nactvar) fs->freereg--;
821 e1->u.s.info = bcemit_ABC(fs, op, 0, rb, rc);
822 e1->k = VRELOCABLE;
825 /* Emit comparison operator. */
826 static void bcemit_comp(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2)
828 ExpDesc *eret = e1;
829 BCIns ins;
830 expr_toval(fs, e1);
831 if (opr == OPR_EQ || opr == OPR_NE) {
832 BCOp op = opr == OPR_EQ ? BC_ISEQV : BC_ISNEV;
833 BCReg ra;
834 if (expr_isk(e1)) { e1 = e2; e2 = eret; } /* Need constant in 2nd arg. */
835 ra = expr_toanyreg(fs, e1); /* First arg must be in a reg. */
836 expr_toval(fs, e2);
837 switch (e2->k) {
838 case VKNIL: case VKFALSE: case VKTRUE:
839 ins = BCINS_AD(op+(BC_ISEQP-BC_ISEQV), ra, const_pri(e2));
840 break;
841 case VKSTR:
842 ins = BCINS_AD(op+(BC_ISEQS-BC_ISEQV), ra, const_str(fs, e2));
843 break;
844 case VKNUM:
845 ins = BCINS_AD(op+(BC_ISEQN-BC_ISEQV), ra, const_num(fs, e2));
846 break;
847 default:
848 ins = BCINS_AD(op, ra, expr_toanyreg(fs, e2));
849 break;
851 } else {
852 uint32_t op = opr-OPR_LT+BC_ISLT;
853 BCReg ra, rd;
854 if ((op-BC_ISLT) & 1) { /* GT -> LT, GE -> LE */
855 e1 = e2; e2 = eret; /* Swap operands. */
856 op = ((op-BC_ISLT)^3)+BC_ISLT;
858 rd = expr_toanyreg(fs, e2);
859 ra = expr_toanyreg(fs, e1);
860 ins = BCINS_AD(op, ra, rd);
862 /* Using expr_free might cause asserts if the order is wrong. */
863 if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--;
864 if (e2->k == VNONRELOC && e2->u.s.info >= fs->nactvar) fs->freereg--;
865 bcemit_INS(fs, ins);
866 eret->u.s.info = bcemit_jmp(fs);
867 eret->k = VJMP;
870 /* Fixup left side of binary operator. */
871 static void bcemit_binop_left(FuncState *fs, BinOpr op, ExpDesc *e)
873 if (op == OPR_AND) {
874 bcemit_branch_t(fs, e);
875 } else if (op == OPR_OR) {
876 bcemit_branch_f(fs, e);
877 } else if (op == OPR_CONCAT) {
878 expr_tonextreg(fs, e);
879 } else if (op == OPR_EQ || op == OPR_NE) {
880 if (!expr_isk_nojump(e)) expr_toanyreg(fs, e);
881 } else {
882 if (!expr_isnumk_nojump(e)) expr_toanyreg(fs, e);
886 /* Emit binary operator. */
887 static void bcemit_binop(FuncState *fs, BinOpr op, ExpDesc *e1, ExpDesc *e2)
889 if (op <= OPR_POW) {
890 bcemit_arith(fs, op, e1, e2);
891 } else if (op == OPR_AND) {
892 lua_assert(e1->t == NO_JMP); /* List must be closed. */
893 expr_discharge(fs, e2);
894 jmp_append(fs, &e2->f, e1->f);
895 *e1 = *e2;
896 } else if (op == OPR_OR) {
897 lua_assert(e1->f == NO_JMP); /* List must be closed. */
898 expr_discharge(fs, e2);
899 jmp_append(fs, &e2->t, e1->t);
900 *e1 = *e2;
901 } else if (op == OPR_CONCAT) {
902 expr_toval(fs, e2);
903 if (e2->k == VRELOCABLE && bc_op(*bcptr(fs, e2)) == BC_CAT) {
904 lua_assert(e1->u.s.info == bc_b(*bcptr(fs, e2))-1);
905 expr_free(fs, e1);
906 setbc_b(bcptr(fs, e2), e1->u.s.info);
907 e1->u.s.info = e2->u.s.info;
908 } else {
909 expr_tonextreg(fs, e2);
910 expr_free(fs, e2);
911 expr_free(fs, e1);
912 e1->u.s.info = bcemit_ABC(fs, BC_CAT, 0, e1->u.s.info, e2->u.s.info);
914 e1->k = VRELOCABLE;
915 } else {
916 lua_assert(op == OPR_NE || op == OPR_EQ ||
917 op == OPR_LT || op == OPR_GE || op == OPR_LE || op == OPR_GT);
918 bcemit_comp(fs, op, e1, e2);
922 /* Emit unary operator. */
923 static void bcemit_unop(FuncState *fs, BCOp op, ExpDesc *e)
925 if (op == BC_NOT) {
926 /* Swap true and false lists. */
927 { BCPos temp = e->f; e->f = e->t; e->t = temp; }
928 jmp_dropval(fs, e->f);
929 jmp_dropval(fs, e->t);
930 expr_discharge(fs, e);
931 if (e->k == VKNIL || e->k == VKFALSE) {
932 e->k = VKTRUE;
933 return;
934 } else if (expr_isk(e) || (LJ_HASFFI && e->k == VKCDATA)) {
935 e->k = VKFALSE;
936 return;
937 } else if (e->k == VJMP) {
938 invertcond(fs, e);
939 return;
940 } else if (e->k == VRELOCABLE) {
941 bcreg_reserve(fs, 1);
942 setbc_a(bcptr(fs, e), fs->freereg-1);
943 e->u.s.info = fs->freereg-1;
944 e->k = VNONRELOC;
945 } else {
946 lua_assert(e->k == VNONRELOC);
948 } else {
949 lua_assert(op == BC_UNM || op == BC_LEN);
950 if (op == BC_UNM && !expr_hasjump(e)) { /* Constant-fold negations. */
951 #if LJ_HASFFI
952 if (e->k == VKCDATA) { /* Fold in-place since cdata is not interned. */
953 GCcdata *cd = cdataV(&e->u.nval);
954 int64_t *p = (int64_t *)cdataptr(cd);
955 if (cd->ctypeid == CTID_COMPLEX_DOUBLE)
956 p[1] ^= (int64_t)U64x(80000000,00000000);
957 else
958 *p = -*p;
959 return;
960 } else
961 #endif
962 if (expr_isnumk(e) && !expr_numiszero(e)) { /* Avoid folding to -0. */
963 TValue *o = expr_numtv(e);
964 if (tvisint(o)) {
965 int32_t k = intV(o);
966 if (k == -k)
967 setnumV(o, -(lua_Number)k);
968 else
969 setintV(o, -k);
970 return;
971 } else {
972 o->u64 ^= U64x(80000000,00000000);
973 return;
977 expr_toanyreg(fs, e);
979 expr_free(fs, e);
980 e->u.s.info = bcemit_AD(fs, op, 0, e->u.s.info);
981 e->k = VRELOCABLE;
984 /* -- Lexer support ------------------------------------------------------- */
986 /* Check and consume optional token. */
987 static int lex_opt(LexState *ls, LexToken tok)
989 if (ls->token == tok) {
990 lj_lex_next(ls);
991 return 1;
993 return 0;
996 /* Check and consume token. */
997 static void lex_check(LexState *ls, LexToken tok)
999 if (ls->token != tok)
1000 err_token(ls, tok);
1001 lj_lex_next(ls);
1004 /* Check for matching token. */
1005 static void lex_match(LexState *ls, LexToken what, LexToken who, BCLine line)
1007 if (!lex_opt(ls, what)) {
1008 if (line == ls->linenumber) {
1009 err_token(ls, what);
1010 } else {
1011 const char *swhat = lj_lex_token2str(ls, what);
1012 const char *swho = lj_lex_token2str(ls, who);
1013 lj_lex_error(ls, ls->token, LJ_ERR_XMATCH, swhat, swho, line);
1018 /* Check for string token. */
1019 static GCstr *lex_str(LexState *ls)
1021 GCstr *s;
1022 if (ls->token != TK_name && (LJ_52 || ls->token != TK_goto))
1023 err_token(ls, TK_name);
1024 s = strV(&ls->tokenval);
1025 lj_lex_next(ls);
1026 return s;
1029 /* -- Variable handling --------------------------------------------------- */
1031 #define var_get(ls, fs, i) ((ls)->vstack[(fs)->varmap[(i)]])
1033 /* Define a new local variable. */
1034 static void var_new(LexState *ls, BCReg n, GCstr *name)
1036 FuncState *fs = ls->fs;
1037 MSize vtop = ls->vtop;
1038 checklimit(fs, fs->nactvar+n, LJ_MAX_LOCVAR, "local variables");
1039 if (LJ_UNLIKELY(vtop >= ls->sizevstack)) {
1040 if (ls->sizevstack >= LJ_MAX_VSTACK)
1041 lj_lex_error(ls, 0, LJ_ERR_XLIMC, LJ_MAX_VSTACK);
1042 lj_mem_growvec(ls->L, ls->vstack, ls->sizevstack, LJ_MAX_VSTACK, VarInfo);
1044 lua_assert((uintptr_t)name < VARNAME__MAX ||
1045 lj_tab_getstr(fs->kt, name) != NULL);
1046 /* NOBARRIER: name is anchored in fs->kt and ls->vstack is not a GCobj. */
1047 setgcref(ls->vstack[vtop].name, obj2gco(name));
1048 fs->varmap[fs->nactvar+n] = (uint16_t)vtop;
1049 ls->vtop = vtop+1;
1052 #define var_new_lit(ls, n, v) \
1053 var_new(ls, (n), lj_parse_keepstr(ls, "" v, sizeof(v)-1))
1055 #define var_new_fixed(ls, n, vn) \
1056 var_new(ls, (n), (GCstr *)(uintptr_t)(vn))
1058 /* Add local variables. */
1059 static void var_add(LexState *ls, BCReg nvars)
1061 FuncState *fs = ls->fs;
1062 fs->nactvar = (uint8_t)(fs->nactvar + nvars);
1063 for (; nvars; nvars--) {
1064 VarInfo *v = &var_get(ls, fs, fs->nactvar - nvars);
1065 v->startpc = fs->pc;
1066 v->endpc = 0;
1070 /* Remove local variables. */
1071 static void var_remove(LexState *ls, BCReg tolevel)
1073 FuncState *fs = ls->fs;
1074 while (fs->nactvar > tolevel)
1075 var_get(ls, fs, --fs->nactvar).endpc |= fs->pc;
1078 /* Lookup local variable name. */
1079 static BCReg var_lookup_local(FuncState *fs, GCstr *n)
1081 int i;
1082 for (i = fs->nactvar-1; i >= 0; i--) {
1083 if (n == strref(var_get(fs->ls, fs, i).name))
1084 return (BCReg)i;
1086 return (BCReg)-1; /* Not found. */
1089 /* Lookup or add upvalue index. */
1090 static MSize var_lookup_uv(FuncState *fs, MSize vidx, ExpDesc *e)
1092 MSize i, n = fs->nuv;
1093 for (i = 0; i < n; i++)
1094 if (fs->uvloc[i].vidx == vidx)
1095 return i; /* Already exists. */
1096 /* Otherwise create a new one. */
1097 checklimit(fs, fs->nuv, LJ_MAX_UPVAL, "upvalues");
1098 lua_assert(e->k == VLOCAL || e->k == VUPVAL);
1099 fs->uvloc[n].vidx = (uint16_t)vidx;
1100 fs->uvloc[n].slot = (uint16_t)(e->u.s.info |
1101 (e->k == VLOCAL ? PROTO_UV_LOCAL : 0));
1102 fs->nuv = n+1;
1103 return n;
1106 /* Forward declaration. */
1107 static void fscope_uvmark(FuncState *fs, BCReg level);
1109 /* Recursively lookup variables in enclosing functions. */
1110 static MSize var_lookup_(FuncState *fs, GCstr *name, ExpDesc *e, int first)
1112 if (fs) {
1113 BCReg reg = var_lookup_local(fs, name);
1114 if ((int32_t)reg >= 0) { /* Local in this function? */
1115 expr_init(e, VLOCAL, reg);
1116 if (!first)
1117 fscope_uvmark(fs, reg); /* Scope now has an upvalue. */
1118 return (MSize)(e->u.s.aux = (uint32_t)fs->varmap[reg]);
1119 } else {
1120 MSize vidx = var_lookup_(fs->prev, name, e, 0); /* Var in outer func? */
1121 if ((int32_t)vidx >= 0) { /* Yes, make it an upvalue here. */
1122 e->u.s.info = (uint8_t)var_lookup_uv(fs, vidx, e);
1123 e->k = VUPVAL;
1124 return vidx;
1127 } else { /* Not found in any function, must be a global. */
1128 expr_init(e, VGLOBAL, 0);
1129 e->u.sval = name;
1131 return (MSize)-1; /* Global. */
1134 /* Lookup variable name. */
1135 #define var_lookup(ls, e) \
1136 var_lookup_((ls)->fs, lex_str(ls), (e), 1)
1138 /* -- Goto an label handling ---------------------------------------------- */
1140 /* Add a new goto or label. */
1141 static MSize gola_new(LexState *ls, GCstr *name, uint32_t type, BCPos pc)
1143 FuncState *fs = ls->fs;
1144 MSize vtop = ls->vtop;
1145 if (LJ_UNLIKELY(vtop >= ls->sizevstack)) {
1146 if (ls->sizevstack >= LJ_MAX_VSTACK)
1147 lj_lex_error(ls, 0, LJ_ERR_XLIMC, LJ_MAX_VSTACK);
1148 lj_mem_growvec(ls->L, ls->vstack, ls->sizevstack, LJ_MAX_VSTACK, VarInfo);
1150 lua_assert(name == NAME_BREAK || lj_tab_getstr(fs->kt, name) != NULL);
1151 /* NOBARRIER: name is anchored in fs->kt and ls->vstack is not a GCobj. */
1152 setgcref(ls->vstack[vtop].name, obj2gco(name));
1153 ls->vstack[vtop].startpc = pc;
1154 ls->vstack[vtop].endpc = fs->nactvar | type;
1155 ls->vtop = vtop+1;
1156 return vtop;
1159 #define gola_nactvar(v) ((uint8_t)((v)->endpc))
1160 #define gola_isgoto(v) ((v)->endpc & VSTACK_GOTO)
1161 #define gola_islabel(v) ((v)->endpc & VSTACK_LABEL)
1162 #define gola_isgotolabel(v) ((v)->endpc & (VSTACK_GOTO|VSTACK_LABEL))
1164 /* Patch goto to jump to label. */
1165 static void gola_patch(LexState *ls, VarInfo *vg, VarInfo *vl)
1167 FuncState *fs = ls->fs;
1168 BCPos pc = vg->startpc;
1169 setgcrefnull(vg->name); /* Invalidate pending goto. */
1170 setbc_a(&fs->bcbase[pc].ins, gola_nactvar(vl));
1171 jmp_patch(fs, pc, vl->startpc);
1174 /* Patch goto to close upvalues. */
1175 static void gola_close(LexState *ls, VarInfo *vg)
1177 FuncState *fs = ls->fs;
1178 BCPos pc = vg->startpc;
1179 BCIns *ip = &fs->bcbase[pc].ins;
1180 lua_assert(gola_isgoto(vg));
1181 lua_assert(bc_op(*ip) == BC_JMP || bc_op(*ip) == BC_UCLO);
1182 setbc_a(ip, gola_nactvar(vg));
1183 if (bc_op(*ip) == BC_JMP) {
1184 BCPos next = jmp_next(fs, pc);
1185 if (next != NO_JMP) jmp_patch(fs, next, pc); /* Jump to UCLO. */
1186 setbc_op(ip, BC_UCLO); /* Turn into UCLO. */
1187 setbc_j(ip, NO_JMP);
1191 /* Resolve pending forward gotos for label. */
1192 static void gola_resolve(LexState *ls, FuncScope *bl, MSize idx)
1194 VarInfo *vg = ls->vstack + bl->vstart;
1195 VarInfo *vl = ls->vstack + idx;
1196 for (; vg < vl; vg++)
1197 if (gcrefeq(vg->name, vl->name) && gola_isgoto(vg)) {
1198 if (gola_nactvar(vg) < gola_nactvar(vl)) {
1199 GCstr *name = strref(var_get(ls, ls->fs, gola_nactvar(vg)).name);
1200 lua_assert((uintptr_t)name >= VARNAME__MAX);
1201 ls->linenumber = ls->fs->bcbase[vg->startpc].line;
1202 lua_assert(strref(vg->name) != NAME_BREAK);
1203 lj_lex_error(ls, 0, LJ_ERR_XGSCOPE,
1204 strdata(strref(vg->name)), strdata(name));
1206 gola_patch(ls, vg, vl);
1210 /* Fixup remaining gotos and labels for scope. */
1211 static void gola_fixup(LexState *ls, FuncScope *bl)
1213 VarInfo *v = ls->vstack + bl->vstart;
1214 VarInfo *ve = ls->vstack + ls->vtop;
1215 for (; v < ve; v++) {
1216 GCstr *name = strref(v->name);
1217 if (name != NULL) { /* Only consider remaining valid gotos/labels. */
1218 if (gola_islabel(v)) {
1219 VarInfo *vg;
1220 setgcrefnull(v->name); /* Invalidate label that goes out of scope. */
1221 for (vg = v+1; vg < ve; vg++) /* Resolve pending backward gotos. */
1222 if (strref(vg->name) == name && gola_isgoto(vg)) {
1223 if ((bl->flags&FSCOPE_UPVAL) && gola_nactvar(vg) > gola_nactvar(v))
1224 gola_close(ls, vg);
1225 gola_patch(ls, vg, v);
1227 } else if (gola_isgoto(v)) {
1228 if (bl->prev) { /* Propagate goto or break to outer scope. */
1229 bl->prev->flags |= name == NAME_BREAK ? FSCOPE_BREAK : FSCOPE_GOLA;
1230 v->endpc = bl->nactvar | VSTACK_GOTO;
1231 if ((bl->flags & FSCOPE_UPVAL))
1232 gola_close(ls, v);
1233 } else { /* No outer scope: undefined goto label or no loop. */
1234 ls->linenumber = ls->fs->bcbase[v->startpc].line;
1235 if (name == NAME_BREAK)
1236 lj_lex_error(ls, 0, LJ_ERR_XBREAK);
1237 else
1238 lj_lex_error(ls, 0, LJ_ERR_XLUNDEF, strdata(name));
1245 /* Find existing label. */
1246 static VarInfo *gola_findlabel(LexState *ls, GCstr *name)
1248 VarInfo *v = ls->vstack + ls->fs->bl->vstart;
1249 VarInfo *ve = ls->vstack + ls->vtop;
1250 for (; v < ve; v++)
1251 if (strref(v->name) == name && gola_islabel(v))
1252 return v;
1253 return NULL;
1256 /* -- Scope handling ------------------------------------------------------ */
1258 /* Begin a scope. */
1259 static void fscope_begin(FuncState *fs, FuncScope *bl, int flags)
1261 bl->nactvar = (uint8_t)fs->nactvar;
1262 bl->flags = flags;
1263 bl->vstart = fs->ls->vtop;
1264 bl->prev = fs->bl;
1265 fs->bl = bl;
1266 lua_assert(fs->freereg == fs->nactvar);
1269 /* End a scope. */
1270 static void fscope_end(FuncState *fs)
1272 FuncScope *bl = fs->bl;
1273 LexState *ls = fs->ls;
1274 fs->bl = bl->prev;
1275 var_remove(ls, bl->nactvar);
1276 fs->freereg = fs->nactvar;
1277 lua_assert(bl->nactvar == fs->nactvar);
1278 if ((bl->flags & (FSCOPE_UPVAL|FSCOPE_NOCLOSE)) == FSCOPE_UPVAL)
1279 bcemit_AJ(fs, BC_UCLO, bl->nactvar, 0);
1280 if ((bl->flags & FSCOPE_BREAK)) {
1281 if ((bl->flags & FSCOPE_LOOP)) {
1282 MSize idx = gola_new(ls, NAME_BREAK, VSTACK_LABEL, fs->pc);
1283 ls->vtop = idx; /* Drop break label immediately. */
1284 gola_resolve(ls, bl, idx);
1285 return;
1286 } /* else: need the fixup step to propagate the breaks. */
1287 } else if (!(bl->flags & FSCOPE_GOLA)) {
1288 return;
1290 gola_fixup(ls, bl);
1293 /* Mark scope as having an upvalue. */
1294 static void fscope_uvmark(FuncState *fs, BCReg level)
1296 FuncScope *bl;
1297 for (bl = fs->bl; bl && bl->nactvar > level; bl = bl->prev)
1299 if (bl)
1300 bl->flags |= FSCOPE_UPVAL;
1303 /* -- Function state management ------------------------------------------- */
1305 /* Fixup bytecode for prototype. */
1306 static void fs_fixup_bc(FuncState *fs, GCproto *pt, BCIns *bc, MSize n)
1308 BCInsLine *base = fs->bcbase;
1309 MSize i;
1310 pt->sizebc = n;
1311 bc[0] = BCINS_AD((fs->flags & PROTO_VARARG) ? BC_FUNCV : BC_FUNCF,
1312 fs->framesize, 0);
1313 for (i = 1; i < n; i++)
1314 bc[i] = base[i].ins;
1317 /* Fixup constants for prototype. */
1318 static void fs_fixup_k(FuncState *fs, GCproto *pt, void *kptr)
1320 GCtab *kt;
1321 TValue *array;
1322 Node *node;
1323 MSize i, hmask;
1324 checklimitgt(fs, fs->nkn, BCMAX_D+1, "constants");
1325 checklimitgt(fs, fs->nkgc, BCMAX_D+1, "constants");
1326 setmref(pt->k, kptr);
1327 pt->sizekn = fs->nkn;
1328 pt->sizekgc = fs->nkgc;
1329 kt = fs->kt;
1330 array = tvref(kt->array);
1331 for (i = 0; i < kt->asize; i++)
1332 if (tvhaskslot(&array[i])) {
1333 TValue *tv = &((TValue *)kptr)[tvkslot(&array[i])];
1334 if (LJ_DUALNUM)
1335 setintV(tv, (int32_t)i);
1336 else
1337 setnumV(tv, (lua_Number)i);
1339 node = noderef(kt->node);
1340 hmask = kt->hmask;
1341 for (i = 0; i <= hmask; i++) {
1342 Node *n = &node[i];
1343 if (tvhaskslot(&n->val)) {
1344 ptrdiff_t kidx = (ptrdiff_t)tvkslot(&n->val);
1345 lua_assert(!tvisint(&n->key));
1346 if (tvisnum(&n->key)) {
1347 TValue *tv = &((TValue *)kptr)[kidx];
1348 if (LJ_DUALNUM) {
1349 lua_Number nn = numV(&n->key);
1350 int32_t k = lj_num2int(nn);
1351 lua_assert(!tvismzero(&n->key));
1352 if ((lua_Number)k == nn)
1353 setintV(tv, k);
1354 else
1355 *tv = n->key;
1356 } else {
1357 *tv = n->key;
1359 } else {
1360 GCobj *o = gcV(&n->key);
1361 setgcref(((GCRef *)kptr)[~kidx], o);
1362 lj_gc_objbarrier(fs->L, pt, o);
1368 /* Fixup upvalues for prototype. */
1369 static void fs_fixup_uv(FuncState *fs, GCproto *pt, uint16_t *uv)
1371 VarInfo *vstack;
1372 UVMap *uvloc;
1373 MSize i, n = fs->nuv;
1374 setmref(pt->uv, uv);
1375 pt->sizeuv = n;
1376 vstack = fs->ls->vstack;
1377 uvloc = fs->uvloc;
1378 for (i = 0; i < n; i++) {
1379 uint16_t slot = uvloc[i].slot;
1380 uint16_t vidx = uvloc[i].vidx;
1381 if ((slot & PROTO_UV_LOCAL) && !(vstack[vidx].endpc & VSTACK_VAR_RW))
1382 slot |= PROTO_UV_IMMUTABLE;
1383 uv[i] = slot;
1387 #ifndef LUAJIT_DISABLE_DEBUGINFO
1388 /* Prepare lineinfo for prototype. */
1389 static size_t fs_prep_line(FuncState *fs, BCLine numline)
1391 return (fs->pc-1) << (numline < 256 ? 0 : numline < 65536 ? 1 : 2);
1394 /* Fixup lineinfo for prototype. */
1395 static void fs_fixup_line(FuncState *fs, GCproto *pt,
1396 void *lineinfo, BCLine numline)
1398 BCInsLine *base = fs->bcbase + 1;
1399 BCLine first = fs->linedefined;
1400 MSize i = 0, n = fs->pc-1;
1401 pt->firstline = fs->linedefined;
1402 pt->numline = numline;
1403 setmref(pt->lineinfo, lineinfo);
1404 if (LJ_LIKELY(numline < 256)) {
1405 uint8_t *li = (uint8_t *)lineinfo;
1406 do {
1407 BCLine delta = base[i].line - first;
1408 lua_assert(delta >= 0 && delta < 256);
1409 li[i] = (uint8_t)delta;
1410 } while (++i < n);
1411 } else if (LJ_LIKELY(numline < 65536)) {
1412 uint16_t *li = (uint16_t *)lineinfo;
1413 do {
1414 BCLine delta = base[i].line - first;
1415 lua_assert(delta >= 0 && delta < 65536);
1416 li[i] = (uint16_t)delta;
1417 } while (++i < n);
1418 } else {
1419 uint32_t *li = (uint32_t *)lineinfo;
1420 do {
1421 BCLine delta = base[i].line - first;
1422 lua_assert(delta >= 0);
1423 li[i] = (uint32_t)delta;
1424 } while (++i < n);
1428 /* Resize buffer if needed. */
1429 static LJ_NOINLINE void fs_buf_resize(LexState *ls, MSize len)
1431 MSize sz = ls->sb.sz * 2;
1432 while (ls->sb.n + len > sz) sz = sz * 2;
1433 lj_str_resizebuf(ls->L, &ls->sb, sz);
1436 static LJ_AINLINE void fs_buf_need(LexState *ls, MSize len)
1438 if (LJ_UNLIKELY(ls->sb.n + len > ls->sb.sz))
1439 fs_buf_resize(ls, len);
1442 /* Add string to buffer. */
1443 static void fs_buf_str(LexState *ls, const char *str, MSize len)
1445 char *p = ls->sb.buf + ls->sb.n;
1446 MSize i;
1447 ls->sb.n += len;
1448 for (i = 0; i < len; i++) p[i] = str[i];
1451 /* Add ULEB128 value to buffer. */
1452 static void fs_buf_uleb128(LexState *ls, uint32_t v)
1454 MSize n = ls->sb.n;
1455 uint8_t *p = (uint8_t *)ls->sb.buf;
1456 for (; v >= 0x80; v >>= 7)
1457 p[n++] = (uint8_t)((v & 0x7f) | 0x80);
1458 p[n++] = (uint8_t)v;
1459 ls->sb.n = n;
1462 /* Prepare variable info for prototype. */
1463 static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar)
1465 VarInfo *vs = fs->ls->vstack, *ve;
1466 MSize i, n;
1467 BCPos lastpc;
1468 lj_str_resetbuf(&ls->sb); /* Copy to temp. string buffer. */
1469 /* Store upvalue names. */
1470 for (i = 0, n = fs->nuv; i < n; i++) {
1471 GCstr *s = strref(vs[fs->uvloc[i].vidx].name);
1472 MSize len = s->len+1;
1473 fs_buf_need(ls, len);
1474 fs_buf_str(ls, strdata(s), len);
1476 *ofsvar = ls->sb.n;
1477 lastpc = 0;
1478 /* Store local variable names and compressed ranges. */
1479 for (ve = vs + ls->vtop, vs += fs->vbase; vs < ve; vs++) {
1480 if (!gola_isgotolabel(vs)) {
1481 GCstr *s = strref(vs->name);
1482 BCPos startpc;
1483 if ((uintptr_t)s < VARNAME__MAX) {
1484 fs_buf_need(ls, 1 + 2*5);
1485 ls->sb.buf[ls->sb.n++] = (uint8_t)(uintptr_t)s;
1486 } else {
1487 MSize len = s->len+1;
1488 fs_buf_need(ls, len + 2*5);
1489 fs_buf_str(ls, strdata(s), len);
1491 startpc = vs->startpc;
1492 fs_buf_uleb128(ls, startpc-lastpc);
1493 fs_buf_uleb128(ls, (vs->endpc & VSTACK_MASK)-startpc);
1494 lastpc = startpc;
1497 fs_buf_need(ls, 1);
1498 ls->sb.buf[ls->sb.n++] = '\0'; /* Terminator for varinfo. */
1499 return ls->sb.n;
1502 /* Fixup variable info for prototype. */
1503 static void fs_fixup_var(LexState *ls, GCproto *pt, uint8_t *p, size_t ofsvar)
1505 setmref(pt->uvinfo, p);
1506 setmref(pt->varinfo, (char *)p + ofsvar);
1507 memcpy(p, ls->sb.buf, ls->sb.n); /* Copy from temp. string buffer. */
1509 #else
1511 /* Initialize with empty debug info, if disabled. */
1512 #define fs_prep_line(fs, numline) (UNUSED(numline), 0)
1513 #define fs_fixup_line(fs, pt, li, numline) \
1514 pt->firstline = pt->numline = 0, setmref((pt)->lineinfo, NULL)
1515 #define fs_prep_var(ls, fs, ofsvar) (UNUSED(ofsvar), 0)
1516 #define fs_fixup_var(ls, pt, p, ofsvar) \
1517 setmref((pt)->uvinfo, NULL), setmref((pt)->varinfo, NULL)
1519 #endif
1521 /* Check if bytecode op returns. */
1522 static int bcopisret(BCOp op)
1524 switch (op) {
1525 case BC_CALLMT: case BC_CALLT:
1526 case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1:
1527 return 1;
1528 default:
1529 return 0;
1533 /* Fixup return instruction for prototype. */
1534 static void fs_fixup_ret(FuncState *fs)
1536 BCPos lastpc = fs->pc;
1537 if (lastpc <= fs->lasttarget || !bcopisret(bc_op(fs->bcbase[lastpc-1].ins))) {
1538 if ((fs->bl->flags & FSCOPE_UPVAL))
1539 bcemit_AJ(fs, BC_UCLO, 0, 0);
1540 bcemit_AD(fs, BC_RET0, 0, 1); /* Need final return. */
1542 fs->bl->flags |= FSCOPE_NOCLOSE; /* Handled above. */
1543 fscope_end(fs);
1544 lua_assert(fs->bl == NULL);
1545 /* May need to fixup returns encoded before first function was created. */
1546 if (fs->flags & PROTO_FIXUP_RETURN) {
1547 BCPos pc;
1548 for (pc = 1; pc < lastpc; pc++) {
1549 BCIns ins = fs->bcbase[pc].ins;
1550 BCPos offset;
1551 switch (bc_op(ins)) {
1552 case BC_CALLMT: case BC_CALLT:
1553 case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1:
1554 offset = bcemit_INS(fs, ins)-(pc+1)+BCBIAS_J; /* Copy return ins. */
1555 if (offset > BCMAX_D)
1556 err_syntax(fs->ls, LJ_ERR_XFIXUP);
1557 /* Replace with UCLO plus branch. */
1558 fs->bcbase[pc].ins = BCINS_AD(BC_UCLO, 0, offset);
1559 break;
1560 case BC_UCLO:
1561 return; /* We're done. */
1562 default:
1563 break;
1569 /* Finish a FuncState and return the new prototype. */
1570 static GCproto *fs_finish(LexState *ls, BCLine line)
1572 lua_State *L = ls->L;
1573 FuncState *fs = ls->fs;
1574 BCLine numline = line - fs->linedefined;
1575 size_t sizept, ofsk, ofsuv, ofsli, ofsdbg, ofsvar;
1576 GCproto *pt;
1578 /* Apply final fixups. */
1579 fs_fixup_ret(fs);
1581 /* Calculate total size of prototype including all colocated arrays. */
1582 sizept = sizeof(GCproto) + fs->pc*sizeof(BCIns) + fs->nkgc*sizeof(GCRef);
1583 sizept = (sizept + sizeof(TValue)-1) & ~(sizeof(TValue)-1);
1584 ofsk = sizept; sizept += fs->nkn*sizeof(TValue);
1585 ofsuv = sizept; sizept += ((fs->nuv+1)&~1)*2;
1586 ofsli = sizept; sizept += fs_prep_line(fs, numline);
1587 ofsdbg = sizept; sizept += fs_prep_var(ls, fs, &ofsvar);
1589 /* Allocate prototype and initialize its fields. */
1590 pt = (GCproto *)lj_mem_newgco(L, (MSize)sizept);
1591 pt->gct = ~LJ_TPROTO;
1592 pt->sizept = (MSize)sizept;
1593 pt->trace = 0;
1594 pt->flags = (uint8_t)(fs->flags & ~(PROTO_HAS_RETURN|PROTO_FIXUP_RETURN));
1595 pt->numparams = fs->numparams;
1596 pt->framesize = fs->framesize;
1597 setgcref(pt->chunkname, obj2gco(ls->chunkname));
1599 /* Close potentially uninitialized gap between bc and kgc. */
1600 *(uint32_t *)((char *)pt + ofsk - sizeof(GCRef)*(fs->nkgc+1)) = 0;
1601 fs_fixup_bc(fs, pt, (BCIns *)((char *)pt + sizeof(GCproto)), fs->pc);
1602 fs_fixup_k(fs, pt, (void *)((char *)pt + ofsk));
1603 fs_fixup_uv(fs, pt, (uint16_t *)((char *)pt + ofsuv));
1604 fs_fixup_line(fs, pt, (void *)((char *)pt + ofsli), numline);
1605 fs_fixup_var(ls, pt, (uint8_t *)((char *)pt + ofsdbg), ofsvar);
1607 lj_vmevent_send(L, BC,
1608 setprotoV(L, L->top++, pt);
1611 L->top--; /* Pop table of constants. */
1612 ls->vtop = fs->vbase; /* Reset variable stack. */
1613 ls->fs = fs->prev;
1614 lua_assert(ls->fs != NULL || ls->token == TK_eof);
1615 return pt;
1618 /* Initialize a new FuncState. */
1619 static void fs_init(LexState *ls, FuncState *fs)
1621 lua_State *L = ls->L;
1622 fs->prev = ls->fs; ls->fs = fs; /* Append to list. */
1623 fs->ls = ls;
1624 fs->vbase = ls->vtop;
1625 fs->L = L;
1626 fs->pc = 0;
1627 fs->lasttarget = 0;
1628 fs->jpc = NO_JMP;
1629 fs->freereg = 0;
1630 fs->nkgc = 0;
1631 fs->nkn = 0;
1632 fs->nactvar = 0;
1633 fs->nuv = 0;
1634 fs->bl = NULL;
1635 fs->flags = 0;
1636 fs->framesize = 1; /* Minimum frame size. */
1637 fs->kt = lj_tab_new(L, 0, 0);
1638 /* Anchor table of constants in stack to avoid being collected. */
1639 settabV(L, L->top, fs->kt);
1640 incr_top(L);
1643 /* -- Expressions --------------------------------------------------------- */
1645 /* Forward declaration. */
1646 static void expr(LexState *ls, ExpDesc *v);
1648 /* Return string expression. */
1649 static void expr_str(LexState *ls, ExpDesc *e)
1651 expr_init(e, VKSTR, 0);
1652 e->u.sval = lex_str(ls);
1655 /* Return index expression. */
1656 static void expr_index(FuncState *fs, ExpDesc *t, ExpDesc *e)
1658 /* Already called: expr_toval(fs, e). */
1659 t->k = VINDEXED;
1660 if (expr_isnumk(e)) {
1661 #if LJ_DUALNUM
1662 if (tvisint(expr_numtv(e))) {
1663 int32_t k = intV(expr_numtv(e));
1664 if (checku8(k)) {
1665 t->u.s.aux = BCMAX_C+1+(uint32_t)k; /* 256..511: const byte key */
1666 return;
1669 #else
1670 lua_Number n = expr_numberV(e);
1671 int32_t k = lj_num2int(n);
1672 if (checku8(k) && n == (lua_Number)k) {
1673 t->u.s.aux = BCMAX_C+1+(uint32_t)k; /* 256..511: const byte key */
1674 return;
1676 #endif
1677 } else if (expr_isstrk(e)) {
1678 BCReg idx = const_str(fs, e);
1679 if (idx <= BCMAX_C) {
1680 t->u.s.aux = ~idx; /* -256..-1: const string key */
1681 return;
1684 t->u.s.aux = expr_toanyreg(fs, e); /* 0..255: register */
1687 /* Parse index expression with named field. */
1688 static void expr_field(LexState *ls, ExpDesc *v)
1690 FuncState *fs = ls->fs;
1691 ExpDesc key;
1692 expr_toanyreg(fs, v);
1693 lj_lex_next(ls); /* Skip dot or colon. */
1694 expr_str(ls, &key);
1695 expr_index(fs, v, &key);
1698 /* Parse index expression with brackets. */
1699 static void expr_bracket(LexState *ls, ExpDesc *v)
1701 lj_lex_next(ls); /* Skip '['. */
1702 expr(ls, v);
1703 expr_toval(ls->fs, v);
1704 lex_check(ls, ']');
1707 /* Get value of constant expression. */
1708 static void expr_kvalue(TValue *v, ExpDesc *e)
1710 if (e->k <= VKTRUE) {
1711 setitype(v, ~(uint32_t)e->k);
1712 } else if (e->k == VKSTR) {
1713 setgcref(v->gcr, obj2gco(e->u.sval));
1714 setitype(v, LJ_TSTR);
1715 } else {
1716 lua_assert(tvisnumber(expr_numtv(e)));
1717 *v = *expr_numtv(e);
1721 /* Parse table constructor expression. */
1722 static void expr_table(LexState *ls, ExpDesc *e)
1724 FuncState *fs = ls->fs;
1725 BCLine line = ls->linenumber;
1726 GCtab *t = NULL;
1727 int vcall = 0, needarr = 0, fixt = 0;
1728 uint32_t narr = 1; /* First array index. */
1729 uint32_t nhash = 0; /* Number of hash entries. */
1730 BCReg freg = fs->freereg;
1731 BCPos pc = bcemit_AD(fs, BC_TNEW, freg, 0);
1732 expr_init(e, VNONRELOC, freg);
1733 bcreg_reserve(fs, 1);
1734 freg++;
1735 lex_check(ls, '{');
1736 while (ls->token != '}') {
1737 ExpDesc key, val;
1738 vcall = 0;
1739 if (ls->token == '[') {
1740 expr_bracket(ls, &key); /* Already calls expr_toval. */
1741 if (!expr_isk(&key)) expr_index(fs, e, &key);
1742 if (expr_isnumk(&key) && expr_numiszero(&key)) needarr = 1; else nhash++;
1743 lex_check(ls, '=');
1744 } else if ((ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) &&
1745 lj_lex_lookahead(ls) == '=') {
1746 expr_str(ls, &key);
1747 lex_check(ls, '=');
1748 nhash++;
1749 } else {
1750 expr_init(&key, VKNUM, 0);
1751 setintV(&key.u.nval, (int)narr);
1752 narr++;
1753 needarr = vcall = 1;
1755 expr(ls, &val);
1756 if (expr_isk(&key) && key.k != VKNIL &&
1757 (key.k == VKSTR || expr_isk_nojump(&val))) {
1758 TValue k, *v;
1759 if (!t) { /* Create template table on demand. */
1760 BCReg kidx;
1761 t = lj_tab_new(fs->L, narr, hsize2hbits(nhash));
1762 kidx = const_gc(fs, obj2gco(t), LJ_TTAB);
1763 fs->bcbase[pc].ins = BCINS_AD(BC_TDUP, freg-1, kidx);
1765 vcall = 0;
1766 expr_kvalue(&k, &key);
1767 v = lj_tab_set(fs->L, t, &k);
1768 lj_gc_anybarriert(fs->L, t);
1769 if (expr_isk_nojump(&val)) { /* Add const key/value to template table. */
1770 expr_kvalue(v, &val);
1771 } else { /* Otherwise create dummy string key (avoids lj_tab_newkey). */
1772 settabV(fs->L, v, t); /* Preserve key with table itself as value. */
1773 fixt = 1; /* Fix this later, after all resizes. */
1774 goto nonconst;
1776 } else {
1777 nonconst:
1778 if (val.k != VCALL) { expr_toanyreg(fs, &val); vcall = 0; }
1779 if (expr_isk(&key)) expr_index(fs, e, &key);
1780 bcemit_store(fs, e, &val);
1782 fs->freereg = freg;
1783 if (!lex_opt(ls, ',') && !lex_opt(ls, ';')) break;
1785 lex_match(ls, '}', '{', line);
1786 if (vcall) {
1787 BCInsLine *ilp = &fs->bcbase[fs->pc-1];
1788 ExpDesc en;
1789 lua_assert(bc_a(ilp->ins) == freg &&
1790 bc_op(ilp->ins) == (narr > 256 ? BC_TSETV : BC_TSETB));
1791 expr_init(&en, VKNUM, 0);
1792 en.u.nval.u32.lo = narr-1;
1793 en.u.nval.u32.hi = 0x43300000; /* Biased integer to avoid denormals. */
1794 if (narr > 256) { fs->pc--; ilp--; }
1795 ilp->ins = BCINS_AD(BC_TSETM, freg, const_num(fs, &en));
1796 setbc_b(&ilp[-1].ins, 0);
1798 if (pc == fs->pc-1) { /* Make expr relocable if possible. */
1799 e->u.s.info = pc;
1800 fs->freereg--;
1801 e->k = VRELOCABLE;
1802 } else {
1803 e->k = VNONRELOC; /* May have been changed by expr_index. */
1805 if (!t) { /* Construct TNEW RD: hhhhhaaaaaaaaaaa. */
1806 BCIns *ip = &fs->bcbase[pc].ins;
1807 if (!needarr) narr = 0;
1808 else if (narr < 3) narr = 3;
1809 else if (narr > 0x7ff) narr = 0x7ff;
1810 setbc_d(ip, narr|(hsize2hbits(nhash)<<11));
1811 } else {
1812 if (needarr && t->asize < narr)
1813 lj_tab_reasize(fs->L, t, narr-1);
1814 if (fixt) { /* Fix value for dummy keys in template table. */
1815 Node *node = noderef(t->node);
1816 uint32_t i, hmask = t->hmask;
1817 for (i = 0; i <= hmask; i++) {
1818 Node *n = &node[i];
1819 if (tvistab(&n->val)) {
1820 lua_assert(tabV(&n->val) == t);
1821 setnilV(&n->val); /* Turn value into nil. */
1828 /* Parse function parameters. */
1829 static BCReg parse_params(LexState *ls, int needself)
1831 FuncState *fs = ls->fs;
1832 BCReg nparams = 0;
1833 lex_check(ls, '(');
1834 if (needself)
1835 var_new_lit(ls, nparams++, "self");
1836 if (ls->token != ')') {
1837 do {
1838 if (ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) {
1839 var_new(ls, nparams++, lex_str(ls));
1840 } else if (ls->token == TK_dots) {
1841 lj_lex_next(ls);
1842 fs->flags |= PROTO_VARARG;
1843 break;
1844 } else {
1845 err_syntax(ls, LJ_ERR_XPARAM);
1847 } while (lex_opt(ls, ','));
1849 var_add(ls, nparams);
1850 lua_assert(fs->nactvar == nparams);
1851 bcreg_reserve(fs, nparams);
1852 lex_check(ls, ')');
1853 return nparams;
1856 /* Forward declaration. */
1857 static void parse_chunk(LexState *ls);
1859 /* Parse body of a function. */
1860 static void parse_body(LexState *ls, ExpDesc *e, int needself, BCLine line)
1862 FuncState fs, *pfs = ls->fs;
1863 FuncScope bl;
1864 GCproto *pt;
1865 ptrdiff_t oldbase = pfs->bcbase - ls->bcstack;
1866 fs_init(ls, &fs);
1867 fscope_begin(&fs, &bl, 0);
1868 fs.linedefined = line;
1869 fs.numparams = (uint8_t)parse_params(ls, needself);
1870 fs.bcbase = pfs->bcbase + pfs->pc;
1871 fs.bclim = pfs->bclim - pfs->pc;
1872 bcemit_AD(&fs, BC_FUNCF, 0, 0); /* Placeholder. */
1873 parse_chunk(ls);
1874 if (ls->token != TK_end) lex_match(ls, TK_end, TK_function, line);
1875 pt = fs_finish(ls, (ls->lastline = ls->linenumber));
1876 pfs->bcbase = ls->bcstack + oldbase; /* May have been reallocated. */
1877 pfs->bclim = (BCPos)(ls->sizebcstack - oldbase);
1878 /* Store new prototype in the constant array of the parent. */
1879 expr_init(e, VRELOCABLE,
1880 bcemit_AD(pfs, BC_FNEW, 0, const_gc(pfs, obj2gco(pt), LJ_TPROTO)));
1881 #if LJ_HASFFI
1882 pfs->flags |= (fs.flags & PROTO_FFI);
1883 #endif
1884 if (!(pfs->flags & PROTO_CHILD)) {
1885 if (pfs->flags & PROTO_HAS_RETURN)
1886 pfs->flags |= PROTO_FIXUP_RETURN;
1887 pfs->flags |= PROTO_CHILD;
1889 lj_lex_next(ls);
1892 /* Parse expression list. Last expression is left open. */
1893 static BCReg expr_list(LexState *ls, ExpDesc *v)
1895 BCReg n = 1;
1896 expr(ls, v);
1897 while (lex_opt(ls, ',')) {
1898 expr_tonextreg(ls->fs, v);
1899 expr(ls, v);
1900 n++;
1902 return n;
1905 /* Parse function argument list. */
1906 static void parse_args(LexState *ls, ExpDesc *e)
1908 FuncState *fs = ls->fs;
1909 ExpDesc args;
1910 BCIns ins;
1911 BCReg base;
1912 BCLine line = ls->linenumber;
1913 if (ls->token == '(') {
1914 #if !LJ_52
1915 if (line != ls->lastline)
1916 err_syntax(ls, LJ_ERR_XAMBIG);
1917 #endif
1918 lj_lex_next(ls);
1919 if (ls->token == ')') { /* f(). */
1920 args.k = VVOID;
1921 } else {
1922 expr_list(ls, &args);
1923 if (args.k == VCALL) /* f(a, b, g()) or f(a, b, ...). */
1924 setbc_b(bcptr(fs, &args), 0); /* Pass on multiple results. */
1926 lex_match(ls, ')', '(', line);
1927 } else if (ls->token == '{') {
1928 expr_table(ls, &args);
1929 } else if (ls->token == TK_string) {
1930 expr_init(&args, VKSTR, 0);
1931 args.u.sval = strV(&ls->tokenval);
1932 lj_lex_next(ls);
1933 } else {
1934 err_syntax(ls, LJ_ERR_XFUNARG);
1935 return; /* Silence compiler. */
1937 lua_assert(e->k == VNONRELOC);
1938 base = e->u.s.info; /* Base register for call. */
1939 if (args.k == VCALL) {
1940 ins = BCINS_ABC(BC_CALLM, base, 2, args.u.s.aux - base - 1);
1941 } else {
1942 if (args.k != VVOID)
1943 expr_tonextreg(fs, &args);
1944 ins = BCINS_ABC(BC_CALL, base, 2, fs->freereg - base);
1946 expr_init(e, VCALL, bcemit_INS(fs, ins));
1947 e->u.s.aux = base;
1948 fs->bcbase[fs->pc - 1].line = line;
1949 fs->freereg = base+1; /* Leave one result by default. */
1952 /* Parse primary expression. */
1953 static void expr_primary(LexState *ls, ExpDesc *v)
1955 FuncState *fs = ls->fs;
1956 /* Parse prefix expression. */
1957 if (ls->token == '(') {
1958 BCLine line = ls->linenumber;
1959 lj_lex_next(ls);
1960 expr(ls, v);
1961 lex_match(ls, ')', '(', line);
1962 expr_discharge(ls->fs, v);
1963 } else if (ls->token == TK_name || (!LJ_52 && ls->token == TK_goto)) {
1964 var_lookup(ls, v);
1965 } else {
1966 err_syntax(ls, LJ_ERR_XSYMBOL);
1968 for (;;) { /* Parse multiple expression suffixes. */
1969 if (ls->token == '.') {
1970 expr_field(ls, v);
1971 } else if (ls->token == '[') {
1972 ExpDesc key;
1973 expr_toanyreg(fs, v);
1974 expr_bracket(ls, &key);
1975 expr_index(fs, v, &key);
1976 } else if (ls->token == ':') {
1977 ExpDesc key;
1978 lj_lex_next(ls);
1979 expr_str(ls, &key);
1980 bcemit_method(fs, v, &key);
1981 parse_args(ls, v);
1982 } else if (ls->token == '(' || ls->token == TK_string || ls->token == '{') {
1983 expr_tonextreg(fs, v);
1984 parse_args(ls, v);
1985 } else {
1986 break;
1991 /* Parse simple expression. */
1992 static void expr_simple(LexState *ls, ExpDesc *v)
1994 switch (ls->token) {
1995 case TK_number:
1996 expr_init(v, (LJ_HASFFI && tviscdata(&ls->tokenval)) ? VKCDATA : VKNUM, 0);
1997 copyTV(ls->L, &v->u.nval, &ls->tokenval);
1998 break;
1999 case TK_string:
2000 expr_init(v, VKSTR, 0);
2001 v->u.sval = strV(&ls->tokenval);
2002 break;
2003 case TK_nil:
2004 expr_init(v, VKNIL, 0);
2005 break;
2006 case TK_true:
2007 expr_init(v, VKTRUE, 0);
2008 break;
2009 case TK_false:
2010 expr_init(v, VKFALSE, 0);
2011 break;
2012 case TK_dots: { /* Vararg. */
2013 FuncState *fs = ls->fs;
2014 BCReg base;
2015 checkcond(ls, fs->flags & PROTO_VARARG, LJ_ERR_XDOTS);
2016 bcreg_reserve(fs, 1);
2017 base = fs->freereg-1;
2018 expr_init(v, VCALL, bcemit_ABC(fs, BC_VARG, base, 2, fs->numparams));
2019 v->u.s.aux = base;
2020 break;
2022 case '{': /* Table constructor. */
2023 expr_table(ls, v);
2024 return;
2025 case TK_function:
2026 lj_lex_next(ls);
2027 parse_body(ls, v, 0, ls->linenumber);
2028 return;
2029 default:
2030 expr_primary(ls, v);
2031 return;
2033 lj_lex_next(ls);
2036 /* Manage syntactic levels to avoid blowing up the stack. */
2037 static void synlevel_begin(LexState *ls)
2039 if (++ls->level >= LJ_MAX_XLEVEL)
2040 lj_lex_error(ls, 0, LJ_ERR_XLEVELS);
2043 #define synlevel_end(ls) ((ls)->level--)
2045 /* Convert token to binary operator. */
2046 static BinOpr token2binop(LexToken tok)
2048 switch (tok) {
2049 case '+': return OPR_ADD;
2050 case '-': return OPR_SUB;
2051 case '*': return OPR_MUL;
2052 case '/': return OPR_DIV;
2053 case '%': return OPR_MOD;
2054 case '^': return OPR_POW;
2055 case TK_concat: return OPR_CONCAT;
2056 case TK_ne: return OPR_NE;
2057 case TK_eq: return OPR_EQ;
2058 case '<': return OPR_LT;
2059 case TK_le: return OPR_LE;
2060 case '>': return OPR_GT;
2061 case TK_ge: return OPR_GE;
2062 case TK_and: return OPR_AND;
2063 case TK_or: return OPR_OR;
2064 default: return OPR_NOBINOPR;
2068 /* Priorities for each binary operator. ORDER OPR. */
2069 static const struct {
2070 uint8_t left; /* Left priority. */
2071 uint8_t right; /* Right priority. */
2072 } priority[] = {
2073 {6,6}, {6,6}, {7,7}, {7,7}, {7,7}, /* ADD SUB MUL DIV MOD */
2074 {10,9}, {5,4}, /* POW CONCAT (right associative) */
2075 {3,3}, {3,3}, /* EQ NE */
2076 {3,3}, {3,3}, {3,3}, {3,3}, /* LT GE GT LE */
2077 {2,2}, {1,1} /* AND OR */
2080 #define UNARY_PRIORITY 8 /* Priority for unary operators. */
2082 /* Forward declaration. */
2083 static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit);
2085 /* Parse unary expression. */
2086 static void expr_unop(LexState *ls, ExpDesc *v)
2088 BCOp op;
2089 if (ls->token == TK_not) {
2090 op = BC_NOT;
2091 } else if (ls->token == '-') {
2092 op = BC_UNM;
2093 } else if (ls->token == '#') {
2094 op = BC_LEN;
2095 } else {
2096 expr_simple(ls, v);
2097 return;
2099 lj_lex_next(ls);
2100 expr_binop(ls, v, UNARY_PRIORITY);
2101 bcemit_unop(ls->fs, op, v);
2104 /* Parse binary expressions with priority higher than the limit. */
2105 static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit)
2107 BinOpr op;
2108 synlevel_begin(ls);
2109 expr_unop(ls, v);
2110 op = token2binop(ls->token);
2111 while (op != OPR_NOBINOPR && priority[op].left > limit) {
2112 ExpDesc v2;
2113 BinOpr nextop;
2114 lj_lex_next(ls);
2115 bcemit_binop_left(ls->fs, op, v);
2116 /* Parse binary expression with higher priority. */
2117 nextop = expr_binop(ls, &v2, priority[op].right);
2118 bcemit_binop(ls->fs, op, v, &v2);
2119 op = nextop;
2121 synlevel_end(ls);
2122 return op; /* Return unconsumed binary operator (if any). */
2125 /* Parse expression. */
2126 static void expr(LexState *ls, ExpDesc *v)
2128 expr_binop(ls, v, 0); /* Priority 0: parse whole expression. */
2131 /* Assign expression to the next register. */
2132 static void expr_next(LexState *ls)
2134 ExpDesc e;
2135 expr(ls, &e);
2136 expr_tonextreg(ls->fs, &e);
2139 /* Parse conditional expression. */
2140 static BCPos expr_cond(LexState *ls)
2142 ExpDesc v;
2143 expr(ls, &v);
2144 if (v.k == VKNIL) v.k = VKFALSE;
2145 bcemit_branch_t(ls->fs, &v);
2146 return v.f;
2149 /* -- Assignments --------------------------------------------------------- */
2151 /* List of LHS variables. */
2152 typedef struct LHSVarList {
2153 ExpDesc v; /* LHS variable. */
2154 struct LHSVarList *prev; /* Link to previous LHS variable. */
2155 } LHSVarList;
2157 /* Eliminate write-after-read hazards for local variable assignment. */
2158 static void assign_hazard(LexState *ls, LHSVarList *lh, const ExpDesc *v)
2160 FuncState *fs = ls->fs;
2161 BCReg reg = v->u.s.info; /* Check against this variable. */
2162 BCReg tmp = fs->freereg; /* Rename to this temp. register (if needed). */
2163 int hazard = 0;
2164 for (; lh; lh = lh->prev) {
2165 if (lh->v.k == VINDEXED) {
2166 if (lh->v.u.s.info == reg) { /* t[i], t = 1, 2 */
2167 hazard = 1;
2168 lh->v.u.s.info = tmp;
2170 if (lh->v.u.s.aux == reg) { /* t[i], i = 1, 2 */
2171 hazard = 1;
2172 lh->v.u.s.aux = tmp;
2176 if (hazard) {
2177 bcemit_AD(fs, BC_MOV, tmp, reg); /* Rename conflicting variable. */
2178 bcreg_reserve(fs, 1);
2182 /* Adjust LHS/RHS of an assignment. */
2183 static void assign_adjust(LexState *ls, BCReg nvars, BCReg nexps, ExpDesc *e)
2185 FuncState *fs = ls->fs;
2186 int32_t extra = (int32_t)nvars - (int32_t)nexps;
2187 if (e->k == VCALL) {
2188 extra++; /* Compensate for the VCALL itself. */
2189 if (extra < 0) extra = 0;
2190 setbc_b(bcptr(fs, e), extra+1); /* Fixup call results. */
2191 if (extra > 1) bcreg_reserve(fs, (BCReg)extra-1);
2192 } else {
2193 if (e->k != VVOID)
2194 expr_tonextreg(fs, e); /* Close last expression. */
2195 if (extra > 0) { /* Leftover LHS are set to nil. */
2196 BCReg reg = fs->freereg;
2197 bcreg_reserve(fs, (BCReg)extra);
2198 bcemit_nil(fs, reg, (BCReg)extra);
2203 /* Recursively parse assignment statement. */
2204 static void parse_assignment(LexState *ls, LHSVarList *lh, BCReg nvars)
2206 ExpDesc e;
2207 checkcond(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED, LJ_ERR_XSYNTAX);
2208 if (lex_opt(ls, ',')) { /* Collect LHS list and recurse upwards. */
2209 LHSVarList vl;
2210 vl.prev = lh;
2211 expr_primary(ls, &vl.v);
2212 if (vl.v.k == VLOCAL)
2213 assign_hazard(ls, lh, &vl.v);
2214 checklimit(ls->fs, ls->level + nvars, LJ_MAX_XLEVEL, "variable names");
2215 parse_assignment(ls, &vl, nvars+1);
2216 } else { /* Parse RHS. */
2217 BCReg nexps;
2218 lex_check(ls, '=');
2219 nexps = expr_list(ls, &e);
2220 if (nexps == nvars) {
2221 if (e.k == VCALL) {
2222 if (bc_op(*bcptr(ls->fs, &e)) == BC_VARG) { /* Vararg assignment. */
2223 ls->fs->freereg--;
2224 e.k = VRELOCABLE;
2225 } else { /* Multiple call results. */
2226 e.u.s.info = e.u.s.aux; /* Base of call is not relocatable. */
2227 e.k = VNONRELOC;
2230 bcemit_store(ls->fs, &lh->v, &e);
2231 return;
2233 assign_adjust(ls, nvars, nexps, &e);
2234 if (nexps > nvars)
2235 ls->fs->freereg -= nexps - nvars; /* Drop leftover regs. */
2237 /* Assign RHS to LHS and recurse downwards. */
2238 expr_init(&e, VNONRELOC, ls->fs->freereg-1);
2239 bcemit_store(ls->fs, &lh->v, &e);
2242 /* Parse call statement or assignment. */
2243 static void parse_call_assign(LexState *ls)
2245 FuncState *fs = ls->fs;
2246 LHSVarList vl;
2247 expr_primary(ls, &vl.v);
2248 if (vl.v.k == VCALL) { /* Function call statement. */
2249 setbc_b(bcptr(fs, &vl.v), 1); /* No results. */
2250 } else { /* Start of an assignment. */
2251 vl.prev = NULL;
2252 parse_assignment(ls, &vl, 1);
2256 /* Parse 'local' statement. */
2257 static void parse_local(LexState *ls)
2259 if (lex_opt(ls, TK_function)) { /* Local function declaration. */
2260 ExpDesc v, b;
2261 FuncState *fs = ls->fs;
2262 var_new(ls, 0, lex_str(ls));
2263 expr_init(&v, VLOCAL, fs->freereg);
2264 v.u.s.aux = fs->varmap[fs->freereg];
2265 bcreg_reserve(fs, 1);
2266 var_add(ls, 1);
2267 parse_body(ls, &b, 0, ls->linenumber);
2268 bcemit_store(fs, &v, &b);
2269 /* The upvalue is in scope, but the local is only valid after the store. */
2270 var_get(ls, fs, fs->nactvar - 1).startpc = fs->pc;
2271 } else { /* Local variable declaration. */
2272 ExpDesc e;
2273 BCReg nexps, nvars = 0;
2274 do { /* Collect LHS. */
2275 var_new(ls, nvars++, lex_str(ls));
2276 } while (lex_opt(ls, ','));
2277 if (lex_opt(ls, '=')) { /* Optional RHS. */
2278 nexps = expr_list(ls, &e);
2279 } else { /* Or implicitly set to nil. */
2280 e.k = VVOID;
2281 nexps = 0;
2283 assign_adjust(ls, nvars, nexps, &e);
2284 var_add(ls, nvars);
2288 /* Parse 'function' statement. */
2289 static void parse_func(LexState *ls, BCLine line)
2291 FuncState *fs;
2292 ExpDesc v, b;
2293 int needself = 0;
2294 lj_lex_next(ls); /* Skip 'function'. */
2295 /* Parse function name. */
2296 var_lookup(ls, &v);
2297 while (ls->token == '.') /* Multiple dot-separated fields. */
2298 expr_field(ls, &v);
2299 if (ls->token == ':') { /* Optional colon to signify method call. */
2300 needself = 1;
2301 expr_field(ls, &v);
2303 parse_body(ls, &b, needself, line);
2304 fs = ls->fs;
2305 bcemit_store(fs, &v, &b);
2306 fs->bcbase[fs->pc - 1].line = line; /* Set line for the store. */
2309 /* -- Control transfer statements ----------------------------------------- */
2311 /* Check for end of block. */
2312 static int endofblock(LexToken token)
2314 switch (token) {
2315 case TK_else: case TK_elseif: case TK_end: case TK_until: case TK_eof:
2316 return 1;
2317 default:
2318 return 0;
2322 /* Parse 'return' statement. */
2323 static void parse_return(LexState *ls)
2325 BCIns ins;
2326 FuncState *fs = ls->fs;
2327 lj_lex_next(ls); /* Skip 'return'. */
2328 fs->flags |= PROTO_HAS_RETURN;
2329 if (endofblock(ls->token) || ls->token == ';') { /* Bare return. */
2330 ins = BCINS_AD(BC_RET0, 0, 1);
2331 } else { /* Return with one or more values. */
2332 ExpDesc e; /* Receives the _last_ expression in the list. */
2333 BCReg nret = expr_list(ls, &e);
2334 if (nret == 1) { /* Return one result. */
2335 if (e.k == VCALL) { /* Check for tail call. */
2336 BCIns *ip = bcptr(fs, &e);
2337 /* It doesn't pay off to add BC_VARGT just for 'return ...'. */
2338 if (bc_op(*ip) == BC_VARG) goto notailcall;
2339 fs->pc--;
2340 ins = BCINS_AD(bc_op(*ip)-BC_CALL+BC_CALLT, bc_a(*ip), bc_c(*ip));
2341 } else { /* Can return the result from any register. */
2342 ins = BCINS_AD(BC_RET1, expr_toanyreg(fs, &e), 2);
2344 } else {
2345 if (e.k == VCALL) { /* Append all results from a call. */
2346 notailcall:
2347 setbc_b(bcptr(fs, &e), 0);
2348 ins = BCINS_AD(BC_RETM, fs->nactvar, e.u.s.aux - fs->nactvar);
2349 } else {
2350 expr_tonextreg(fs, &e); /* Force contiguous registers. */
2351 ins = BCINS_AD(BC_RET, fs->nactvar, nret+1);
2355 if (fs->flags & PROTO_CHILD)
2356 bcemit_AJ(fs, BC_UCLO, 0, 0); /* May need to close upvalues first. */
2357 bcemit_INS(fs, ins);
2360 /* Parse 'break' statement. */
2361 static void parse_break(LexState *ls)
2363 ls->fs->bl->flags |= FSCOPE_BREAK;
2364 gola_new(ls, NAME_BREAK, VSTACK_GOTO, bcemit_jmp(ls->fs));
2367 /* Parse 'goto' statement. */
2368 static void parse_goto(LexState *ls)
2370 FuncState *fs = ls->fs;
2371 GCstr *name = lex_str(ls);
2372 VarInfo *vl = gola_findlabel(ls, name);
2373 if (vl) /* Treat backwards goto within same scope like a loop. */
2374 bcemit_AJ(fs, BC_LOOP, gola_nactvar(vl), -1); /* No BC range check. */
2375 fs->bl->flags |= FSCOPE_GOLA;
2376 gola_new(ls, name, VSTACK_GOTO, bcemit_jmp(fs));
2379 /* Parse label. */
2380 static void parse_label(LexState *ls)
2382 FuncState *fs = ls->fs;
2383 GCstr *name;
2384 MSize idx;
2385 fs->lasttarget = fs->pc;
2386 fs->bl->flags |= FSCOPE_GOLA;
2387 lj_lex_next(ls); /* Skip '::'. */
2388 name = lex_str(ls);
2389 if (gola_findlabel(ls, name))
2390 lj_lex_error(ls, 0, LJ_ERR_XLDUP, strdata(name));
2391 idx = gola_new(ls, name, VSTACK_LABEL, fs->pc);
2392 lex_check(ls, TK_label);
2393 /* Recursively parse trailing statements: labels and ';' (Lua 5.2 only). */
2394 for (;;) {
2395 if (ls->token == TK_label) {
2396 synlevel_begin(ls);
2397 parse_label(ls);
2398 synlevel_end(ls);
2399 } else if (LJ_52 && ls->token == ';') {
2400 lj_lex_next(ls);
2401 } else {
2402 break;
2405 /* Trailing label is considered to be outside of scope. */
2406 if (endofblock(ls->token) && ls->token != TK_until)
2407 ls->vstack[idx].endpc = fs->bl->nactvar | VSTACK_LABEL;
2408 gola_resolve(ls, fs->bl, idx);
2411 /* -- Blocks, loops and conditional statements ---------------------------- */
2413 /* Parse a block. */
2414 static void parse_block(LexState *ls)
2416 FuncState *fs = ls->fs;
2417 FuncScope bl;
2418 fscope_begin(fs, &bl, 0);
2419 parse_chunk(ls);
2420 fscope_end(fs);
2423 /* Parse 'while' statement. */
2424 static void parse_while(LexState *ls, BCLine line)
2426 FuncState *fs = ls->fs;
2427 BCPos start, loop, condexit;
2428 FuncScope bl;
2429 lj_lex_next(ls); /* Skip 'while'. */
2430 start = fs->lasttarget = fs->pc;
2431 condexit = expr_cond(ls);
2432 fscope_begin(fs, &bl, FSCOPE_LOOP);
2433 lex_check(ls, TK_do);
2434 loop = bcemit_AD(fs, BC_LOOP, fs->nactvar, 0);
2435 parse_block(ls);
2436 jmp_patch(fs, bcemit_jmp(fs), start);
2437 lex_match(ls, TK_end, TK_while, line);
2438 fscope_end(fs);
2439 jmp_tohere(fs, condexit);
2440 jmp_patchins(fs, loop, fs->pc);
2443 /* Parse 'repeat' statement. */
2444 static void parse_repeat(LexState *ls, BCLine line)
2446 FuncState *fs = ls->fs;
2447 BCPos loop = fs->lasttarget = fs->pc;
2448 BCPos condexit;
2449 FuncScope bl1, bl2;
2450 fscope_begin(fs, &bl1, FSCOPE_LOOP); /* Breakable loop scope. */
2451 fscope_begin(fs, &bl2, 0); /* Inner scope. */
2452 lj_lex_next(ls); /* Skip 'repeat'. */
2453 bcemit_AD(fs, BC_LOOP, fs->nactvar, 0);
2454 parse_chunk(ls);
2455 lex_match(ls, TK_until, TK_repeat, line);
2456 condexit = expr_cond(ls); /* Parse condition (still inside inner scope). */
2457 if (!(bl2.flags & FSCOPE_UPVAL)) { /* No upvalues? Just end inner scope. */
2458 fscope_end(fs);
2459 } else { /* Otherwise generate: cond: UCLO+JMP out, !cond: UCLO+JMP loop. */
2460 parse_break(ls); /* Break from loop and close upvalues. */
2461 jmp_tohere(fs, condexit);
2462 fscope_end(fs); /* End inner scope and close upvalues. */
2463 condexit = bcemit_jmp(fs);
2465 jmp_patch(fs, condexit, loop); /* Jump backwards if !cond. */
2466 jmp_patchins(fs, loop, fs->pc);
2467 fscope_end(fs); /* End loop scope. */
2470 /* Parse numeric 'for'. */
2471 static void parse_for_num(LexState *ls, GCstr *varname, BCLine line)
2473 FuncState *fs = ls->fs;
2474 BCReg base = fs->freereg;
2475 FuncScope bl;
2476 BCPos loop, loopend;
2477 /* Hidden control variables. */
2478 var_new_fixed(ls, FORL_IDX, VARNAME_FOR_IDX);
2479 var_new_fixed(ls, FORL_STOP, VARNAME_FOR_STOP);
2480 var_new_fixed(ls, FORL_STEP, VARNAME_FOR_STEP);
2481 /* Visible copy of index variable. */
2482 var_new(ls, FORL_EXT, varname);
2483 lex_check(ls, '=');
2484 expr_next(ls);
2485 lex_check(ls, ',');
2486 expr_next(ls);
2487 if (lex_opt(ls, ',')) {
2488 expr_next(ls);
2489 } else {
2490 bcemit_AD(fs, BC_KSHORT, fs->freereg, 1); /* Default step is 1. */
2491 bcreg_reserve(fs, 1);
2493 var_add(ls, 3); /* Hidden control variables. */
2494 lex_check(ls, TK_do);
2495 loop = bcemit_AJ(fs, BC_FORI, base, NO_JMP);
2496 fscope_begin(fs, &bl, 0); /* Scope for visible variables. */
2497 var_add(ls, 1);
2498 bcreg_reserve(fs, 1);
2499 parse_block(ls);
2500 fscope_end(fs);
2501 /* Perform loop inversion. Loop control instructions are at the end. */
2502 loopend = bcemit_AJ(fs, BC_FORL, base, NO_JMP);
2503 fs->bcbase[loopend].line = line; /* Fix line for control ins. */
2504 jmp_patchins(fs, loopend, loop+1);
2505 jmp_patchins(fs, loop, fs->pc);
2508 /* Try to predict whether the iterator is next() and specialize the bytecode.
2509 ** Detecting next() and pairs() by name is simplistic, but quite effective.
2510 ** The interpreter backs off if the check for the closure fails at runtime.
2512 static int predict_next(LexState *ls, FuncState *fs, BCPos pc)
2514 BCIns ins = fs->bcbase[pc].ins;
2515 GCstr *name;
2516 cTValue *o;
2517 switch (bc_op(ins)) {
2518 case BC_MOV:
2519 name = gco2str(gcref(var_get(ls, fs, bc_d(ins)).name));
2520 break;
2521 case BC_UGET:
2522 name = gco2str(gcref(ls->vstack[fs->uvloc[bc_d(ins)].vidx].name));
2523 break;
2524 case BC_GGET:
2525 /* There's no inverse index (yet), so lookup the strings. */
2526 o = lj_tab_getstr(fs->kt, lj_str_newlit(ls->L, "pairs"));
2527 if (o && tvhaskslot(o) && tvkslot(o) == bc_d(ins))
2528 return 1;
2529 o = lj_tab_getstr(fs->kt, lj_str_newlit(ls->L, "next"));
2530 if (o && tvhaskslot(o) && tvkslot(o) == bc_d(ins))
2531 return 1;
2532 return 0;
2533 default:
2534 return 0;
2536 return (name->len == 5 && !strcmp(strdata(name), "pairs")) ||
2537 (name->len == 4 && !strcmp(strdata(name), "next"));
2540 /* Parse 'for' iterator. */
2541 static void parse_for_iter(LexState *ls, GCstr *indexname)
2543 FuncState *fs = ls->fs;
2544 ExpDesc e;
2545 BCReg nvars = 0;
2546 BCLine line;
2547 BCReg base = fs->freereg + 3;
2548 BCPos loop, loopend, exprpc = fs->pc;
2549 FuncScope bl;
2550 int isnext;
2551 /* Hidden control variables. */
2552 var_new_fixed(ls, nvars++, VARNAME_FOR_GEN);
2553 var_new_fixed(ls, nvars++, VARNAME_FOR_STATE);
2554 var_new_fixed(ls, nvars++, VARNAME_FOR_CTL);
2555 /* Visible variables returned from iterator. */
2556 var_new(ls, nvars++, indexname);
2557 while (lex_opt(ls, ','))
2558 var_new(ls, nvars++, lex_str(ls));
2559 lex_check(ls, TK_in);
2560 line = ls->linenumber;
2561 assign_adjust(ls, 3, expr_list(ls, &e), &e);
2562 bcreg_bump(fs, 3); /* The iterator needs another 3 slots (func + 2 args). */
2563 isnext = (nvars <= 5 && predict_next(ls, fs, exprpc));
2564 var_add(ls, 3); /* Hidden control variables. */
2565 lex_check(ls, TK_do);
2566 loop = bcemit_AJ(fs, isnext ? BC_ISNEXT : BC_JMP, base, NO_JMP);
2567 fscope_begin(fs, &bl, 0); /* Scope for visible variables. */
2568 var_add(ls, nvars-3);
2569 bcreg_reserve(fs, nvars-3);
2570 parse_block(ls);
2571 fscope_end(fs);
2572 /* Perform loop inversion. Loop control instructions are at the end. */
2573 jmp_patchins(fs, loop, fs->pc);
2574 bcemit_ABC(fs, isnext ? BC_ITERN : BC_ITERC, base, nvars-3+1, 2+1);
2575 loopend = bcemit_AJ(fs, BC_ITERL, base, NO_JMP);
2576 fs->bcbase[loopend-1].line = line; /* Fix line for control ins. */
2577 fs->bcbase[loopend].line = line;
2578 jmp_patchins(fs, loopend, loop+1);
2581 /* Parse 'for' statement. */
2582 static void parse_for(LexState *ls, BCLine line)
2584 FuncState *fs = ls->fs;
2585 GCstr *varname;
2586 FuncScope bl;
2587 fscope_begin(fs, &bl, FSCOPE_LOOP);
2588 lj_lex_next(ls); /* Skip 'for'. */
2589 varname = lex_str(ls); /* Get first variable name. */
2590 if (ls->token == '=')
2591 parse_for_num(ls, varname, line);
2592 else if (ls->token == ',' || ls->token == TK_in)
2593 parse_for_iter(ls, varname);
2594 else
2595 err_syntax(ls, LJ_ERR_XFOR);
2596 lex_match(ls, TK_end, TK_for, line);
2597 fscope_end(fs); /* Resolve break list. */
2600 /* Parse condition and 'then' block. */
2601 static BCPos parse_then(LexState *ls)
2603 BCPos condexit;
2604 lj_lex_next(ls); /* Skip 'if' or 'elseif'. */
2605 condexit = expr_cond(ls);
2606 lex_check(ls, TK_then);
2607 parse_block(ls);
2608 return condexit;
2611 /* Parse 'if' statement. */
2612 static void parse_if(LexState *ls, BCLine line)
2614 FuncState *fs = ls->fs;
2615 BCPos flist;
2616 BCPos escapelist = NO_JMP;
2617 flist = parse_then(ls);
2618 while (ls->token == TK_elseif) { /* Parse multiple 'elseif' blocks. */
2619 jmp_append(fs, &escapelist, bcemit_jmp(fs));
2620 jmp_tohere(fs, flist);
2621 flist = parse_then(ls);
2623 if (ls->token == TK_else) { /* Parse optional 'else' block. */
2624 jmp_append(fs, &escapelist, bcemit_jmp(fs));
2625 jmp_tohere(fs, flist);
2626 lj_lex_next(ls); /* Skip 'else'. */
2627 parse_block(ls);
2628 } else {
2629 jmp_append(fs, &escapelist, flist);
2631 jmp_tohere(fs, escapelist);
2632 lex_match(ls, TK_end, TK_if, line);
2635 /* -- Parse statements ---------------------------------------------------- */
2637 /* Parse a statement. Returns 1 if it must be the last one in a chunk. */
2638 static int parse_stmt(LexState *ls)
2640 BCLine line = ls->linenumber;
2641 switch (ls->token) {
2642 case TK_if:
2643 parse_if(ls, line);
2644 break;
2645 case TK_while:
2646 parse_while(ls, line);
2647 break;
2648 case TK_do:
2649 lj_lex_next(ls);
2650 parse_block(ls);
2651 lex_match(ls, TK_end, TK_do, line);
2652 break;
2653 case TK_for:
2654 parse_for(ls, line);
2655 break;
2656 case TK_repeat:
2657 parse_repeat(ls, line);
2658 break;
2659 case TK_function:
2660 parse_func(ls, line);
2661 break;
2662 case TK_local:
2663 lj_lex_next(ls);
2664 parse_local(ls);
2665 break;
2666 case TK_return:
2667 parse_return(ls);
2668 return 1; /* Must be last. */
2669 case TK_break:
2670 lj_lex_next(ls);
2671 parse_break(ls);
2672 return !LJ_52; /* Must be last in Lua 5.1. */
2673 #if LJ_52
2674 case ';':
2675 lj_lex_next(ls);
2676 break;
2677 #endif
2678 case TK_label:
2679 parse_label(ls);
2680 break;
2681 case TK_goto:
2682 if (LJ_52 || lj_lex_lookahead(ls) == TK_name) {
2683 lj_lex_next(ls);
2684 parse_goto(ls);
2685 break;
2686 } /* else: fallthrough */
2687 default:
2688 parse_call_assign(ls);
2689 break;
2691 return 0;
2694 /* A chunk is a list of statements optionally separated by semicolons. */
2695 static void parse_chunk(LexState *ls)
2697 int islast = 0;
2698 synlevel_begin(ls);
2699 while (!islast && !endofblock(ls->token)) {
2700 islast = parse_stmt(ls);
2701 lex_opt(ls, ';');
2702 lua_assert(ls->fs->framesize >= ls->fs->freereg &&
2703 ls->fs->freereg >= ls->fs->nactvar);
2704 ls->fs->freereg = ls->fs->nactvar; /* Free registers after each stmt. */
2706 synlevel_end(ls);
2709 /* Entry point of bytecode parser. */
2710 GCproto *lj_parse(LexState *ls)
2712 FuncState fs;
2713 FuncScope bl;
2714 GCproto *pt;
2715 lua_State *L = ls->L;
2716 #ifdef LUAJIT_DISABLE_DEBUGINFO
2717 ls->chunkname = lj_str_newlit(L, "=");
2718 #else
2719 ls->chunkname = lj_str_newz(L, ls->chunkarg);
2720 #endif
2721 setstrV(L, L->top, ls->chunkname); /* Anchor chunkname string. */
2722 incr_top(L);
2723 ls->level = 0;
2724 fs_init(ls, &fs);
2725 fs.linedefined = 0;
2726 fs.numparams = 0;
2727 fs.bcbase = NULL;
2728 fs.bclim = 0;
2729 fs.flags |= PROTO_VARARG; /* Main chunk is always a vararg func. */
2730 fscope_begin(&fs, &bl, 0);
2731 bcemit_AD(&fs, BC_FUNCV, 0, 0); /* Placeholder. */
2732 lj_lex_next(ls); /* Read-ahead first token. */
2733 parse_chunk(ls);
2734 if (ls->token != TK_eof)
2735 err_token(ls, TK_eof);
2736 pt = fs_finish(ls, ls->linenumber);
2737 L->top--; /* Drop chunkname. */
2738 lua_assert(fs.prev == NULL);
2739 lua_assert(ls->fs == NULL);
2740 lua_assert(pt->sizeuv == 0);
2741 return pt;