Handle cross-compiles with FPU/no-FPU or hard-fp/soft-fp ABI mismatch.
[luajit-2.0/celess22.git] / src / lj_parse.c
blobc5129ad54520f63b1acf6de4388d35e2d781f8cb
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 BCPos breaklist; /* Jump list for loop breaks. */
99 uint8_t nactvar; /* Number of active vars outside the scope. */
100 uint8_t upval; /* Some variable in the scope is an upvalue. */
101 uint8_t isbreakable; /* Scope is a loop and allows a break. */
102 } FuncScope;
104 /* Index into variable stack. */
105 typedef uint16_t VarIndex;
106 #define LJ_MAX_VSTACK 65536
108 #define VSTACK_VAR_RW 0x80000000 /* In endpc: R/W variable. */
110 /* Upvalue map. */
111 typedef struct UVMap {
112 VarIndex vidx; /* Varinfo index. */
113 uint16_t slot; /* Slot or parent upvalue index. */
114 } UVMap;
116 /* Per-function state. */
117 typedef struct FuncState {
118 GCtab *kt; /* Hash table for constants. */
119 LexState *ls; /* Lexer state. */
120 lua_State *L; /* Lua state. */
121 FuncScope *bl; /* Current scope. */
122 struct FuncState *prev; /* Enclosing function. */
123 BCPos pc; /* Next bytecode position. */
124 BCPos lasttarget; /* Bytecode position of last jump target. */
125 BCPos jpc; /* Pending jump list to next bytecode. */
126 BCReg freereg; /* First free register. */
127 BCReg nactvar; /* Number of active local variables. */
128 BCReg nkn, nkgc; /* Number of lua_Number/GCobj constants */
129 BCLine linedefined; /* First line of the function definition. */
130 BCInsLine *bcbase; /* Base of bytecode stack. */
131 BCPos bclim; /* Limit of bytecode stack. */
132 MSize vbase; /* Base of variable stack for this function. */
133 uint8_t flags; /* Prototype flags. */
134 uint8_t numparams; /* Number of parameters. */
135 uint8_t framesize; /* Fixed frame size. */
136 uint8_t nuv; /* Number of upvalues */
137 VarIndex varmap[LJ_MAX_LOCVAR]; /* Map from register to variable idx. */
138 UVMap uvloc[LJ_MAX_UPVAL]; /* Map from upvalue to variable idx and slot. */
139 } FuncState;
141 /* Binary and unary operators. ORDER OPR */
142 typedef enum BinOpr {
143 OPR_ADD, OPR_SUB, OPR_MUL, OPR_DIV, OPR_MOD, OPR_POW, /* ORDER ARITH */
144 OPR_CONCAT,
145 OPR_NE, OPR_EQ,
146 OPR_LT, OPR_GE, OPR_LE, OPR_GT,
147 OPR_AND, OPR_OR,
148 OPR_NOBINOPR
149 } BinOpr;
151 LJ_STATIC_ASSERT((int)BC_ISGE-(int)BC_ISLT == (int)OPR_GE-(int)OPR_LT);
152 LJ_STATIC_ASSERT((int)BC_ISLE-(int)BC_ISLT == (int)OPR_LE-(int)OPR_LT);
153 LJ_STATIC_ASSERT((int)BC_ISGT-(int)BC_ISLT == (int)OPR_GT-(int)OPR_LT);
154 LJ_STATIC_ASSERT((int)BC_SUBVV-(int)BC_ADDVV == (int)OPR_SUB-(int)OPR_ADD);
155 LJ_STATIC_ASSERT((int)BC_MULVV-(int)BC_ADDVV == (int)OPR_MUL-(int)OPR_ADD);
156 LJ_STATIC_ASSERT((int)BC_DIVVV-(int)BC_ADDVV == (int)OPR_DIV-(int)OPR_ADD);
157 LJ_STATIC_ASSERT((int)BC_MODVV-(int)BC_ADDVV == (int)OPR_MOD-(int)OPR_ADD);
159 /* -- Error handling ------------------------------------------------------ */
161 LJ_NORET LJ_NOINLINE static void err_syntax(LexState *ls, ErrMsg em)
163 lj_lex_error(ls, ls->token, em);
166 LJ_NORET LJ_NOINLINE static void err_token(LexState *ls, LexToken token)
168 lj_lex_error(ls, ls->token, LJ_ERR_XTOKEN, lj_lex_token2str(ls, token));
171 LJ_NORET static void err_limit(FuncState *fs, uint32_t limit, const char *what)
173 if (fs->linedefined == 0)
174 lj_lex_error(fs->ls, 0, LJ_ERR_XLIMM, limit, what);
175 else
176 lj_lex_error(fs->ls, 0, LJ_ERR_XLIMF, fs->linedefined, limit, what);
179 #define checklimit(fs, v, l, m) if ((v) >= (l)) err_limit(fs, l, m)
180 #define checklimitgt(fs, v, l, m) if ((v) > (l)) err_limit(fs, l, m)
181 #define checkcond(ls, c, em) { if (!(c)) err_syntax(ls, em); }
183 /* -- Management of constants --------------------------------------------- */
185 /* Return bytecode encoding for primitive constant. */
186 #define const_pri(e) check_exp((e)->k <= VKTRUE, (e)->k)
188 #define tvhaskslot(o) ((o)->u32.hi == 0)
189 #define tvkslot(o) ((o)->u32.lo)
191 /* Add a number constant. */
192 static BCReg const_num(FuncState *fs, ExpDesc *e)
194 lua_State *L = fs->L;
195 TValue *o;
196 lua_assert(expr_isnumk(e));
197 o = lj_tab_set(L, fs->kt, &e->u.nval);
198 if (tvhaskslot(o))
199 return tvkslot(o);
200 o->u64 = fs->nkn;
201 return fs->nkn++;
204 /* Add a GC object constant. */
205 static BCReg const_gc(FuncState *fs, GCobj *gc, uint32_t itype)
207 lua_State *L = fs->L;
208 TValue key, *o;
209 setgcV(L, &key, gc, itype);
210 /* NOBARRIER: the key is new or kept alive. */
211 o = lj_tab_set(L, fs->kt, &key);
212 if (tvhaskslot(o))
213 return tvkslot(o);
214 o->u64 = fs->nkgc;
215 return fs->nkgc++;
218 /* Add a string constant. */
219 static BCReg const_str(FuncState *fs, ExpDesc *e)
221 lua_assert(expr_isstrk(e) || e->k == VGLOBAL);
222 return const_gc(fs, obj2gco(e->u.sval), LJ_TSTR);
225 /* Anchor string constant to avoid GC. */
226 GCstr *lj_parse_keepstr(LexState *ls, const char *str, size_t len)
228 /* NOBARRIER: the key is new or kept alive. */
229 lua_State *L = ls->L;
230 GCstr *s = lj_str_new(L, str, len);
231 TValue *tv = lj_tab_setstr(L, ls->fs->kt, s);
232 if (tvisnil(tv)) setboolV(tv, 1);
233 lj_gc_check(L);
234 return s;
237 #if LJ_HASFFI
238 /* Anchor cdata to avoid GC. */
239 void lj_parse_keepcdata(LexState *ls, TValue *tv, GCcdata *cd)
241 /* NOBARRIER: the key is new or kept alive. */
242 lua_State *L = ls->L;
243 setcdataV(L, tv, cd);
244 setboolV(lj_tab_set(L, ls->fs->kt, tv), 1);
246 #endif
248 /* -- Jump list handling -------------------------------------------------- */
250 /* Get next element in jump list. */
251 static BCPos jmp_next(FuncState *fs, BCPos pc)
253 ptrdiff_t delta = bc_j(fs->bcbase[pc].ins);
254 if ((BCPos)delta == NO_JMP)
255 return NO_JMP;
256 else
257 return (BCPos)(((ptrdiff_t)pc+1)+delta);
260 /* Check if any of the instructions on the jump list produce no value. */
261 static int jmp_novalue(FuncState *fs, BCPos list)
263 for (; list != NO_JMP; list = jmp_next(fs, list)) {
264 BCIns p = fs->bcbase[list >= 1 ? list-1 : list].ins;
265 if (!(bc_op(p) == BC_ISTC || bc_op(p) == BC_ISFC || bc_a(p) == NO_REG))
266 return 1;
268 return 0;
271 /* Patch register of test instructions. */
272 static int jmp_patchtestreg(FuncState *fs, BCPos pc, BCReg reg)
274 BCInsLine *ilp = &fs->bcbase[pc >= 1 ? pc-1 : pc];
275 BCOp op = bc_op(ilp->ins);
276 if (op == BC_ISTC || op == BC_ISFC) {
277 if (reg != NO_REG && reg != bc_d(ilp->ins)) {
278 setbc_a(&ilp->ins, reg);
279 } else { /* Nothing to store or already in the right register. */
280 setbc_op(&ilp->ins, op+(BC_IST-BC_ISTC));
281 setbc_a(&ilp->ins, 0);
283 } else if (bc_a(ilp->ins) == NO_REG) {
284 if (reg == NO_REG) {
285 ilp->ins = BCINS_AJ(BC_JMP, bc_a(fs->bcbase[pc].ins), 0);
286 } else {
287 setbc_a(&ilp->ins, reg);
288 if (reg >= bc_a(ilp[1].ins))
289 setbc_a(&ilp[1].ins, reg+1);
291 } else {
292 return 0; /* Cannot patch other instructions. */
294 return 1;
297 /* Drop values for all instructions on jump list. */
298 static void jmp_dropval(FuncState *fs, BCPos list)
300 for (; list != NO_JMP; list = jmp_next(fs, list))
301 jmp_patchtestreg(fs, list, NO_REG);
304 /* Patch jump instruction to target. */
305 static void jmp_patchins(FuncState *fs, BCPos pc, BCPos dest)
307 BCIns *jmp = &fs->bcbase[pc].ins;
308 BCPos offset = dest-(pc+1)+BCBIAS_J;
309 lua_assert(dest != NO_JMP);
310 if (offset > BCMAX_D)
311 err_syntax(fs->ls, LJ_ERR_XJUMP);
312 setbc_d(jmp, offset);
315 /* Append to jump list. */
316 static void jmp_append(FuncState *fs, BCPos *l1, BCPos l2)
318 if (l2 == NO_JMP) {
319 return;
320 } else if (*l1 == NO_JMP) {
321 *l1 = l2;
322 } else {
323 BCPos list = *l1;
324 BCPos next;
325 while ((next = jmp_next(fs, list)) != NO_JMP) /* Find last element. */
326 list = next;
327 jmp_patchins(fs, list, l2);
331 /* Patch jump list and preserve produced values. */
332 static void jmp_patchval(FuncState *fs, BCPos list, BCPos vtarget,
333 BCReg reg, BCPos dtarget)
335 while (list != NO_JMP) {
336 BCPos next = jmp_next(fs, list);
337 if (jmp_patchtestreg(fs, list, reg))
338 jmp_patchins(fs, list, vtarget); /* Jump to target with value. */
339 else
340 jmp_patchins(fs, list, dtarget); /* Jump to default target. */
341 list = next;
345 /* Jump to following instruction. Append to list of pending jumps. */
346 static void jmp_tohere(FuncState *fs, BCPos list)
348 fs->lasttarget = fs->pc;
349 jmp_append(fs, &fs->jpc, list);
352 /* Patch jump list to target. */
353 static void jmp_patch(FuncState *fs, BCPos list, BCPos target)
355 if (target == fs->pc) {
356 jmp_tohere(fs, list);
357 } else {
358 lua_assert(target < fs->pc);
359 jmp_patchval(fs, list, target, NO_REG, target);
363 /* -- Bytecode register allocator ----------------------------------------- */
365 /* Bump frame size. */
366 static void bcreg_bump(FuncState *fs, BCReg n)
368 BCReg sz = fs->freereg + n;
369 if (sz > fs->framesize) {
370 if (sz >= LJ_MAX_SLOTS)
371 err_syntax(fs->ls, LJ_ERR_XSLOTS);
372 fs->framesize = (uint8_t)sz;
376 /* Reserve registers. */
377 static void bcreg_reserve(FuncState *fs, BCReg n)
379 bcreg_bump(fs, n);
380 fs->freereg += n;
383 /* Free register. */
384 static void bcreg_free(FuncState *fs, BCReg reg)
386 if (reg >= fs->nactvar) {
387 fs->freereg--;
388 lua_assert(reg == fs->freereg);
392 /* Free register for expression. */
393 static void expr_free(FuncState *fs, ExpDesc *e)
395 if (e->k == VNONRELOC)
396 bcreg_free(fs, e->u.s.info);
399 /* -- Bytecode emitter ---------------------------------------------------- */
401 /* Emit bytecode instruction. */
402 static BCPos bcemit_INS(FuncState *fs, BCIns ins)
404 BCPos pc = fs->pc;
405 LexState *ls = fs->ls;
406 jmp_patchval(fs, fs->jpc, pc, NO_REG, pc);
407 fs->jpc = NO_JMP;
408 if (LJ_UNLIKELY(pc >= fs->bclim)) {
409 ptrdiff_t base = fs->bcbase - ls->bcstack;
410 checklimit(fs, ls->sizebcstack, LJ_MAX_BCINS, "bytecode instructions");
411 lj_mem_growvec(fs->L, ls->bcstack, ls->sizebcstack, LJ_MAX_BCINS,BCInsLine);
412 fs->bclim = (BCPos)(ls->sizebcstack - base);
413 fs->bcbase = ls->bcstack + base;
415 fs->bcbase[pc].ins = ins;
416 fs->bcbase[pc].line = ls->lastline;
417 fs->pc = pc+1;
418 return pc;
421 #define bcemit_ABC(fs, o, a, b, c) bcemit_INS(fs, BCINS_ABC(o, a, b, c))
422 #define bcemit_AD(fs, o, a, d) bcemit_INS(fs, BCINS_AD(o, a, d))
423 #define bcemit_AJ(fs, o, a, j) bcemit_INS(fs, BCINS_AJ(o, a, j))
425 #define bcptr(fs, e) (&(fs)->bcbase[(e)->u.s.info].ins)
427 /* -- Bytecode emitter for expressions ------------------------------------ */
429 /* Discharge non-constant expression to any register. */
430 static void expr_discharge(FuncState *fs, ExpDesc *e)
432 BCIns ins;
433 if (e->k == VUPVAL) {
434 ins = BCINS_AD(BC_UGET, 0, e->u.s.info);
435 } else if (e->k == VGLOBAL) {
436 ins = BCINS_AD(BC_GGET, 0, const_str(fs, e));
437 } else if (e->k == VINDEXED) {
438 BCReg rc = e->u.s.aux;
439 if ((int32_t)rc < 0) {
440 ins = BCINS_ABC(BC_TGETS, 0, e->u.s.info, ~rc);
441 } else if (rc > BCMAX_C) {
442 ins = BCINS_ABC(BC_TGETB, 0, e->u.s.info, rc-(BCMAX_C+1));
443 } else {
444 bcreg_free(fs, rc);
445 ins = BCINS_ABC(BC_TGETV, 0, e->u.s.info, rc);
447 bcreg_free(fs, e->u.s.info);
448 } else if (e->k == VCALL) {
449 e->u.s.info = e->u.s.aux;
450 e->k = VNONRELOC;
451 return;
452 } else if (e->k == VLOCAL) {
453 e->k = VNONRELOC;
454 return;
455 } else {
456 return;
458 e->u.s.info = bcemit_INS(fs, ins);
459 e->k = VRELOCABLE;
462 /* Emit bytecode to set a range of registers to nil. */
463 static void bcemit_nil(FuncState *fs, BCReg from, BCReg n)
465 if (fs->pc > fs->lasttarget) { /* No jumps to current position? */
466 BCIns *ip = &fs->bcbase[fs->pc-1].ins;
467 BCReg pto, pfrom = bc_a(*ip);
468 switch (bc_op(*ip)) { /* Try to merge with the previous instruction. */
469 case BC_KPRI:
470 if (bc_d(*ip) != ~LJ_TNIL) break;
471 if (from == pfrom) {
472 if (n == 1) return;
473 } else if (from == pfrom+1) {
474 from = pfrom;
475 n++;
476 } else {
477 break;
479 fs->pc--; /* Drop KPRI. */
480 break;
481 case BC_KNIL:
482 pto = bc_d(*ip);
483 if (pfrom <= from && from <= pto+1) { /* Can we connect both ranges? */
484 if (from+n-1 > pto)
485 setbc_d(ip, from+n-1); /* Patch previous instruction range. */
486 return;
488 break;
489 default:
490 break;
493 /* Emit new instruction or replace old instruction. */
494 bcemit_INS(fs, n == 1 ? BCINS_AD(BC_KPRI, from, VKNIL) :
495 BCINS_AD(BC_KNIL, from, from+n-1));
498 /* Discharge an expression to a specific register. Ignore branches. */
499 static void expr_toreg_nobranch(FuncState *fs, ExpDesc *e, BCReg reg)
501 BCIns ins;
502 expr_discharge(fs, e);
503 if (e->k == VKSTR) {
504 ins = BCINS_AD(BC_KSTR, reg, const_str(fs, e));
505 } else if (e->k == VKNUM) {
506 #if LJ_DUALNUM
507 cTValue *tv = expr_numtv(e);
508 if (tvisint(tv) && checki16(intV(tv)))
509 ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)intV(tv));
510 else
511 #else
512 lua_Number n = expr_numberV(e);
513 int32_t k = lj_num2int(n);
514 if (checki16(k) && n == (lua_Number)k)
515 ins = BCINS_AD(BC_KSHORT, reg, (BCReg)(uint16_t)k);
516 else
517 #endif
518 ins = BCINS_AD(BC_KNUM, reg, const_num(fs, e));
519 #if LJ_HASFFI
520 } else if (e->k == VKCDATA) {
521 fs->flags |= PROTO_FFI;
522 ins = BCINS_AD(BC_KCDATA, reg,
523 const_gc(fs, obj2gco(cdataV(&e->u.nval)), LJ_TCDATA));
524 #endif
525 } else if (e->k == VRELOCABLE) {
526 setbc_a(bcptr(fs, e), reg);
527 goto noins;
528 } else if (e->k == VNONRELOC) {
529 if (reg == e->u.s.info)
530 goto noins;
531 ins = BCINS_AD(BC_MOV, reg, e->u.s.info);
532 } else if (e->k == VKNIL) {
533 bcemit_nil(fs, reg, 1);
534 goto noins;
535 } else if (e->k <= VKTRUE) {
536 ins = BCINS_AD(BC_KPRI, reg, const_pri(e));
537 } else {
538 lua_assert(e->k == VVOID || e->k == VJMP);
539 return;
541 bcemit_INS(fs, ins);
542 noins:
543 e->u.s.info = reg;
544 e->k = VNONRELOC;
547 /* Forward declaration. */
548 static BCPos bcemit_jmp(FuncState *fs);
550 /* Discharge an expression to a specific register. */
551 static void expr_toreg(FuncState *fs, ExpDesc *e, BCReg reg)
553 expr_toreg_nobranch(fs, e, reg);
554 if (e->k == VJMP)
555 jmp_append(fs, &e->t, e->u.s.info); /* Add it to the true jump list. */
556 if (expr_hasjump(e)) { /* Discharge expression with branches. */
557 BCPos jend, jfalse = NO_JMP, jtrue = NO_JMP;
558 if (jmp_novalue(fs, e->t) || jmp_novalue(fs, e->f)) {
559 BCPos jval = (e->k == VJMP) ? NO_JMP : bcemit_jmp(fs);
560 jfalse = bcemit_AD(fs, BC_KPRI, reg, VKFALSE);
561 bcemit_AJ(fs, BC_JMP, fs->freereg, 1);
562 jtrue = bcemit_AD(fs, BC_KPRI, reg, VKTRUE);
563 jmp_tohere(fs, jval);
565 jend = fs->pc;
566 fs->lasttarget = jend;
567 jmp_patchval(fs, e->f, jend, reg, jfalse);
568 jmp_patchval(fs, e->t, jend, reg, jtrue);
570 e->f = e->t = NO_JMP;
571 e->u.s.info = reg;
572 e->k = VNONRELOC;
575 /* Discharge an expression to the next free register. */
576 static void expr_tonextreg(FuncState *fs, ExpDesc *e)
578 expr_discharge(fs, e);
579 expr_free(fs, e);
580 bcreg_reserve(fs, 1);
581 expr_toreg(fs, e, fs->freereg - 1);
584 /* Discharge an expression to any register. */
585 static BCReg expr_toanyreg(FuncState *fs, ExpDesc *e)
587 expr_discharge(fs, e);
588 if (e->k == VNONRELOC) {
589 if (!expr_hasjump(e)) return e->u.s.info; /* Already in a register. */
590 if (e->u.s.info >= fs->nactvar) {
591 expr_toreg(fs, e, e->u.s.info); /* Discharge to temp. register. */
592 return e->u.s.info;
595 expr_tonextreg(fs, e); /* Discharge to next register. */
596 return e->u.s.info;
599 /* Partially discharge expression to a value. */
600 static void expr_toval(FuncState *fs, ExpDesc *e)
602 if (expr_hasjump(e))
603 expr_toanyreg(fs, e);
604 else
605 expr_discharge(fs, e);
608 /* Emit store for LHS expression. */
609 static void bcemit_store(FuncState *fs, ExpDesc *var, ExpDesc *e)
611 BCIns ins;
612 if (var->k == VLOCAL) {
613 fs->ls->vstack[var->u.s.aux].endpc |= VSTACK_VAR_RW;
614 expr_free(fs, e);
615 expr_toreg(fs, e, var->u.s.info);
616 return;
617 } else if (var->k == VUPVAL) {
618 fs->ls->vstack[var->u.s.aux].endpc |= VSTACK_VAR_RW;
619 expr_toval(fs, e);
620 if (e->k <= VKTRUE)
621 ins = BCINS_AD(BC_USETP, var->u.s.info, const_pri(e));
622 else if (e->k == VKSTR)
623 ins = BCINS_AD(BC_USETS, var->u.s.info, const_str(fs, e));
624 else if (e->k == VKNUM)
625 ins = BCINS_AD(BC_USETN, var->u.s.info, const_num(fs, e));
626 else
627 ins = BCINS_AD(BC_USETV, var->u.s.info, expr_toanyreg(fs, e));
628 } else if (var->k == VGLOBAL) {
629 BCReg ra = expr_toanyreg(fs, e);
630 ins = BCINS_AD(BC_GSET, ra, const_str(fs, var));
631 } else {
632 BCReg ra, rc;
633 lua_assert(var->k == VINDEXED);
634 ra = expr_toanyreg(fs, e);
635 rc = var->u.s.aux;
636 if ((int32_t)rc < 0) {
637 ins = BCINS_ABC(BC_TSETS, ra, var->u.s.info, ~rc);
638 } else if (rc > BCMAX_C) {
639 ins = BCINS_ABC(BC_TSETB, ra, var->u.s.info, rc-(BCMAX_C+1));
640 } else {
641 /* Free late alloced key reg to avoid assert on free of value reg. */
642 /* This can only happen when called from expr_table(). */
643 lua_assert(e->k != VNONRELOC || ra < fs->nactvar ||
644 rc < ra || (bcreg_free(fs, rc),1));
645 ins = BCINS_ABC(BC_TSETV, ra, var->u.s.info, rc);
648 bcemit_INS(fs, ins);
649 expr_free(fs, e);
652 /* Emit method lookup expression. */
653 static void bcemit_method(FuncState *fs, ExpDesc *e, ExpDesc *key)
655 BCReg idx, func, obj = expr_toanyreg(fs, e);
656 expr_free(fs, e);
657 func = fs->freereg;
658 bcemit_AD(fs, BC_MOV, func+1, obj); /* Copy object to first argument. */
659 lua_assert(expr_isstrk(key));
660 idx = const_str(fs, key);
661 if (idx <= BCMAX_C) {
662 bcreg_reserve(fs, 2);
663 bcemit_ABC(fs, BC_TGETS, func, obj, idx);
664 } else {
665 bcreg_reserve(fs, 3);
666 bcemit_AD(fs, BC_KSTR, func+2, idx);
667 bcemit_ABC(fs, BC_TGETV, func, obj, func+2);
668 fs->freereg--;
670 e->u.s.info = func;
671 e->k = VNONRELOC;
674 /* -- Bytecode emitter for branches --------------------------------------- */
676 /* Emit unconditional branch. */
677 static BCPos bcemit_jmp(FuncState *fs)
679 BCPos jpc = fs->jpc;
680 BCPos j = fs->pc - 1;
681 BCIns *ip = &fs->bcbase[j].ins;
682 fs->jpc = NO_JMP;
683 if ((int32_t)j >= (int32_t)fs->lasttarget &&
684 bc_op(*ip) == BC_UCLO)
685 setbc_j(ip, NO_JMP);
686 else
687 j = bcemit_AJ(fs, BC_JMP, fs->freereg, NO_JMP);
688 jmp_append(fs, &j, jpc);
689 return j;
692 /* Invert branch condition of bytecode instruction. */
693 static void invertcond(FuncState *fs, ExpDesc *e)
695 BCIns *ip = &fs->bcbase[e->u.s.info - 1].ins;
696 setbc_op(ip, bc_op(*ip)^1);
699 /* Emit conditional branch. */
700 static BCPos bcemit_branch(FuncState *fs, ExpDesc *e, int cond)
702 BCPos pc;
703 if (e->k == VRELOCABLE) {
704 BCIns *ip = bcptr(fs, e);
705 if (bc_op(*ip) == BC_NOT) {
706 *ip = BCINS_AD(cond ? BC_ISF : BC_IST, 0, bc_d(*ip));
707 return bcemit_jmp(fs);
710 if (e->k != VNONRELOC) {
711 bcreg_reserve(fs, 1);
712 expr_toreg_nobranch(fs, e, fs->freereg-1);
714 bcemit_AD(fs, cond ? BC_ISTC : BC_ISFC, NO_REG, e->u.s.info);
715 pc = bcemit_jmp(fs);
716 expr_free(fs, e);
717 return pc;
720 /* Emit branch on true condition. */
721 static void bcemit_branch_t(FuncState *fs, ExpDesc *e)
723 BCPos pc;
724 expr_discharge(fs, e);
725 if (e->k == VKSTR || e->k == VKNUM || e->k == VKTRUE)
726 pc = NO_JMP; /* Never jump. */
727 else if (e->k == VJMP)
728 invertcond(fs, e), pc = e->u.s.info;
729 else if (e->k == VKFALSE || e->k == VKNIL)
730 expr_toreg_nobranch(fs, e, NO_REG), pc = bcemit_jmp(fs);
731 else
732 pc = bcemit_branch(fs, e, 0);
733 jmp_append(fs, &e->f, pc);
734 jmp_tohere(fs, e->t);
735 e->t = NO_JMP;
738 /* Emit branch on false condition. */
739 static void bcemit_branch_f(FuncState *fs, ExpDesc *e)
741 BCPos pc;
742 expr_discharge(fs, e);
743 if (e->k == VKNIL || e->k == VKFALSE)
744 pc = NO_JMP; /* Never jump. */
745 else if (e->k == VJMP)
746 pc = e->u.s.info;
747 else if (e->k == VKSTR || e->k == VKNUM || e->k == VKTRUE)
748 expr_toreg_nobranch(fs, e, NO_REG), pc = bcemit_jmp(fs);
749 else
750 pc = bcemit_branch(fs, e, 1);
751 jmp_append(fs, &e->t, pc);
752 jmp_tohere(fs, e->f);
753 e->f = NO_JMP;
756 /* -- Bytecode emitter for operators -------------------------------------- */
758 /* Try constant-folding of arithmetic operators. */
759 static int foldarith(BinOpr opr, ExpDesc *e1, ExpDesc *e2)
761 TValue o;
762 lua_Number n;
763 if (!expr_isnumk_nojump(e1) || !expr_isnumk_nojump(e2)) return 0;
764 n = lj_vm_foldarith(expr_numberV(e1), expr_numberV(e2), (int)opr-OPR_ADD);
765 setnumV(&o, n);
766 if (tvisnan(&o) || tvismzero(&o)) return 0; /* Avoid NaN and -0 as consts. */
767 if (LJ_DUALNUM) {
768 int32_t k = lj_num2int(n);
769 if ((lua_Number)k == n) {
770 setintV(&e1->u.nval, k);
771 return 1;
774 setnumV(&e1->u.nval, n);
775 return 1;
778 /* Emit arithmetic operator. */
779 static void bcemit_arith(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2)
781 BCReg rb, rc, t;
782 uint32_t op;
783 if (foldarith(opr, e1, e2))
784 return;
785 if (opr == OPR_POW) {
786 op = BC_POW;
787 rc = expr_toanyreg(fs, e2);
788 rb = expr_toanyreg(fs, e1);
789 } else {
790 op = opr-OPR_ADD+BC_ADDVV;
791 /* Must discharge 2nd operand first since VINDEXED might free regs. */
792 expr_toval(fs, e2);
793 if (expr_isnumk(e2) && (rc = const_num(fs, e2)) <= BCMAX_C)
794 op -= BC_ADDVV-BC_ADDVN;
795 else
796 rc = expr_toanyreg(fs, e2);
797 /* 1st operand discharged by bcemit_binop_left, but need KNUM/KSHORT. */
798 lua_assert(expr_isnumk(e1) || e1->k == VNONRELOC);
799 expr_toval(fs, e1);
800 /* Avoid two consts to satisfy bytecode constraints. */
801 if (expr_isnumk(e1) && !expr_isnumk(e2) &&
802 (t = const_num(fs, e1)) <= BCMAX_B) {
803 rb = rc; rc = t; op -= BC_ADDVV-BC_ADDNV;
804 } else {
805 rb = expr_toanyreg(fs, e1);
808 /* Using expr_free might cause asserts if the order is wrong. */
809 if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--;
810 if (e2->k == VNONRELOC && e2->u.s.info >= fs->nactvar) fs->freereg--;
811 e1->u.s.info = bcemit_ABC(fs, op, 0, rb, rc);
812 e1->k = VRELOCABLE;
815 /* Emit comparison operator. */
816 static void bcemit_comp(FuncState *fs, BinOpr opr, ExpDesc *e1, ExpDesc *e2)
818 ExpDesc *eret = e1;
819 BCIns ins;
820 expr_toval(fs, e1);
821 if (opr == OPR_EQ || opr == OPR_NE) {
822 BCOp op = opr == OPR_EQ ? BC_ISEQV : BC_ISNEV;
823 BCReg ra;
824 if (expr_isk(e1)) { e1 = e2; e2 = eret; } /* Need constant in 2nd arg. */
825 ra = expr_toanyreg(fs, e1); /* First arg must be in a reg. */
826 expr_toval(fs, e2);
827 switch (e2->k) {
828 case VKNIL: case VKFALSE: case VKTRUE:
829 ins = BCINS_AD(op+(BC_ISEQP-BC_ISEQV), ra, const_pri(e2));
830 break;
831 case VKSTR:
832 ins = BCINS_AD(op+(BC_ISEQS-BC_ISEQV), ra, const_str(fs, e2));
833 break;
834 case VKNUM:
835 ins = BCINS_AD(op+(BC_ISEQN-BC_ISEQV), ra, const_num(fs, e2));
836 break;
837 default:
838 ins = BCINS_AD(op, ra, expr_toanyreg(fs, e2));
839 break;
841 } else {
842 uint32_t op = opr-OPR_LT+BC_ISLT;
843 BCReg ra, rd;
844 if ((op-BC_ISLT) & 1) { /* GT -> LT, GE -> LE */
845 e1 = e2; e2 = eret; /* Swap operands. */
846 op = ((op-BC_ISLT)^3)+BC_ISLT;
848 rd = expr_toanyreg(fs, e2);
849 ra = expr_toanyreg(fs, e1);
850 ins = BCINS_AD(op, ra, rd);
852 /* Using expr_free might cause asserts if the order is wrong. */
853 if (e1->k == VNONRELOC && e1->u.s.info >= fs->nactvar) fs->freereg--;
854 if (e2->k == VNONRELOC && e2->u.s.info >= fs->nactvar) fs->freereg--;
855 bcemit_INS(fs, ins);
856 eret->u.s.info = bcemit_jmp(fs);
857 eret->k = VJMP;
860 /* Fixup left side of binary operator. */
861 static void bcemit_binop_left(FuncState *fs, BinOpr op, ExpDesc *e)
863 if (op == OPR_AND) {
864 bcemit_branch_t(fs, e);
865 } else if (op == OPR_OR) {
866 bcemit_branch_f(fs, e);
867 } else if (op == OPR_CONCAT) {
868 expr_tonextreg(fs, e);
869 } else if (op == OPR_EQ || op == OPR_NE) {
870 if (!expr_isk_nojump(e)) expr_toanyreg(fs, e);
871 } else {
872 if (!expr_isnumk_nojump(e)) expr_toanyreg(fs, e);
876 /* Emit binary operator. */
877 static void bcemit_binop(FuncState *fs, BinOpr op, ExpDesc *e1, ExpDesc *e2)
879 if (op <= OPR_POW) {
880 bcemit_arith(fs, op, e1, e2);
881 } else if (op == OPR_AND) {
882 lua_assert(e1->t == NO_JMP); /* List must be closed. */
883 expr_discharge(fs, e2);
884 jmp_append(fs, &e2->f, e1->f);
885 *e1 = *e2;
886 } else if (op == OPR_OR) {
887 lua_assert(e1->f == NO_JMP); /* List must be closed. */
888 expr_discharge(fs, e2);
889 jmp_append(fs, &e2->t, e1->t);
890 *e1 = *e2;
891 } else if (op == OPR_CONCAT) {
892 expr_toval(fs, e2);
893 if (e2->k == VRELOCABLE && bc_op(*bcptr(fs, e2)) == BC_CAT) {
894 lua_assert(e1->u.s.info == bc_b(*bcptr(fs, e2))-1);
895 expr_free(fs, e1);
896 setbc_b(bcptr(fs, e2), e1->u.s.info);
897 e1->u.s.info = e2->u.s.info;
898 } else {
899 expr_tonextreg(fs, e2);
900 expr_free(fs, e2);
901 expr_free(fs, e1);
902 e1->u.s.info = bcemit_ABC(fs, BC_CAT, 0, e1->u.s.info, e2->u.s.info);
904 e1->k = VRELOCABLE;
905 } else {
906 lua_assert(op == OPR_NE || op == OPR_EQ ||
907 op == OPR_LT || op == OPR_GE || op == OPR_LE || op == OPR_GT);
908 bcemit_comp(fs, op, e1, e2);
912 /* Emit unary operator. */
913 static void bcemit_unop(FuncState *fs, BCOp op, ExpDesc *e)
915 if (op == BC_NOT) {
916 /* Swap true and false lists. */
917 { BCPos temp = e->f; e->f = e->t; e->t = temp; }
918 jmp_dropval(fs, e->f);
919 jmp_dropval(fs, e->t);
920 expr_discharge(fs, e);
921 if (e->k == VKNIL || e->k == VKFALSE) {
922 e->k = VKTRUE;
923 return;
924 } else if (expr_isk(e) || (LJ_HASFFI && e->k == VKCDATA)) {
925 e->k = VKFALSE;
926 return;
927 } else if (e->k == VJMP) {
928 invertcond(fs, e);
929 return;
930 } else if (e->k == VRELOCABLE) {
931 bcreg_reserve(fs, 1);
932 setbc_a(bcptr(fs, e), fs->freereg-1);
933 e->u.s.info = fs->freereg-1;
934 e->k = VNONRELOC;
935 } else {
936 lua_assert(e->k == VNONRELOC);
938 } else {
939 lua_assert(op == BC_UNM || op == BC_LEN);
940 if (op == BC_UNM && !expr_hasjump(e)) { /* Constant-fold negations. */
941 #if LJ_HASFFI
942 if (e->k == VKCDATA) { /* Fold in-place since cdata is not interned. */
943 GCcdata *cd = cdataV(&e->u.nval);
944 int64_t *p = (int64_t *)cdataptr(cd);
945 if (cd->ctypeid == CTID_COMPLEX_DOUBLE)
946 p[1] ^= (int64_t)U64x(80000000,00000000);
947 else
948 *p = -*p;
949 return;
950 } else
951 #endif
952 if (expr_isnumk(e) && !expr_numiszero(e)) { /* Avoid folding to -0. */
953 TValue *o = expr_numtv(e);
954 if (tvisint(o)) {
955 int32_t k = intV(o);
956 if (k == -k)
957 setnumV(o, -(lua_Number)k);
958 else
959 setintV(o, -k);
960 return;
961 } else {
962 o->u64 ^= U64x(80000000,00000000);
963 return;
967 expr_toanyreg(fs, e);
969 expr_free(fs, e);
970 e->u.s.info = bcemit_AD(fs, op, 0, e->u.s.info);
971 e->k = VRELOCABLE;
974 /* -- Lexer support ------------------------------------------------------- */
976 /* Check and consume optional token. */
977 static int lex_opt(LexState *ls, LexToken tok)
979 if (ls->token == tok) {
980 lj_lex_next(ls);
981 return 1;
983 return 0;
986 /* Check and consume token. */
987 static void lex_check(LexState *ls, LexToken tok)
989 if (ls->token != tok)
990 err_token(ls, tok);
991 lj_lex_next(ls);
994 /* Check for matching token. */
995 static void lex_match(LexState *ls, LexToken what, LexToken who, BCLine line)
997 if (!lex_opt(ls, what)) {
998 if (line == ls->linenumber) {
999 err_token(ls, what);
1000 } else {
1001 const char *swhat = lj_lex_token2str(ls, what);
1002 const char *swho = lj_lex_token2str(ls, who);
1003 lj_lex_error(ls, ls->token, LJ_ERR_XMATCH, swhat, swho, line);
1008 /* Check for string token. */
1009 static GCstr *lex_str(LexState *ls)
1011 GCstr *s;
1012 if (ls->token != TK_name)
1013 err_token(ls, TK_name);
1014 s = strV(&ls->tokenval);
1015 lj_lex_next(ls);
1016 return s;
1019 /* -- Variable handling --------------------------------------------------- */
1021 #define var_get(ls, fs, i) ((ls)->vstack[(fs)->varmap[(i)]])
1023 /* Define a new local variable. */
1024 static void var_new(LexState *ls, BCReg n, GCstr *name)
1026 FuncState *fs = ls->fs;
1027 MSize vtop = ls->vtop;
1028 checklimit(fs, fs->nactvar+n, LJ_MAX_LOCVAR, "local variables");
1029 if (LJ_UNLIKELY(vtop >= ls->sizevstack)) {
1030 if (ls->sizevstack >= LJ_MAX_VSTACK)
1031 lj_lex_error(ls, 0, LJ_ERR_XLIMC, LJ_MAX_VSTACK);
1032 lj_mem_growvec(ls->L, ls->vstack, ls->sizevstack, LJ_MAX_VSTACK, VarInfo);
1034 lua_assert((uintptr_t)name < VARNAME__MAX ||
1035 lj_tab_getstr(fs->kt, name) != NULL);
1036 /* NOBARRIER: name is anchored in fs->kt and ls->vstack is not a GCobj. */
1037 setgcref(ls->vstack[vtop].name, obj2gco(name));
1038 fs->varmap[fs->nactvar+n] = (uint16_t)vtop;
1039 ls->vtop = vtop+1;
1042 #define var_new_lit(ls, n, v) \
1043 var_new(ls, (n), lj_parse_keepstr(ls, "" v, sizeof(v)-1))
1045 #define var_new_fixed(ls, n, vn) \
1046 var_new(ls, (n), (GCstr *)(uintptr_t)(vn))
1048 /* Add local variables. */
1049 static void var_add(LexState *ls, BCReg nvars)
1051 FuncState *fs = ls->fs;
1052 fs->nactvar = (uint8_t)(fs->nactvar + nvars);
1053 for (; nvars; nvars--) {
1054 VarInfo *v = &var_get(ls, fs, fs->nactvar - nvars);
1055 v->startpc = fs->pc;
1056 v->endpc = 0;
1060 /* Remove local variables. */
1061 static void var_remove(LexState *ls, BCReg tolevel)
1063 FuncState *fs = ls->fs;
1064 while (fs->nactvar > tolevel)
1065 var_get(ls, fs, --fs->nactvar).endpc |= fs->pc;
1068 /* Lookup local variable name. */
1069 static BCReg var_lookup_local(FuncState *fs, GCstr *n)
1071 int i;
1072 for (i = fs->nactvar-1; i >= 0; i--) {
1073 if (n == strref(var_get(fs->ls, fs, i).name))
1074 return (BCReg)i;
1076 return (BCReg)-1; /* Not found. */
1079 /* Lookup or add upvalue index. */
1080 static MSize var_lookup_uv(FuncState *fs, MSize vidx, ExpDesc *e)
1082 MSize i, n = fs->nuv;
1083 for (i = 0; i < n; i++)
1084 if (fs->uvloc[i].vidx == vidx)
1085 return i; /* Already exists. */
1086 /* Otherwise create a new one. */
1087 checklimit(fs, fs->nuv, LJ_MAX_UPVAL, "upvalues");
1088 lua_assert(e->k == VLOCAL || e->k == VUPVAL);
1089 fs->uvloc[n].vidx = (uint16_t)vidx;
1090 fs->uvloc[n].slot = (uint16_t)(e->u.s.info |
1091 (e->k == VLOCAL ? PROTO_UV_LOCAL : 0));
1092 fs->nuv = n+1;
1093 return n;
1096 /* Forward declaration. */
1097 static void scope_uvmark(FuncState *fs, BCReg level);
1099 /* Recursively lookup variables in enclosing functions. */
1100 static MSize var_lookup_(FuncState *fs, GCstr *name, ExpDesc *e, int first)
1102 if (fs) {
1103 BCReg reg = var_lookup_local(fs, name);
1104 if ((int32_t)reg >= 0) { /* Local in this function? */
1105 expr_init(e, VLOCAL, reg);
1106 if (!first)
1107 scope_uvmark(fs, reg); /* Scope now has an upvalue. */
1108 return (MSize)(e->u.s.aux = (uint32_t)fs->varmap[reg]);
1109 } else {
1110 MSize vidx = var_lookup_(fs->prev, name, e, 0); /* Var in outer func? */
1111 if ((int32_t)vidx >= 0) { /* Yes, make it an upvalue here. */
1112 e->u.s.info = (uint8_t)var_lookup_uv(fs, vidx, e);
1113 e->k = VUPVAL;
1114 return vidx;
1117 } else { /* Not found in any function, must be a global. */
1118 expr_init(e, VGLOBAL, 0);
1119 e->u.sval = name;
1121 return (MSize)-1; /* Global. */
1124 /* Lookup variable name. */
1125 #define var_lookup(ls, e) \
1126 var_lookup_((ls)->fs, lex_str(ls), (e), 1)
1128 /* -- Function state management ------------------------------------------- */
1130 /* Fixup bytecode for prototype. */
1131 static void fs_fixup_bc(FuncState *fs, GCproto *pt, BCIns *bc, MSize n)
1133 BCInsLine *base = fs->bcbase;
1134 MSize i;
1135 pt->sizebc = n;
1136 bc[0] = BCINS_AD((fs->flags & PROTO_VARARG) ? BC_FUNCV : BC_FUNCF,
1137 fs->framesize, 0);
1138 for (i = 1; i < n; i++)
1139 bc[i] = base[i].ins;
1142 /* Fixup constants for prototype. */
1143 static void fs_fixup_k(FuncState *fs, GCproto *pt, void *kptr)
1145 GCtab *kt;
1146 TValue *array;
1147 Node *node;
1148 MSize i, hmask;
1149 checklimitgt(fs, fs->nkn, BCMAX_D+1, "constants");
1150 checklimitgt(fs, fs->nkgc, BCMAX_D+1, "constants");
1151 setmref(pt->k, kptr);
1152 pt->sizekn = fs->nkn;
1153 pt->sizekgc = fs->nkgc;
1154 kt = fs->kt;
1155 array = tvref(kt->array);
1156 for (i = 0; i < kt->asize; i++)
1157 if (tvhaskslot(&array[i])) {
1158 TValue *tv = &((TValue *)kptr)[tvkslot(&array[i])];
1159 if (LJ_DUALNUM)
1160 setintV(tv, (int32_t)i);
1161 else
1162 setnumV(tv, (lua_Number)i);
1164 node = noderef(kt->node);
1165 hmask = kt->hmask;
1166 for (i = 0; i <= hmask; i++) {
1167 Node *n = &node[i];
1168 if (tvhaskslot(&n->val)) {
1169 ptrdiff_t kidx = (ptrdiff_t)tvkslot(&n->val);
1170 lua_assert(!tvisint(&n->key));
1171 if (tvisnum(&n->key)) {
1172 TValue *tv = &((TValue *)kptr)[kidx];
1173 if (LJ_DUALNUM) {
1174 lua_Number nn = numV(&n->key);
1175 int32_t k = lj_num2int(nn);
1176 lua_assert(!tvismzero(&n->key));
1177 if ((lua_Number)k == nn)
1178 setintV(tv, k);
1179 else
1180 *tv = n->key;
1181 } else {
1182 *tv = n->key;
1184 } else {
1185 GCobj *o = gcV(&n->key);
1186 setgcref(((GCRef *)kptr)[~kidx], o);
1187 lj_gc_objbarrier(fs->L, pt, o);
1193 /* Fixup upvalues for prototype. */
1194 static void fs_fixup_uv(FuncState *fs, GCproto *pt, uint16_t *uv)
1196 VarInfo *vstack;
1197 UVMap *uvloc;
1198 MSize i, n = fs->nuv;
1199 setmref(pt->uv, uv);
1200 pt->sizeuv = n;
1201 vstack = fs->ls->vstack;
1202 uvloc = fs->uvloc;
1203 for (i = 0; i < n; i++) {
1204 uint16_t slot = uvloc[i].slot;
1205 uint16_t vidx = uvloc[i].vidx;
1206 if ((slot & PROTO_UV_LOCAL) && !(vstack[vidx].endpc & VSTACK_VAR_RW))
1207 slot |= PROTO_UV_IMMUTABLE;
1208 uv[i] = slot;
1212 #ifndef LUAJIT_DISABLE_DEBUGINFO
1213 /* Prepare lineinfo for prototype. */
1214 static size_t fs_prep_line(FuncState *fs, BCLine numline)
1216 return (fs->pc-1) << (numline < 256 ? 0 : numline < 65536 ? 1 : 2);
1219 /* Fixup lineinfo for prototype. */
1220 static void fs_fixup_line(FuncState *fs, GCproto *pt,
1221 void *lineinfo, BCLine numline)
1223 BCInsLine *base = fs->bcbase + 1;
1224 BCLine first = fs->linedefined;
1225 MSize i = 0, n = fs->pc-1;
1226 pt->firstline = fs->linedefined;
1227 pt->numline = numline;
1228 setmref(pt->lineinfo, lineinfo);
1229 if (LJ_LIKELY(numline < 256)) {
1230 uint8_t *li = (uint8_t *)lineinfo;
1231 do {
1232 BCLine delta = base[i].line - first;
1233 lua_assert(delta >= 0 && delta < 256);
1234 li[i] = (uint8_t)delta;
1235 } while (++i < n);
1236 } else if (LJ_LIKELY(numline < 65536)) {
1237 uint16_t *li = (uint16_t *)lineinfo;
1238 do {
1239 BCLine delta = base[i].line - first;
1240 lua_assert(delta >= 0 && delta < 65536);
1241 li[i] = (uint16_t)delta;
1242 } while (++i < n);
1243 } else {
1244 uint32_t *li = (uint32_t *)lineinfo;
1245 do {
1246 BCLine delta = base[i].line - first;
1247 lua_assert(delta >= 0);
1248 li[i] = (uint32_t)delta;
1249 } while (++i < n);
1253 /* Resize buffer if needed. */
1254 static LJ_NOINLINE void fs_buf_resize(LexState *ls, MSize len)
1256 MSize sz = ls->sb.sz * 2;
1257 while (ls->sb.n + len > sz) sz = sz * 2;
1258 lj_str_resizebuf(ls->L, &ls->sb, sz);
1261 static LJ_AINLINE void fs_buf_need(LexState *ls, MSize len)
1263 if (LJ_UNLIKELY(ls->sb.n + len > ls->sb.sz))
1264 fs_buf_resize(ls, len);
1267 /* Add string to buffer. */
1268 static void fs_buf_str(LexState *ls, const char *str, MSize len)
1270 char *p = ls->sb.buf + ls->sb.n;
1271 MSize i;
1272 ls->sb.n += len;
1273 for (i = 0; i < len; i++) p[i] = str[i];
1276 /* Add ULEB128 value to buffer. */
1277 static void fs_buf_uleb128(LexState *ls, uint32_t v)
1279 MSize n = ls->sb.n;
1280 uint8_t *p = (uint8_t *)ls->sb.buf;
1281 for (; v >= 0x80; v >>= 7)
1282 p[n++] = (uint8_t)((v & 0x7f) | 0x80);
1283 p[n++] = (uint8_t)v;
1284 ls->sb.n = n;
1287 /* Prepare variable info for prototype. */
1288 static size_t fs_prep_var(LexState *ls, FuncState *fs, size_t *ofsvar)
1290 VarInfo *vstack = fs->ls->vstack;
1291 MSize i, n;
1292 BCPos lastpc;
1293 lj_str_resetbuf(&ls->sb); /* Copy to temp. string buffer. */
1294 /* Store upvalue names. */
1295 for (i = 0, n = fs->nuv; i < n; i++) {
1296 GCstr *s = strref(vstack[fs->uvloc[i].vidx].name);
1297 MSize len = s->len+1;
1298 fs_buf_need(ls, len);
1299 fs_buf_str(ls, strdata(s), len);
1301 *ofsvar = ls->sb.n;
1302 vstack += fs->vbase;
1303 lastpc = 0;
1304 /* Store local variable names and compressed ranges. */
1305 for (i = 0, n = ls->vtop - fs->vbase; i < n; i++) {
1306 GCstr *s = strref(vstack[i].name);
1307 BCPos startpc = vstack[i].startpc;
1308 BCPos endpc = vstack[i].endpc & ~VSTACK_VAR_RW;
1309 if ((uintptr_t)s < VARNAME__MAX) {
1310 fs_buf_need(ls, 1 + 2*5);
1311 ls->sb.buf[ls->sb.n++] = (uint8_t)(uintptr_t)s;
1312 } else {
1313 MSize len = s->len+1;
1314 fs_buf_need(ls, len + 2*5);
1315 fs_buf_str(ls, strdata(s), len);
1317 fs_buf_uleb128(ls, startpc-lastpc);
1318 fs_buf_uleb128(ls, endpc-startpc);
1319 lastpc = startpc;
1321 fs_buf_need(ls, 1);
1322 ls->sb.buf[ls->sb.n++] = '\0'; /* Terminator for varinfo. */
1323 return ls->sb.n;
1326 /* Fixup variable info for prototype. */
1327 static void fs_fixup_var(LexState *ls, GCproto *pt, uint8_t *p, size_t ofsvar)
1329 setmref(pt->uvinfo, p);
1330 setmref(pt->varinfo, (char *)p + ofsvar);
1331 memcpy(p, ls->sb.buf, ls->sb.n); /* Copy from temp. string buffer. */
1333 #else
1335 /* Initialize with empty debug info, if disabled. */
1336 #define fs_prep_line(fs, numline) (UNUSED(numline), 0)
1337 #define fs_fixup_line(fs, pt, li, numline) \
1338 pt->firstline = pt->numline = 0, setmref((pt)->lineinfo, NULL)
1339 #define fs_prep_var(ls, fs, ofsvar) (UNUSED(ofsvar), 0)
1340 #define fs_fixup_var(ls, pt, p, ofsvar) \
1341 setmref((pt)->uvinfo, NULL), setmref((pt)->varinfo, NULL)
1343 #endif
1345 /* Check if bytecode op returns. */
1346 static int bcopisret(BCOp op)
1348 switch (op) {
1349 case BC_CALLMT: case BC_CALLT:
1350 case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1:
1351 return 1;
1352 default:
1353 return 0;
1357 /* Fixup return instruction for prototype. */
1358 static void fs_fixup_ret(FuncState *fs)
1360 BCPos lastpc = fs->pc;
1361 if (lastpc <= fs->lasttarget || !bcopisret(bc_op(fs->bcbase[lastpc-1].ins))) {
1362 if (fs->flags & PROTO_CHILD)
1363 bcemit_AJ(fs, BC_UCLO, 0, 0);
1364 bcemit_AD(fs, BC_RET0, 0, 1); /* Need final return. */
1366 /* May need to fixup returns encoded before first function was created. */
1367 if (fs->flags & PROTO_FIXUP_RETURN) {
1368 BCPos pc;
1369 for (pc = 0; pc < lastpc; pc++) {
1370 BCIns ins = fs->bcbase[pc].ins;
1371 BCPos offset;
1372 switch (bc_op(ins)) {
1373 case BC_CALLMT: case BC_CALLT:
1374 case BC_RETM: case BC_RET: case BC_RET0: case BC_RET1:
1375 offset = bcemit_INS(fs, ins)-(pc+1)+BCBIAS_J; /* Copy return ins. */
1376 if (offset > BCMAX_D)
1377 err_syntax(fs->ls, LJ_ERR_XFIXUP);
1378 /* Replace with UCLO plus branch. */
1379 fs->bcbase[pc].ins = BCINS_AD(BC_UCLO, 0, offset);
1380 break;
1381 case BC_UCLO:
1382 return; /* We're done. */
1383 default:
1384 break;
1390 /* Finish a FuncState and return the new prototype. */
1391 static GCproto *fs_finish(LexState *ls, BCLine line)
1393 lua_State *L = ls->L;
1394 FuncState *fs = ls->fs;
1395 BCLine numline = line - fs->linedefined;
1396 size_t sizept, ofsk, ofsuv, ofsli, ofsdbg, ofsvar;
1397 GCproto *pt;
1399 /* Apply final fixups. */
1400 lua_assert(fs->bl == NULL);
1401 fs_fixup_ret(fs);
1402 var_remove(ls, 0);
1404 /* Calculate total size of prototype including all colocated arrays. */
1405 sizept = sizeof(GCproto) + fs->pc*sizeof(BCIns) + fs->nkgc*sizeof(GCRef);
1406 sizept = (sizept + sizeof(TValue)-1) & ~(sizeof(TValue)-1);
1407 ofsk = sizept; sizept += fs->nkn*sizeof(TValue);
1408 ofsuv = sizept; sizept += ((fs->nuv+1)&~1)*2;
1409 ofsli = sizept; sizept += fs_prep_line(fs, numline);
1410 ofsdbg = sizept; sizept += fs_prep_var(ls, fs, &ofsvar);
1412 /* Allocate prototype and initialize its fields. */
1413 pt = (GCproto *)lj_mem_newgco(L, (MSize)sizept);
1414 pt->gct = ~LJ_TPROTO;
1415 pt->sizept = (MSize)sizept;
1416 pt->trace = 0;
1417 pt->flags = (uint8_t)(fs->flags & ~(PROTO_HAS_RETURN|PROTO_FIXUP_RETURN));
1418 pt->numparams = fs->numparams;
1419 pt->framesize = fs->framesize;
1420 setgcref(pt->chunkname, obj2gco(ls->chunkname));
1422 /* Close potentially uninitialized gap between bc and kgc. */
1423 *(uint32_t *)((char *)pt + ofsk - sizeof(GCRef)*(fs->nkgc+1)) = 0;
1424 fs_fixup_bc(fs, pt, (BCIns *)((char *)pt + sizeof(GCproto)), fs->pc);
1425 fs_fixup_k(fs, pt, (void *)((char *)pt + ofsk));
1426 fs_fixup_uv(fs, pt, (uint16_t *)((char *)pt + ofsuv));
1427 fs_fixup_line(fs, pt, (void *)((char *)pt + ofsli), numline);
1428 fs_fixup_var(ls, pt, (uint8_t *)((char *)pt + ofsdbg), ofsvar);
1430 lj_vmevent_send(L, BC,
1431 setprotoV(L, L->top++, pt);
1434 L->top--; /* Pop table of constants. */
1435 ls->vtop = fs->vbase; /* Reset variable stack. */
1436 ls->fs = fs->prev;
1437 lua_assert(ls->fs != NULL || ls->token == TK_eof);
1438 return pt;
1441 /* Initialize a new FuncState. */
1442 static void fs_init(LexState *ls, FuncState *fs)
1444 lua_State *L = ls->L;
1445 fs->prev = ls->fs; ls->fs = fs; /* Append to list. */
1446 fs->ls = ls;
1447 fs->vbase = ls->vtop;
1448 fs->L = L;
1449 fs->pc = 0;
1450 fs->lasttarget = 0;
1451 fs->jpc = NO_JMP;
1452 fs->freereg = 0;
1453 fs->nkgc = 0;
1454 fs->nkn = 0;
1455 fs->nactvar = 0;
1456 fs->nuv = 0;
1457 fs->bl = NULL;
1458 fs->flags = 0;
1459 fs->framesize = 1; /* Minimum frame size. */
1460 fs->kt = lj_tab_new(L, 0, 0);
1461 /* Anchor table of constants in stack to avoid being collected. */
1462 settabV(L, L->top, fs->kt);
1463 incr_top(L);
1466 /* -- Expressions --------------------------------------------------------- */
1468 /* Forward declaration. */
1469 static void expr(LexState *ls, ExpDesc *v);
1471 /* Return string expression. */
1472 static void expr_str(LexState *ls, ExpDesc *e)
1474 expr_init(e, VKSTR, 0);
1475 e->u.sval = lex_str(ls);
1478 /* Return index expression. */
1479 static void expr_index(FuncState *fs, ExpDesc *t, ExpDesc *e)
1481 /* Already called: expr_toval(fs, e). */
1482 t->k = VINDEXED;
1483 if (expr_isnumk(e)) {
1484 #if LJ_DUALNUM
1485 if (tvisint(expr_numtv(e))) {
1486 int32_t k = intV(expr_numtv(e));
1487 if (checku8(k)) {
1488 t->u.s.aux = BCMAX_C+1+(uint32_t)k; /* 256..511: const byte key */
1489 return;
1492 #else
1493 lua_Number n = expr_numberV(e);
1494 int32_t k = lj_num2int(n);
1495 if (checku8(k) && n == (lua_Number)k) {
1496 t->u.s.aux = BCMAX_C+1+(uint32_t)k; /* 256..511: const byte key */
1497 return;
1499 #endif
1500 } else if (expr_isstrk(e)) {
1501 BCReg idx = const_str(fs, e);
1502 if (idx <= BCMAX_C) {
1503 t->u.s.aux = ~idx; /* -256..-1: const string key */
1504 return;
1507 t->u.s.aux = expr_toanyreg(fs, e); /* 0..255: register */
1510 /* Parse index expression with named field. */
1511 static void expr_field(LexState *ls, ExpDesc *v)
1513 FuncState *fs = ls->fs;
1514 ExpDesc key;
1515 expr_toanyreg(fs, v);
1516 lj_lex_next(ls); /* Skip dot or colon. */
1517 expr_str(ls, &key);
1518 expr_index(fs, v, &key);
1521 /* Parse index expression with brackets. */
1522 static void expr_bracket(LexState *ls, ExpDesc *v)
1524 lj_lex_next(ls); /* Skip '['. */
1525 expr(ls, v);
1526 expr_toval(ls->fs, v);
1527 lex_check(ls, ']');
1530 /* Get value of constant expression. */
1531 static void expr_kvalue(TValue *v, ExpDesc *e)
1533 if (e->k <= VKTRUE) {
1534 setitype(v, ~(uint32_t)e->k);
1535 } else if (e->k == VKSTR) {
1536 setgcref(v->gcr, obj2gco(e->u.sval));
1537 setitype(v, LJ_TSTR);
1538 } else {
1539 lua_assert(tvisnumber(expr_numtv(e)));
1540 *v = *expr_numtv(e);
1544 /* Parse table constructor expression. */
1545 static void expr_table(LexState *ls, ExpDesc *e)
1547 FuncState *fs = ls->fs;
1548 BCLine line = ls->linenumber;
1549 GCtab *t = NULL;
1550 int vcall = 0, needarr = 0, fixt = 0;
1551 uint32_t narr = 1; /* First array index. */
1552 uint32_t nhash = 0; /* Number of hash entries. */
1553 BCReg freg = fs->freereg;
1554 BCPos pc = bcemit_AD(fs, BC_TNEW, freg, 0);
1555 expr_init(e, VNONRELOC, freg);
1556 bcreg_reserve(fs, 1);
1557 freg++;
1558 lex_check(ls, '{');
1559 while (ls->token != '}') {
1560 ExpDesc key, val;
1561 vcall = 0;
1562 if (ls->token == '[') {
1563 expr_bracket(ls, &key); /* Already calls expr_toval. */
1564 if (!expr_isk(&key)) expr_index(fs, e, &key);
1565 if (expr_isnumk(&key) && expr_numiszero(&key)) needarr = 1; else nhash++;
1566 lex_check(ls, '=');
1567 } else if (ls->token == TK_name && lj_lex_lookahead(ls) == '=') {
1568 expr_str(ls, &key);
1569 lex_check(ls, '=');
1570 nhash++;
1571 } else {
1572 expr_init(&key, VKNUM, 0);
1573 setintV(&key.u.nval, (int)narr);
1574 narr++;
1575 needarr = vcall = 1;
1577 expr(ls, &val);
1578 if (expr_isk(&key) && key.k != VKNIL &&
1579 (key.k == VKSTR || expr_isk_nojump(&val))) {
1580 TValue k, *v;
1581 if (!t) { /* Create template table on demand. */
1582 BCReg kidx;
1583 t = lj_tab_new(fs->L, narr, hsize2hbits(nhash));
1584 kidx = const_gc(fs, obj2gco(t), LJ_TTAB);
1585 fs->bcbase[pc].ins = BCINS_AD(BC_TDUP, freg-1, kidx);
1587 vcall = 0;
1588 expr_kvalue(&k, &key);
1589 v = lj_tab_set(fs->L, t, &k);
1590 lj_gc_anybarriert(fs->L, t);
1591 if (expr_isk_nojump(&val)) { /* Add const key/value to template table. */
1592 expr_kvalue(v, &val);
1593 } else { /* Otherwise create dummy string key (avoids lj_tab_newkey). */
1594 settabV(fs->L, v, t); /* Preserve key with table itself as value. */
1595 fixt = 1; /* Fix this later, after all resizes. */
1596 goto nonconst;
1598 } else {
1599 nonconst:
1600 if (val.k != VCALL) { expr_toanyreg(fs, &val); vcall = 0; }
1601 if (expr_isk(&key)) expr_index(fs, e, &key);
1602 bcemit_store(fs, e, &val);
1604 fs->freereg = freg;
1605 if (!lex_opt(ls, ',') && !lex_opt(ls, ';')) break;
1607 lex_match(ls, '}', '{', line);
1608 if (vcall) {
1609 BCInsLine *ilp = &fs->bcbase[fs->pc-1];
1610 ExpDesc en;
1611 lua_assert(bc_a(ilp->ins) == freg &&
1612 bc_op(ilp->ins) == (narr > 256 ? BC_TSETV : BC_TSETB));
1613 expr_init(&en, VKNUM, 0);
1614 en.u.nval.u32.lo = narr-1;
1615 en.u.nval.u32.hi = 0x43300000; /* Biased integer to avoid denormals. */
1616 if (narr > 256) { fs->pc--; ilp--; }
1617 ilp->ins = BCINS_AD(BC_TSETM, freg, const_num(fs, &en));
1618 setbc_b(&ilp[-1].ins, 0);
1620 if (pc == fs->pc-1) { /* Make expr relocable if possible. */
1621 e->u.s.info = pc;
1622 fs->freereg--;
1623 e->k = VRELOCABLE;
1624 } else {
1625 e->k = VNONRELOC; /* May have been changed by expr_index. */
1627 if (!t) { /* Construct TNEW RD: hhhhhaaaaaaaaaaa. */
1628 BCIns *ip = &fs->bcbase[pc].ins;
1629 if (!needarr) narr = 0;
1630 else if (narr < 3) narr = 3;
1631 else if (narr > 0x7ff) narr = 0x7ff;
1632 setbc_d(ip, narr|(hsize2hbits(nhash)<<11));
1633 } else {
1634 if (needarr && t->asize < narr)
1635 lj_tab_reasize(fs->L, t, narr-1);
1636 if (fixt) { /* Fix value for dummy keys in template table. */
1637 Node *node = noderef(t->node);
1638 uint32_t i, hmask = t->hmask;
1639 for (i = 0; i <= hmask; i++) {
1640 Node *n = &node[i];
1641 if (tvistab(&n->val)) {
1642 lua_assert(tabV(&n->val) == t);
1643 setnilV(&n->val); /* Turn value into nil. */
1650 /* Parse function parameters. */
1651 static BCReg parse_params(LexState *ls, int needself)
1653 FuncState *fs = ls->fs;
1654 BCReg nparams = 0;
1655 lex_check(ls, '(');
1656 if (needself)
1657 var_new_lit(ls, nparams++, "self");
1658 if (ls->token != ')') {
1659 do {
1660 if (ls->token == TK_name) {
1661 var_new(ls, nparams++, lex_str(ls));
1662 } else if (ls->token == TK_dots) {
1663 lj_lex_next(ls);
1664 fs->flags |= PROTO_VARARG;
1665 break;
1666 } else {
1667 err_syntax(ls, LJ_ERR_XPARAM);
1669 } while (lex_opt(ls, ','));
1671 var_add(ls, nparams);
1672 lua_assert(fs->nactvar == nparams);
1673 bcreg_reserve(fs, nparams);
1674 lex_check(ls, ')');
1675 return nparams;
1678 /* Forward declaration. */
1679 static void parse_chunk(LexState *ls);
1681 /* Parse body of a function. */
1682 static void parse_body(LexState *ls, ExpDesc *e, int needself, BCLine line)
1684 FuncState fs, *pfs = ls->fs;
1685 GCproto *pt;
1686 ptrdiff_t oldbase = pfs->bcbase - ls->bcstack;
1687 fs_init(ls, &fs);
1688 fs.linedefined = line;
1689 fs.numparams = (uint8_t)parse_params(ls, needself);
1690 fs.bcbase = pfs->bcbase + pfs->pc;
1691 fs.bclim = pfs->bclim - pfs->pc;
1692 bcemit_AD(&fs, BC_FUNCF, 0, 0); /* Placeholder. */
1693 parse_chunk(ls);
1694 if (ls->token != TK_end) lex_match(ls, TK_end, TK_function, line);
1695 pt = fs_finish(ls, (ls->lastline = ls->linenumber));
1696 pfs->bcbase = ls->bcstack + oldbase; /* May have been reallocated. */
1697 pfs->bclim = (BCPos)(ls->sizebcstack - oldbase);
1698 /* Store new prototype in the constant array of the parent. */
1699 expr_init(e, VRELOCABLE,
1700 bcemit_AD(pfs, BC_FNEW, 0, const_gc(pfs, obj2gco(pt), LJ_TPROTO)));
1701 #if LJ_HASFFI
1702 pfs->flags |= (fs.flags & PROTO_FFI);
1703 #endif
1704 if (!(pfs->flags & PROTO_CHILD)) {
1705 if (pfs->flags & PROTO_HAS_RETURN)
1706 pfs->flags |= PROTO_FIXUP_RETURN;
1707 pfs->flags |= PROTO_CHILD;
1709 lj_lex_next(ls);
1712 /* Parse expression list. Last expression is left open. */
1713 static BCReg expr_list(LexState *ls, ExpDesc *v)
1715 BCReg n = 1;
1716 expr(ls, v);
1717 while (lex_opt(ls, ',')) {
1718 expr_tonextreg(ls->fs, v);
1719 expr(ls, v);
1720 n++;
1722 return n;
1725 /* Parse function argument list. */
1726 static void parse_args(LexState *ls, ExpDesc *e)
1728 FuncState *fs = ls->fs;
1729 ExpDesc args;
1730 BCIns ins;
1731 BCReg base;
1732 BCLine line = ls->linenumber;
1733 if (ls->token == '(') {
1734 if (line != ls->lastline)
1735 err_syntax(ls, LJ_ERR_XAMBIG);
1736 lj_lex_next(ls);
1737 if (ls->token == ')') { /* f(). */
1738 args.k = VVOID;
1739 } else {
1740 expr_list(ls, &args);
1741 if (args.k == VCALL) /* f(a, b, g()) or f(a, b, ...). */
1742 setbc_b(bcptr(fs, &args), 0); /* Pass on multiple results. */
1744 lex_match(ls, ')', '(', line);
1745 } else if (ls->token == '{') {
1746 expr_table(ls, &args);
1747 } else if (ls->token == TK_string) {
1748 expr_init(&args, VKSTR, 0);
1749 args.u.sval = strV(&ls->tokenval);
1750 lj_lex_next(ls);
1751 } else {
1752 err_syntax(ls, LJ_ERR_XFUNARG);
1753 return; /* Silence compiler. */
1755 lua_assert(e->k == VNONRELOC);
1756 base = e->u.s.info; /* Base register for call. */
1757 if (args.k == VCALL) {
1758 ins = BCINS_ABC(BC_CALLM, base, 2, args.u.s.aux - base - 1);
1759 } else {
1760 if (args.k != VVOID)
1761 expr_tonextreg(fs, &args);
1762 ins = BCINS_ABC(BC_CALL, base, 2, fs->freereg - base);
1764 expr_init(e, VCALL, bcemit_INS(fs, ins));
1765 e->u.s.aux = base;
1766 fs->bcbase[fs->pc - 1].line = line;
1767 fs->freereg = base+1; /* Leave one result by default. */
1770 /* Parse primary expression. */
1771 static void expr_primary(LexState *ls, ExpDesc *v)
1773 FuncState *fs = ls->fs;
1774 /* Parse prefix expression. */
1775 if (ls->token == '(') {
1776 BCLine line = ls->linenumber;
1777 lj_lex_next(ls);
1778 expr(ls, v);
1779 lex_match(ls, ')', '(', line);
1780 expr_discharge(ls->fs, v);
1781 } else if (ls->token == TK_name) {
1782 var_lookup(ls, v);
1783 } else {
1784 err_syntax(ls, LJ_ERR_XSYMBOL);
1786 for (;;) { /* Parse multiple expression suffixes. */
1787 if (ls->token == '.') {
1788 expr_field(ls, v);
1789 } else if (ls->token == '[') {
1790 ExpDesc key;
1791 expr_toanyreg(fs, v);
1792 expr_bracket(ls, &key);
1793 expr_index(fs, v, &key);
1794 } else if (ls->token == ':') {
1795 ExpDesc key;
1796 lj_lex_next(ls);
1797 expr_str(ls, &key);
1798 bcemit_method(fs, v, &key);
1799 parse_args(ls, v);
1800 } else if (ls->token == '(' || ls->token == TK_string || ls->token == '{') {
1801 expr_tonextreg(fs, v);
1802 parse_args(ls, v);
1803 } else {
1804 break;
1809 /* Parse simple expression. */
1810 static void expr_simple(LexState *ls, ExpDesc *v)
1812 switch (ls->token) {
1813 case TK_number:
1814 expr_init(v, (LJ_HASFFI && tviscdata(&ls->tokenval)) ? VKCDATA : VKNUM, 0);
1815 copyTV(ls->L, &v->u.nval, &ls->tokenval);
1816 break;
1817 case TK_string:
1818 expr_init(v, VKSTR, 0);
1819 v->u.sval = strV(&ls->tokenval);
1820 break;
1821 case TK_nil:
1822 expr_init(v, VKNIL, 0);
1823 break;
1824 case TK_true:
1825 expr_init(v, VKTRUE, 0);
1826 break;
1827 case TK_false:
1828 expr_init(v, VKFALSE, 0);
1829 break;
1830 case TK_dots: { /* Vararg. */
1831 FuncState *fs = ls->fs;
1832 BCReg base;
1833 checkcond(ls, fs->flags & PROTO_VARARG, LJ_ERR_XDOTS);
1834 bcreg_reserve(fs, 1);
1835 base = fs->freereg-1;
1836 expr_init(v, VCALL, bcemit_ABC(fs, BC_VARG, base, 2, fs->numparams));
1837 v->u.s.aux = base;
1838 break;
1840 case '{': /* Table constructor. */
1841 expr_table(ls, v);
1842 return;
1843 case TK_function:
1844 lj_lex_next(ls);
1845 parse_body(ls, v, 0, ls->linenumber);
1846 return;
1847 default:
1848 expr_primary(ls, v);
1849 return;
1851 lj_lex_next(ls);
1854 /* Manage syntactic levels to avoid blowing up the stack. */
1855 static void synlevel_begin(LexState *ls)
1857 if (++ls->level >= LJ_MAX_XLEVEL)
1858 lj_lex_error(ls, 0, LJ_ERR_XLEVELS);
1861 #define synlevel_end(ls) ((ls)->level--)
1863 /* Convert token to binary operator. */
1864 static BinOpr token2binop(LexToken tok)
1866 switch (tok) {
1867 case '+': return OPR_ADD;
1868 case '-': return OPR_SUB;
1869 case '*': return OPR_MUL;
1870 case '/': return OPR_DIV;
1871 case '%': return OPR_MOD;
1872 case '^': return OPR_POW;
1873 case TK_concat: return OPR_CONCAT;
1874 case TK_ne: return OPR_NE;
1875 case TK_eq: return OPR_EQ;
1876 case '<': return OPR_LT;
1877 case TK_le: return OPR_LE;
1878 case '>': return OPR_GT;
1879 case TK_ge: return OPR_GE;
1880 case TK_and: return OPR_AND;
1881 case TK_or: return OPR_OR;
1882 default: return OPR_NOBINOPR;
1886 /* Priorities for each binary operator. ORDER OPR. */
1887 static const struct {
1888 uint8_t left; /* Left priority. */
1889 uint8_t right; /* Right priority. */
1890 } priority[] = {
1891 {6,6}, {6,6}, {7,7}, {7,7}, {7,7}, /* ADD SUB MUL DIV MOD */
1892 {10,9}, {5,4}, /* POW CONCAT (right associative) */
1893 {3,3}, {3,3}, /* EQ NE */
1894 {3,3}, {3,3}, {3,3}, {3,3}, /* LT GE GT LE */
1895 {2,2}, {1,1} /* AND OR */
1898 #define UNARY_PRIORITY 8 /* Priority for unary operators. */
1900 /* Forward declaration. */
1901 static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit);
1903 /* Parse unary expression. */
1904 static void expr_unop(LexState *ls, ExpDesc *v)
1906 BCOp op;
1907 if (ls->token == TK_not) {
1908 op = BC_NOT;
1909 } else if (ls->token == '-') {
1910 op = BC_UNM;
1911 } else if (ls->token == '#') {
1912 op = BC_LEN;
1913 } else {
1914 expr_simple(ls, v);
1915 return;
1917 lj_lex_next(ls);
1918 expr_binop(ls, v, UNARY_PRIORITY);
1919 bcemit_unop(ls->fs, op, v);
1922 /* Parse binary expressions with priority higher than the limit. */
1923 static BinOpr expr_binop(LexState *ls, ExpDesc *v, uint32_t limit)
1925 BinOpr op;
1926 synlevel_begin(ls);
1927 expr_unop(ls, v);
1928 op = token2binop(ls->token);
1929 while (op != OPR_NOBINOPR && priority[op].left > limit) {
1930 ExpDesc v2;
1931 BinOpr nextop;
1932 lj_lex_next(ls);
1933 bcemit_binop_left(ls->fs, op, v);
1934 /* Parse binary expression with higher priority. */
1935 nextop = expr_binop(ls, &v2, priority[op].right);
1936 bcemit_binop(ls->fs, op, v, &v2);
1937 op = nextop;
1939 synlevel_end(ls);
1940 return op; /* Return unconsumed binary operator (if any). */
1943 /* Parse expression. */
1944 static void expr(LexState *ls, ExpDesc *v)
1946 expr_binop(ls, v, 0); /* Priority 0: parse whole expression. */
1949 /* Assign expression to the next register. */
1950 static void expr_next(LexState *ls)
1952 ExpDesc e;
1953 expr(ls, &e);
1954 expr_tonextreg(ls->fs, &e);
1957 /* Parse conditional expression. */
1958 static BCPos expr_cond(LexState *ls)
1960 ExpDesc v;
1961 expr(ls, &v);
1962 if (v.k == VKNIL) v.k = VKFALSE;
1963 bcemit_branch_t(ls->fs, &v);
1964 return v.f;
1967 /* -- Scope handling ------------------------------------------------------ */
1969 /* Begin a scope. */
1970 static void scope_begin(FuncState *fs, FuncScope *bl, int isbreakable)
1972 bl->breaklist = NO_JMP;
1973 bl->isbreakable = (uint8_t)isbreakable;
1974 bl->nactvar = (uint8_t)fs->nactvar;
1975 bl->upval = 0;
1976 bl->prev = fs->bl;
1977 fs->bl = bl;
1978 lua_assert(fs->freereg == fs->nactvar);
1981 /* End a scope. */
1982 static void scope_end(FuncState *fs)
1984 FuncScope *bl = fs->bl;
1985 fs->bl = bl->prev;
1986 var_remove(fs->ls, bl->nactvar);
1987 fs->freereg = fs->nactvar;
1988 lua_assert(bl->nactvar == fs->nactvar);
1989 /* A scope is either breakable or has upvalues. */
1990 lua_assert(!bl->isbreakable || !bl->upval);
1991 if (bl->upval)
1992 bcemit_AJ(fs, BC_UCLO, bl->nactvar, 0);
1993 else /* Avoid in upval case, it clears lasttarget and kills UCLO+JMP join. */
1994 jmp_tohere(fs, bl->breaklist);
1997 /* Mark scope as having an upvalue. */
1998 static void scope_uvmark(FuncState *fs, BCReg level)
2000 FuncScope *bl;
2001 for (bl = fs->bl; bl && bl->nactvar > level; bl = bl->prev)
2003 if (bl)
2004 bl->upval = 1;
2007 /* Parse 'break' statement. */
2008 static void parse_break(LexState *ls)
2010 FuncState *fs = ls->fs;
2011 FuncScope *bl;
2012 BCReg savefr;
2013 int upval = 0;
2014 for (bl = fs->bl; bl && !bl->isbreakable; bl = bl->prev)
2015 upval |= bl->upval; /* Collect upvalues in intervening scopes. */
2016 if (!bl) /* Error if no breakable scope found. */
2017 err_syntax(ls, LJ_ERR_XBREAK);
2018 savefr = fs->freereg;
2019 fs->freereg = bl->nactvar; /* Shrink slots to help data-flow analysis. */
2020 if (upval)
2021 bcemit_AJ(fs, BC_UCLO, bl->nactvar, 0); /* Close upvalues. */
2022 jmp_append(fs, &bl->breaklist, bcemit_jmp(fs));
2023 fs->freereg = savefr;
2026 /* Check for end of block. */
2027 static int endofblock(LexToken token)
2029 switch (token) {
2030 case TK_else: case TK_elseif: case TK_end: case TK_until: case TK_eof:
2031 return 1;
2032 default:
2033 return 0;
2037 /* Parse 'return' statement. */
2038 static void parse_return(LexState *ls)
2040 BCIns ins;
2041 FuncState *fs = ls->fs;
2042 lj_lex_next(ls); /* Skip 'return'. */
2043 fs->flags |= PROTO_HAS_RETURN;
2044 if (endofblock(ls->token) || ls->token == ';') { /* Bare return. */
2045 ins = BCINS_AD(BC_RET0, 0, 1);
2046 } else { /* Return with one or more values. */
2047 ExpDesc e; /* Receives the _last_ expression in the list. */
2048 BCReg nret = expr_list(ls, &e);
2049 if (nret == 1) { /* Return one result. */
2050 if (e.k == VCALL) { /* Check for tail call. */
2051 BCIns *ip = bcptr(fs, &e);
2052 /* It doesn't pay off to add BC_VARGT just for 'return ...'. */
2053 if (bc_op(*ip) == BC_VARG) goto notailcall;
2054 fs->pc--;
2055 ins = BCINS_AD(bc_op(*ip)-BC_CALL+BC_CALLT, bc_a(*ip), bc_c(*ip));
2056 } else { /* Can return the result from any register. */
2057 ins = BCINS_AD(BC_RET1, expr_toanyreg(fs, &e), 2);
2059 } else {
2060 if (e.k == VCALL) { /* Append all results from a call. */
2061 notailcall:
2062 setbc_b(bcptr(fs, &e), 0);
2063 ins = BCINS_AD(BC_RETM, fs->nactvar, e.u.s.aux - fs->nactvar);
2064 } else {
2065 expr_tonextreg(fs, &e); /* Force contiguous registers. */
2066 ins = BCINS_AD(BC_RET, fs->nactvar, nret+1);
2070 if (fs->flags & PROTO_CHILD)
2071 bcemit_AJ(fs, BC_UCLO, 0, 0); /* May need to close upvalues first. */
2072 bcemit_INS(fs, ins);
2075 /* Parse a block. */
2076 static void parse_block(LexState *ls)
2078 FuncState *fs = ls->fs;
2079 FuncScope bl;
2080 scope_begin(fs, &bl, 0);
2081 parse_chunk(ls);
2082 lua_assert(bl.breaklist == NO_JMP);
2083 scope_end(fs);
2086 /* -- Assignments --------------------------------------------------------- */
2088 /* List of LHS variables. */
2089 typedef struct LHSVarList {
2090 ExpDesc v; /* LHS variable. */
2091 struct LHSVarList *prev; /* Link to previous LHS variable. */
2092 } LHSVarList;
2094 /* Eliminate write-after-read hazards for local variable assignment. */
2095 static void assign_hazard(LexState *ls, LHSVarList *lh, const ExpDesc *v)
2097 FuncState *fs = ls->fs;
2098 BCReg reg = v->u.s.info; /* Check against this variable. */
2099 BCReg tmp = fs->freereg; /* Rename to this temp. register (if needed). */
2100 int hazard = 0;
2101 for (; lh; lh = lh->prev) {
2102 if (lh->v.k == VINDEXED) {
2103 if (lh->v.u.s.info == reg) { /* t[i], t = 1, 2 */
2104 hazard = 1;
2105 lh->v.u.s.info = tmp;
2107 if (lh->v.u.s.aux == reg) { /* t[i], i = 1, 2 */
2108 hazard = 1;
2109 lh->v.u.s.aux = tmp;
2113 if (hazard) {
2114 bcemit_AD(fs, BC_MOV, tmp, reg); /* Rename conflicting variable. */
2115 bcreg_reserve(fs, 1);
2119 /* Adjust LHS/RHS of an assignment. */
2120 static void assign_adjust(LexState *ls, BCReg nvars, BCReg nexps, ExpDesc *e)
2122 FuncState *fs = ls->fs;
2123 int32_t extra = (int32_t)nvars - (int32_t)nexps;
2124 if (e->k == VCALL) {
2125 extra++; /* Compensate for the VCALL itself. */
2126 if (extra < 0) extra = 0;
2127 setbc_b(bcptr(fs, e), extra+1); /* Fixup call results. */
2128 if (extra > 1) bcreg_reserve(fs, (BCReg)extra-1);
2129 } else {
2130 if (e->k != VVOID)
2131 expr_tonextreg(fs, e); /* Close last expression. */
2132 if (extra > 0) { /* Leftover LHS are set to nil. */
2133 BCReg reg = fs->freereg;
2134 bcreg_reserve(fs, (BCReg)extra);
2135 bcemit_nil(fs, reg, (BCReg)extra);
2140 /* Recursively parse assignment statement. */
2141 static void parse_assignment(LexState *ls, LHSVarList *lh, BCReg nvars)
2143 ExpDesc e;
2144 checkcond(ls, VLOCAL <= lh->v.k && lh->v.k <= VINDEXED, LJ_ERR_XSYNTAX);
2145 if (lex_opt(ls, ',')) { /* Collect LHS list and recurse upwards. */
2146 LHSVarList vl;
2147 vl.prev = lh;
2148 expr_primary(ls, &vl.v);
2149 if (vl.v.k == VLOCAL)
2150 assign_hazard(ls, lh, &vl.v);
2151 checklimit(ls->fs, ls->level + nvars, LJ_MAX_XLEVEL, "variable names");
2152 parse_assignment(ls, &vl, nvars+1);
2153 } else { /* Parse RHS. */
2154 BCReg nexps;
2155 lex_check(ls, '=');
2156 nexps = expr_list(ls, &e);
2157 if (nexps == nvars) {
2158 if (e.k == VCALL) {
2159 if (bc_op(*bcptr(ls->fs, &e)) == BC_VARG) { /* Vararg assignment. */
2160 ls->fs->freereg--;
2161 e.k = VRELOCABLE;
2162 } else { /* Multiple call results. */
2163 e.u.s.info = e.u.s.aux; /* Base of call is not relocatable. */
2164 e.k = VNONRELOC;
2167 bcemit_store(ls->fs, &lh->v, &e);
2168 return;
2170 assign_adjust(ls, nvars, nexps, &e);
2171 if (nexps > nvars)
2172 ls->fs->freereg -= nexps - nvars; /* Drop leftover regs. */
2174 /* Assign RHS to LHS and recurse downwards. */
2175 expr_init(&e, VNONRELOC, ls->fs->freereg-1);
2176 bcemit_store(ls->fs, &lh->v, &e);
2179 /* Parse call statement or assignment. */
2180 static void parse_call_assign(LexState *ls)
2182 FuncState *fs = ls->fs;
2183 LHSVarList vl;
2184 expr_primary(ls, &vl.v);
2185 if (vl.v.k == VCALL) { /* Function call statement. */
2186 setbc_b(bcptr(fs, &vl.v), 1); /* No results. */
2187 } else { /* Start of an assignment. */
2188 vl.prev = NULL;
2189 parse_assignment(ls, &vl, 1);
2193 /* Parse 'local' statement. */
2194 static void parse_local(LexState *ls)
2196 if (lex_opt(ls, TK_function)) { /* Local function declaration. */
2197 ExpDesc v, b;
2198 FuncState *fs = ls->fs;
2199 var_new(ls, 0, lex_str(ls));
2200 expr_init(&v, VLOCAL, fs->freereg);
2201 v.u.s.aux = fs->varmap[fs->freereg];
2202 bcreg_reserve(fs, 1);
2203 var_add(ls, 1);
2204 parse_body(ls, &b, 0, ls->linenumber);
2205 bcemit_store(fs, &v, &b);
2206 /* The upvalue is in scope, but the local is only valid after the store. */
2207 var_get(ls, fs, fs->nactvar - 1).startpc = fs->pc;
2208 } else { /* Local variable declaration. */
2209 ExpDesc e;
2210 BCReg nexps, nvars = 0;
2211 do { /* Collect LHS. */
2212 var_new(ls, nvars++, lex_str(ls));
2213 } while (lex_opt(ls, ','));
2214 if (lex_opt(ls, '=')) { /* Optional RHS. */
2215 nexps = expr_list(ls, &e);
2216 } else { /* Or implicitly set to nil. */
2217 e.k = VVOID;
2218 nexps = 0;
2220 assign_adjust(ls, nvars, nexps, &e);
2221 var_add(ls, nvars);
2225 /* Parse 'function' statement. */
2226 static void parse_func(LexState *ls, BCLine line)
2228 FuncState *fs;
2229 ExpDesc v, b;
2230 int needself = 0;
2231 lj_lex_next(ls); /* Skip 'function'. */
2232 /* Parse function name. */
2233 var_lookup(ls, &v);
2234 while (ls->token == '.') /* Multiple dot-separated fields. */
2235 expr_field(ls, &v);
2236 if (ls->token == ':') { /* Optional colon to signify method call. */
2237 needself = 1;
2238 expr_field(ls, &v);
2240 parse_body(ls, &b, needself, line);
2241 fs = ls->fs;
2242 bcemit_store(fs, &v, &b);
2243 fs->bcbase[fs->pc - 1].line = line; /* Set line for the store. */
2246 /* -- Loop and conditional statements ------------------------------------- */
2248 /* Parse 'while' statement. */
2249 static void parse_while(LexState *ls, BCLine line)
2251 FuncState *fs = ls->fs;
2252 BCPos start, loop, condexit;
2253 FuncScope bl;
2254 lj_lex_next(ls); /* Skip 'while'. */
2255 start = fs->lasttarget = fs->pc;
2256 condexit = expr_cond(ls);
2257 scope_begin(fs, &bl, 1);
2258 lex_check(ls, TK_do);
2259 loop = bcemit_AD(fs, BC_LOOP, fs->nactvar, 0);
2260 parse_block(ls);
2261 jmp_patch(fs, bcemit_jmp(fs), start);
2262 lex_match(ls, TK_end, TK_while, line);
2263 scope_end(fs);
2264 jmp_tohere(fs, condexit);
2265 jmp_patchins(fs, loop, fs->pc);
2268 /* Parse 'repeat' statement. */
2269 static void parse_repeat(LexState *ls, BCLine line)
2271 FuncState *fs = ls->fs;
2272 BCPos loop = fs->lasttarget = fs->pc;
2273 BCPos condexit;
2274 FuncScope bl1, bl2;
2275 scope_begin(fs, &bl1, 1); /* Breakable loop scope. */
2276 scope_begin(fs, &bl2, 0); /* Inner scope. */
2277 lj_lex_next(ls); /* Skip 'repeat'. */
2278 bcemit_AD(fs, BC_LOOP, fs->nactvar, 0);
2279 parse_chunk(ls);
2280 lex_match(ls, TK_until, TK_repeat, line);
2281 condexit = expr_cond(ls); /* Parse condition (still inside inner scope). */
2282 if (!bl2.upval) { /* No upvalues? Just end inner scope. */
2283 scope_end(fs);
2284 } else { /* Otherwise generate: cond: UCLO+JMP out, !cond: UCLO+JMP loop. */
2285 parse_break(ls); /* Break from loop and close upvalues. */
2286 jmp_tohere(fs, condexit);
2287 scope_end(fs); /* End inner scope and close upvalues. */
2288 condexit = bcemit_jmp(fs);
2290 jmp_patch(fs, condexit, loop); /* Jump backwards if !cond. */
2291 jmp_patchins(fs, loop, fs->pc);
2292 scope_end(fs); /* End loop scope. */
2295 /* Parse numeric 'for'. */
2296 static void parse_for_num(LexState *ls, GCstr *varname, BCLine line)
2298 FuncState *fs = ls->fs;
2299 BCReg base = fs->freereg;
2300 FuncScope bl;
2301 BCPos loop, loopend;
2302 /* Hidden control variables. */
2303 var_new_fixed(ls, FORL_IDX, VARNAME_FOR_IDX);
2304 var_new_fixed(ls, FORL_STOP, VARNAME_FOR_STOP);
2305 var_new_fixed(ls, FORL_STEP, VARNAME_FOR_STEP);
2306 /* Visible copy of index variable. */
2307 var_new(ls, FORL_EXT, varname);
2308 lex_check(ls, '=');
2309 expr_next(ls);
2310 lex_check(ls, ',');
2311 expr_next(ls);
2312 if (lex_opt(ls, ',')) {
2313 expr_next(ls);
2314 } else {
2315 bcemit_AD(fs, BC_KSHORT, fs->freereg, 1); /* Default step is 1. */
2316 bcreg_reserve(fs, 1);
2318 var_add(ls, 3); /* Hidden control variables. */
2319 lex_check(ls, TK_do);
2320 loop = bcemit_AJ(fs, BC_FORI, base, NO_JMP);
2321 scope_begin(fs, &bl, 0); /* Scope for visible variables. */
2322 var_add(ls, 1);
2323 bcreg_reserve(fs, 1);
2324 parse_block(ls);
2325 scope_end(fs);
2326 /* Perform loop inversion. Loop control instructions are at the end. */
2327 loopend = bcemit_AJ(fs, BC_FORL, base, NO_JMP);
2328 fs->bcbase[loopend].line = line; /* Fix line for control ins. */
2329 jmp_patchins(fs, loopend, loop+1);
2330 jmp_patchins(fs, loop, fs->pc);
2333 /* Try to predict whether the iterator is next() and specialize the bytecode.
2334 ** Detecting next() and pairs() by name is simplistic, but quite effective.
2335 ** The interpreter backs off if the check for the closure fails at runtime.
2337 static int predict_next(LexState *ls, FuncState *fs, BCPos pc)
2339 BCIns ins = fs->bcbase[pc].ins;
2340 GCstr *name;
2341 cTValue *o;
2342 switch (bc_op(ins)) {
2343 case BC_MOV:
2344 name = gco2str(gcref(var_get(ls, fs, bc_d(ins)).name));
2345 break;
2346 case BC_UGET:
2347 name = gco2str(gcref(ls->vstack[fs->uvloc[bc_d(ins)].vidx].name));
2348 break;
2349 case BC_GGET:
2350 /* There's no inverse index (yet), so lookup the strings. */
2351 o = lj_tab_getstr(fs->kt, lj_str_newlit(ls->L, "pairs"));
2352 if (o && tvhaskslot(o) && tvkslot(o) == bc_d(ins))
2353 return 1;
2354 o = lj_tab_getstr(fs->kt, lj_str_newlit(ls->L, "next"));
2355 if (o && tvhaskslot(o) && tvkslot(o) == bc_d(ins))
2356 return 1;
2357 return 0;
2358 default:
2359 return 0;
2361 return (name->len == 5 && !strcmp(strdata(name), "pairs")) ||
2362 (name->len == 4 && !strcmp(strdata(name), "next"));
2365 /* Parse 'for' iterator. */
2366 static void parse_for_iter(LexState *ls, GCstr *indexname)
2368 FuncState *fs = ls->fs;
2369 ExpDesc e;
2370 BCReg nvars = 0;
2371 BCLine line;
2372 BCReg base = fs->freereg + 3;
2373 BCPos loop, loopend, exprpc = fs->pc;
2374 FuncScope bl;
2375 int isnext;
2376 /* Hidden control variables. */
2377 var_new_fixed(ls, nvars++, VARNAME_FOR_GEN);
2378 var_new_fixed(ls, nvars++, VARNAME_FOR_STATE);
2379 var_new_fixed(ls, nvars++, VARNAME_FOR_CTL);
2380 /* Visible variables returned from iterator. */
2381 var_new(ls, nvars++, indexname);
2382 while (lex_opt(ls, ','))
2383 var_new(ls, nvars++, lex_str(ls));
2384 lex_check(ls, TK_in);
2385 line = ls->linenumber;
2386 assign_adjust(ls, 3, expr_list(ls, &e), &e);
2387 bcreg_bump(fs, 3); /* The iterator needs another 3 slots (func + 2 args). */
2388 isnext = (nvars <= 5 && predict_next(ls, fs, exprpc));
2389 var_add(ls, 3); /* Hidden control variables. */
2390 lex_check(ls, TK_do);
2391 loop = bcemit_AJ(fs, isnext ? BC_ISNEXT : BC_JMP, base, NO_JMP);
2392 scope_begin(fs, &bl, 0); /* Scope for visible variables. */
2393 var_add(ls, nvars-3);
2394 bcreg_reserve(fs, nvars-3);
2395 parse_block(ls);
2396 scope_end(fs);
2397 /* Perform loop inversion. Loop control instructions are at the end. */
2398 jmp_patchins(fs, loop, fs->pc);
2399 bcemit_ABC(fs, isnext ? BC_ITERN : BC_ITERC, base, nvars-3+1, 2+1);
2400 loopend = bcemit_AJ(fs, BC_ITERL, base, NO_JMP);
2401 fs->bcbase[loopend-1].line = line; /* Fix line for control ins. */
2402 fs->bcbase[loopend].line = line;
2403 jmp_patchins(fs, loopend, loop+1);
2406 /* Parse 'for' statement. */
2407 static void parse_for(LexState *ls, BCLine line)
2409 FuncState *fs = ls->fs;
2410 GCstr *varname;
2411 FuncScope bl;
2412 scope_begin(fs, &bl, 1); /* Breakable loop scope. */
2413 lj_lex_next(ls); /* Skip 'for'. */
2414 varname = lex_str(ls); /* Get first variable name. */
2415 if (ls->token == '=')
2416 parse_for_num(ls, varname, line);
2417 else if (ls->token == ',' || ls->token == TK_in)
2418 parse_for_iter(ls, varname);
2419 else
2420 err_syntax(ls, LJ_ERR_XFOR);
2421 lex_match(ls, TK_end, TK_for, line);
2422 scope_end(fs); /* Resolve break list. */
2425 /* Parse condition and 'then' block. */
2426 static BCPos parse_then(LexState *ls)
2428 BCPos condexit;
2429 lj_lex_next(ls); /* Skip 'if' or 'elseif'. */
2430 condexit = expr_cond(ls);
2431 lex_check(ls, TK_then);
2432 parse_block(ls);
2433 return condexit;
2436 /* Parse 'if' statement. */
2437 static void parse_if(LexState *ls, BCLine line)
2439 FuncState *fs = ls->fs;
2440 BCPos flist;
2441 BCPos escapelist = NO_JMP;
2442 flist = parse_then(ls);
2443 while (ls->token == TK_elseif) { /* Parse multiple 'elseif' blocks. */
2444 jmp_append(fs, &escapelist, bcemit_jmp(fs));
2445 jmp_tohere(fs, flist);
2446 flist = parse_then(ls);
2448 if (ls->token == TK_else) { /* Parse optional 'else' block. */
2449 jmp_append(fs, &escapelist, bcemit_jmp(fs));
2450 jmp_tohere(fs, flist);
2451 lj_lex_next(ls); /* Skip 'else'. */
2452 parse_block(ls);
2453 } else {
2454 jmp_append(fs, &escapelist, flist);
2456 jmp_tohere(fs, escapelist);
2457 lex_match(ls, TK_end, TK_if, line);
2460 /* -- Parse statements ---------------------------------------------------- */
2462 /* Parse a statement. Returns 1 if it must be the last one in a chunk. */
2463 static int parse_stmt(LexState *ls)
2465 BCLine line = ls->linenumber;
2466 switch (ls->token) {
2467 case TK_if:
2468 parse_if(ls, line);
2469 break;
2470 case TK_while:
2471 parse_while(ls, line);
2472 break;
2473 case TK_do:
2474 lj_lex_next(ls);
2475 parse_block(ls);
2476 lex_match(ls, TK_end, TK_do, line);
2477 break;
2478 case TK_for:
2479 parse_for(ls, line);
2480 break;
2481 case TK_repeat:
2482 parse_repeat(ls, line);
2483 break;
2484 case TK_function:
2485 parse_func(ls, line);
2486 break;
2487 case TK_local:
2488 lj_lex_next(ls);
2489 parse_local(ls);
2490 break;
2491 case TK_return:
2492 parse_return(ls);
2493 return 1; /* Must be last. */
2494 case TK_break:
2495 lj_lex_next(ls);
2496 parse_break(ls);
2497 return 1; /* Must be last. */
2498 #ifdef LUAJIT_ENABLE_LUA52COMPAT
2499 case ';':
2500 lj_lex_next(ls);
2501 break;
2502 #endif
2503 default:
2504 parse_call_assign(ls);
2505 break;
2507 return 0;
2510 /* A chunk is a list of statements optionally separated by semicolons. */
2511 static void parse_chunk(LexState *ls)
2513 int islast = 0;
2514 synlevel_begin(ls);
2515 while (!islast && !endofblock(ls->token)) {
2516 islast = parse_stmt(ls);
2517 lex_opt(ls, ';');
2518 lua_assert(ls->fs->framesize >= ls->fs->freereg &&
2519 ls->fs->freereg >= ls->fs->nactvar);
2520 ls->fs->freereg = ls->fs->nactvar; /* Free registers after each stmt. */
2522 synlevel_end(ls);
2525 /* Entry point of bytecode parser. */
2526 GCproto *lj_parse(LexState *ls)
2528 FuncState fs;
2529 GCproto *pt;
2530 lua_State *L = ls->L;
2531 #ifdef LUAJIT_DISABLE_DEBUGINFO
2532 ls->chunkname = lj_str_newlit(L, "=");
2533 #else
2534 ls->chunkname = lj_str_newz(L, ls->chunkarg);
2535 #endif
2536 setstrV(L, L->top, ls->chunkname); /* Anchor chunkname string. */
2537 incr_top(L);
2538 ls->level = 0;
2539 fs_init(ls, &fs);
2540 fs.linedefined = 0;
2541 fs.numparams = 0;
2542 fs.bcbase = NULL;
2543 fs.bclim = 0;
2544 fs.flags |= PROTO_VARARG; /* Main chunk is always a vararg func. */
2545 bcemit_AD(&fs, BC_FUNCV, 0, 0); /* Placeholder. */
2546 lj_lex_next(ls); /* Read-ahead first token. */
2547 parse_chunk(ls);
2548 if (ls->token != TK_eof)
2549 err_token(ls, TK_eof);
2550 pt = fs_finish(ls, ls->linenumber);
2551 L->top--; /* Drop chunkname. */
2552 lua_assert(fs.prev == NULL);
2553 lua_assert(ls->fs == NULL);
2554 lua_assert(pt->sizeuv == 0);
2555 return pt;