2 ** Lua parser (source code -> bytecode).
3 ** Copyright (C) 2005-2012 Mike Pall. See Copyright Notice in luajit.h
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
27 #include "lj_vmevent.h"
29 /* -- Parser structures and definitions ----------------------------------- */
31 /* Expression kinds. */
33 /* Constant expressions must be first and in this order: */
37 VKSTR
, /* sval = string value */
38 VKNUM
, /* nval = number value */
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 */
53 /* Expression descriptor. */
54 typedef struct ExpDesc
{
57 uint32_t info
; /* Primary info. */
58 uint32_t aux
; /* Secondary info. */
60 TValue nval
; /* Number value. */
61 GCstr
*sval
; /* String value. */
64 BCPos t
; /* True condition jump list. */
65 BCPos f
; /* False condition jump list. */
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
)
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. */
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. */
111 typedef struct UVMap
{
112 VarIndex vidx
; /* Varinfo index. */
113 uint16_t slot
; /* Slot or parent upvalue index. */
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. */
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 */
146 OPR_LT
, OPR_GE
, OPR_LE
, OPR_GT
,
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
);
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
;
196 lua_assert(expr_isnumk(e
));
197 o
= lj_tab_set(L
, fs
->kt
, &e
->u
.nval
);
204 /* Add a GC object constant. */
205 static BCReg
const_gc(FuncState
*fs
, GCobj
*gc
, uint32_t itype
)
207 lua_State
*L
= fs
->L
;
209 setgcV(L
, &key
, gc
, itype
);
210 /* NOBARRIER: the key is new or kept alive. */
211 o
= lj_tab_set(L
, fs
->kt
, &key
);
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);
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);
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
)
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
))
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
) {
285 ilp
->ins
= BCINS_AJ(BC_JMP
, bc_a(fs
->bcbase
[pc
].ins
), 0);
287 setbc_a(&ilp
->ins
, reg
);
288 if (reg
>= bc_a(ilp
[1].ins
))
289 setbc_a(&ilp
[1].ins
, reg
+1);
292 return 0; /* Cannot patch other instructions. */
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
)
320 } else if (*l1
== NO_JMP
) {
325 while ((next
= jmp_next(fs
, list
)) != NO_JMP
) /* Find last element. */
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. */
340 jmp_patchins(fs
, list
, dtarget
); /* Jump to default target. */
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
);
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
)
384 static void bcreg_free(FuncState
*fs
, BCReg reg
)
386 if (reg
>= fs
->nactvar
) {
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
)
405 LexState
*ls
= fs
->ls
;
406 jmp_patchval(fs
, fs
->jpc
, pc
, NO_REG
, pc
);
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
;
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
)
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));
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
;
452 } else if (e
->k
== VLOCAL
) {
458 e
->u
.s
.info
= bcemit_INS(fs
, ins
);
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. */
470 if (bc_d(*ip
) != ~LJ_TNIL
) break;
473 } else if (from
== pfrom
+1) {
479 fs
->pc
--; /* Drop KPRI. */
483 if (pfrom
<= from
&& from
<= pto
+1) { /* Can we connect both ranges? */
485 setbc_d(ip
, from
+n
-1); /* Patch previous instruction range. */
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
)
502 expr_discharge(fs
, e
);
504 ins
= BCINS_AD(BC_KSTR
, reg
, const_str(fs
, e
));
505 } else if (e
->k
== VKNUM
) {
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
));
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
);
518 ins
= BCINS_AD(BC_KNUM
, reg
, const_num(fs
, e
));
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
));
525 } else if (e
->k
== VRELOCABLE
) {
526 setbc_a(bcptr(fs
, e
), reg
);
528 } else if (e
->k
== VNONRELOC
) {
529 if (reg
== e
->u
.s
.info
)
531 ins
= BCINS_AD(BC_MOV
, reg
, e
->u
.s
.info
);
532 } else if (e
->k
== VKNIL
) {
533 bcemit_nil(fs
, reg
, 1);
535 } else if (e
->k
<= VKTRUE
) {
536 ins
= BCINS_AD(BC_KPRI
, reg
, const_pri(e
));
538 lua_assert(e
->k
== VVOID
|| e
->k
== VJMP
);
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
);
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
);
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
;
575 /* Discharge an expression to the next free register. */
576 static void expr_tonextreg(FuncState
*fs
, ExpDesc
*e
)
578 expr_discharge(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. */
595 expr_tonextreg(fs
, e
); /* Discharge to next register. */
599 /* Partially discharge expression to a value. */
600 static void expr_toval(FuncState
*fs
, ExpDesc
*e
)
603 expr_toanyreg(fs
, e
);
605 expr_discharge(fs
, e
);
608 /* Emit store for LHS expression. */
609 static void bcemit_store(FuncState
*fs
, ExpDesc
*var
, ExpDesc
*e
)
612 if (var
->k
== VLOCAL
) {
613 fs
->ls
->vstack
[var
->u
.s
.aux
].endpc
|= VSTACK_VAR_RW
;
615 expr_toreg(fs
, e
, var
->u
.s
.info
);
617 } else if (var
->k
== VUPVAL
) {
618 fs
->ls
->vstack
[var
->u
.s
.aux
].endpc
|= VSTACK_VAR_RW
;
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
));
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
));
633 lua_assert(var
->k
== VINDEXED
);
634 ra
= expr_toanyreg(fs
, e
);
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));
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
);
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
);
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
);
665 bcreg_reserve(fs
, 3);
666 bcemit_AD(fs
, BC_KSTR
, func
+2, idx
);
667 bcemit_ABC(fs
, BC_TGETV
, func
, obj
, func
+2);
674 /* -- Bytecode emitter for branches --------------------------------------- */
676 /* Emit unconditional branch. */
677 static BCPos
bcemit_jmp(FuncState
*fs
)
680 BCPos j
= fs
->pc
- 1;
681 BCIns
*ip
= &fs
->bcbase
[j
].ins
;
683 if ((int32_t)j
>= (int32_t)fs
->lasttarget
&&
684 bc_op(*ip
) == BC_UCLO
)
687 j
= bcemit_AJ(fs
, BC_JMP
, fs
->freereg
, NO_JMP
);
688 jmp_append(fs
, &j
, jpc
);
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
)
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
);
720 /* Emit branch on true condition. */
721 static void bcemit_branch_t(FuncState
*fs
, ExpDesc
*e
)
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
);
732 pc
= bcemit_branch(fs
, e
, 0);
733 jmp_append(fs
, &e
->f
, pc
);
734 jmp_tohere(fs
, e
->t
);
738 /* Emit branch on false condition. */
739 static void bcemit_branch_f(FuncState
*fs
, ExpDesc
*e
)
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
)
747 else if (e
->k
== VKSTR
|| e
->k
== VKNUM
|| e
->k
== VKTRUE
)
748 expr_toreg_nobranch(fs
, e
, NO_REG
), pc
= bcemit_jmp(fs
);
750 pc
= bcemit_branch(fs
, e
, 1);
751 jmp_append(fs
, &e
->t
, pc
);
752 jmp_tohere(fs
, e
->f
);
756 /* -- Bytecode emitter for operators -------------------------------------- */
758 /* Try constant-folding of arithmetic operators. */
759 static int foldarith(BinOpr opr
, ExpDesc
*e1
, ExpDesc
*e2
)
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
);
766 if (tvisnan(&o
) || tvismzero(&o
)) return 0; /* Avoid NaN and -0 as consts. */
768 int32_t k
= lj_num2int(n
);
769 if ((lua_Number
)k
== n
) {
770 setintV(&e1
->u
.nval
, k
);
774 setnumV(&e1
->u
.nval
, n
);
778 /* Emit arithmetic operator. */
779 static void bcemit_arith(FuncState
*fs
, BinOpr opr
, ExpDesc
*e1
, ExpDesc
*e2
)
783 if (foldarith(opr
, e1
, e2
))
785 if (opr
== OPR_POW
) {
787 rc
= expr_toanyreg(fs
, e2
);
788 rb
= expr_toanyreg(fs
, e1
);
790 op
= opr
-OPR_ADD
+BC_ADDVV
;
791 /* Must discharge 2nd operand first since VINDEXED might free regs. */
793 if (expr_isnumk(e2
) && (rc
= const_num(fs
, e2
)) <= BCMAX_C
)
794 op
-= BC_ADDVV
-BC_ADDVN
;
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
);
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
;
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
);
815 /* Emit comparison operator. */
816 static void bcemit_comp(FuncState
*fs
, BinOpr opr
, ExpDesc
*e1
, ExpDesc
*e2
)
821 if (opr
== OPR_EQ
|| opr
== OPR_NE
) {
822 BCOp op
= opr
== OPR_EQ
? BC_ISEQV
: BC_ISNEV
;
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. */
828 case VKNIL
: case VKFALSE
: case VKTRUE
:
829 ins
= BCINS_AD(op
+(BC_ISEQP
-BC_ISEQV
), ra
, const_pri(e2
));
832 ins
= BCINS_AD(op
+(BC_ISEQS
-BC_ISEQV
), ra
, const_str(fs
, e2
));
835 ins
= BCINS_AD(op
+(BC_ISEQN
-BC_ISEQV
), ra
, const_num(fs
, e2
));
838 ins
= BCINS_AD(op
, ra
, expr_toanyreg(fs
, e2
));
842 uint32_t op
= opr
-OPR_LT
+BC_ISLT
;
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
--;
856 eret
->u
.s
.info
= bcemit_jmp(fs
);
860 /* Fixup left side of binary operator. */
861 static void bcemit_binop_left(FuncState
*fs
, BinOpr op
, ExpDesc
*e
)
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
);
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
)
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
);
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
);
891 } else if (op
== OPR_CONCAT
) {
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);
896 setbc_b(bcptr(fs
, e2
), e1
->u
.s
.info
);
897 e1
->u
.s
.info
= e2
->u
.s
.info
;
899 expr_tonextreg(fs
, e2
);
902 e1
->u
.s
.info
= bcemit_ABC(fs
, BC_CAT
, 0, e1
->u
.s
.info
, e2
->u
.s
.info
);
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
)
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
) {
924 } else if (expr_isk(e
) || (LJ_HASFFI
&& e
->k
== VKCDATA
)) {
927 } else if (e
->k
== VJMP
) {
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;
936 lua_assert(e
->k
== VNONRELOC
);
939 lua_assert(op
== BC_UNM
|| op
== BC_LEN
);
940 if (op
== BC_UNM
&& !expr_hasjump(e
)) { /* Constant-fold negations. */
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);
952 if (expr_isnumk(e
) && !expr_numiszero(e
)) { /* Avoid folding to -0. */
953 TValue
*o
= expr_numtv(e
);
957 setnumV(o
, -(lua_Number
)k
);
962 o
->u64
^= U64x(80000000,00000000);
967 expr_toanyreg(fs
, e
);
970 e
->u
.s
.info
= bcemit_AD(fs
, op
, 0, e
->u
.s
.info
);
974 /* -- Lexer support ------------------------------------------------------- */
976 /* Check and consume optional token. */
977 static int lex_opt(LexState
*ls
, LexToken tok
)
979 if (ls
->token
== tok
) {
986 /* Check and consume token. */
987 static void lex_check(LexState
*ls
, LexToken tok
)
989 if (ls
->token
!= tok
)
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
) {
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
)
1012 if (ls
->token
!= TK_name
)
1013 err_token(ls
, TK_name
);
1014 s
= strV(&ls
->tokenval
);
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
;
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
;
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
)
1072 for (i
= fs
->nactvar
-1; i
>= 0; i
--) {
1073 if (n
== strref(var_get(fs
->ls
, fs
, i
).name
))
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));
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
)
1103 BCReg reg
= var_lookup_local(fs
, name
);
1104 if ((int32_t)reg
>= 0) { /* Local in this function? */
1105 expr_init(e
, VLOCAL
, reg
);
1107 scope_uvmark(fs
, reg
); /* Scope now has an upvalue. */
1108 return (MSize
)(e
->u
.s
.aux
= (uint32_t)fs
->varmap
[reg
]);
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
);
1117 } else { /* Not found in any function, must be a global. */
1118 expr_init(e
, VGLOBAL
, 0);
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
;
1136 bc
[0] = BCINS_AD((fs
->flags
& PROTO_VARARG
) ? BC_FUNCV
: BC_FUNCF
,
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
)
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
;
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
])];
1160 setintV(tv
, (int32_t)i
);
1162 setnumV(tv
, (lua_Number
)i
);
1164 node
= noderef(kt
->node
);
1166 for (i
= 0; i
<= hmask
; 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
];
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
)
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
)
1198 MSize i
, n
= fs
->nuv
;
1199 setmref(pt
->uv
, uv
);
1201 vstack
= fs
->ls
->vstack
;
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
;
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
;
1232 BCLine delta
= base
[i
].line
- first
;
1233 lua_assert(delta
>= 0 && delta
< 256);
1234 li
[i
] = (uint8_t)delta
;
1236 } else if (LJ_LIKELY(numline
< 65536)) {
1237 uint16_t *li
= (uint16_t *)lineinfo
;
1239 BCLine delta
= base
[i
].line
- first
;
1240 lua_assert(delta
>= 0 && delta
< 65536);
1241 li
[i
] = (uint16_t)delta
;
1244 uint32_t *li
= (uint32_t *)lineinfo
;
1246 BCLine delta
= base
[i
].line
- first
;
1247 lua_assert(delta
>= 0);
1248 li
[i
] = (uint32_t)delta
;
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
;
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
)
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
;
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
;
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
);
1302 vstack
+= fs
->vbase
;
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
;
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
);
1322 ls
->sb
.buf
[ls
->sb
.n
++] = '\0'; /* Terminator for varinfo. */
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. */
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)
1345 /* Check if bytecode op returns. */
1346 static int bcopisret(BCOp op
)
1349 case BC_CALLMT
: case BC_CALLT
:
1350 case BC_RETM
: case BC_RET
: case BC_RET0
: case BC_RET1
:
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
) {
1369 for (pc
= 0; pc
< lastpc
; pc
++) {
1370 BCIns ins
= fs
->bcbase
[pc
].ins
;
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
);
1382 return; /* We're done. */
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
;
1399 /* Apply final fixups. */
1400 lua_assert(fs
->bl
== NULL
);
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
;
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. */
1437 lua_assert(ls
->fs
!= NULL
|| ls
->token
== TK_eof
);
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. */
1447 fs
->vbase
= ls
->vtop
;
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
);
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). */
1483 if (expr_isnumk(e
)) {
1485 if (tvisint(expr_numtv(e
))) {
1486 int32_t k
= intV(expr_numtv(e
));
1488 t
->u
.s
.aux
= BCMAX_C
+1+(uint32_t)k
; /* 256..511: const byte key */
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 */
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 */
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
;
1515 expr_toanyreg(fs
, v
);
1516 lj_lex_next(ls
); /* Skip dot or colon. */
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 '['. */
1526 expr_toval(ls
->fs
, v
);
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
);
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
;
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);
1559 while (ls
->token
!= '}') {
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
++;
1567 } else if (ls
->token
== TK_name
&& lj_lex_lookahead(ls
) == '=') {
1572 expr_init(&key
, VKNUM
, 0);
1573 setintV(&key
.u
.nval
, (int)narr
);
1575 needarr
= vcall
= 1;
1578 if (expr_isk(&key
) && key
.k
!= VKNIL
&&
1579 (key
.k
== VKSTR
|| expr_isk_nojump(&val
))) {
1581 if (!t
) { /* Create template table on demand. */
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
);
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. */
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
);
1605 if (!lex_opt(ls
, ',') && !lex_opt(ls
, ';')) break;
1607 lex_match(ls
, '}', '{', line
);
1609 BCInsLine
*ilp
= &fs
->bcbase
[fs
->pc
-1];
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. */
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));
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
++) {
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
;
1657 var_new_lit(ls
, nparams
++, "self");
1658 if (ls
->token
!= ')') {
1660 if (ls
->token
== TK_name
) {
1661 var_new(ls
, nparams
++, lex_str(ls
));
1662 } else if (ls
->token
== TK_dots
) {
1664 fs
->flags
|= PROTO_VARARG
;
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
);
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
;
1686 ptrdiff_t oldbase
= pfs
->bcbase
- ls
->bcstack
;
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. */
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
)));
1702 pfs
->flags
|= (fs
.flags
& PROTO_FFI
);
1704 if (!(pfs
->flags
& PROTO_CHILD
)) {
1705 if (pfs
->flags
& PROTO_HAS_RETURN
)
1706 pfs
->flags
|= PROTO_FIXUP_RETURN
;
1707 pfs
->flags
|= PROTO_CHILD
;
1712 /* Parse expression list. Last expression is left open. */
1713 static BCReg
expr_list(LexState
*ls
, ExpDesc
*v
)
1717 while (lex_opt(ls
, ',')) {
1718 expr_tonextreg(ls
->fs
, v
);
1725 /* Parse function argument list. */
1726 static void parse_args(LexState
*ls
, ExpDesc
*e
)
1728 FuncState
*fs
= ls
->fs
;
1732 BCLine line
= ls
->linenumber
;
1733 if (ls
->token
== '(') {
1734 if (line
!= ls
->lastline
)
1735 err_syntax(ls
, LJ_ERR_XAMBIG
);
1737 if (ls
->token
== ')') { /* f(). */
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
);
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);
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
));
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
;
1779 lex_match(ls
, ')', '(', line
);
1780 expr_discharge(ls
->fs
, v
);
1781 } else if (ls
->token
== TK_name
) {
1784 err_syntax(ls
, LJ_ERR_XSYMBOL
);
1786 for (;;) { /* Parse multiple expression suffixes. */
1787 if (ls
->token
== '.') {
1789 } else if (ls
->token
== '[') {
1791 expr_toanyreg(fs
, v
);
1792 expr_bracket(ls
, &key
);
1793 expr_index(fs
, v
, &key
);
1794 } else if (ls
->token
== ':') {
1798 bcemit_method(fs
, v
, &key
);
1800 } else if (ls
->token
== '(' || ls
->token
== TK_string
|| ls
->token
== '{') {
1801 expr_tonextreg(fs
, v
);
1809 /* Parse simple expression. */
1810 static void expr_simple(LexState
*ls
, ExpDesc
*v
)
1812 switch (ls
->token
) {
1814 expr_init(v
, (LJ_HASFFI
&& tviscdata(&ls
->tokenval
)) ? VKCDATA
: VKNUM
, 0);
1815 copyTV(ls
->L
, &v
->u
.nval
, &ls
->tokenval
);
1818 expr_init(v
, VKSTR
, 0);
1819 v
->u
.sval
= strV(&ls
->tokenval
);
1822 expr_init(v
, VKNIL
, 0);
1825 expr_init(v
, VKTRUE
, 0);
1828 expr_init(v
, VKFALSE
, 0);
1830 case TK_dots
: { /* Vararg. */
1831 FuncState
*fs
= ls
->fs
;
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
));
1840 case '{': /* Table constructor. */
1845 parse_body(ls
, v
, 0, ls
->linenumber
);
1848 expr_primary(ls
, v
);
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
)
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. */
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
)
1907 if (ls
->token
== TK_not
) {
1909 } else if (ls
->token
== '-') {
1911 } else if (ls
->token
== '#') {
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
)
1928 op
= token2binop(ls
->token
);
1929 while (op
!= OPR_NOBINOPR
&& priority
[op
].left
> limit
) {
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
);
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
)
1954 expr_tonextreg(ls
->fs
, &e
);
1957 /* Parse conditional expression. */
1958 static BCPos
expr_cond(LexState
*ls
)
1962 if (v
.k
== VKNIL
) v
.k
= VKFALSE
;
1963 bcemit_branch_t(ls
->fs
, &v
);
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
;
1978 lua_assert(fs
->freereg
== fs
->nactvar
);
1982 static void scope_end(FuncState
*fs
)
1984 FuncScope
*bl
= fs
->bl
;
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
);
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
)
2001 for (bl
= fs
->bl
; bl
&& bl
->nactvar
> level
; bl
= bl
->prev
)
2007 /* Parse 'break' statement. */
2008 static void parse_break(LexState
*ls
)
2010 FuncState
*fs
= ls
->fs
;
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. */
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
)
2030 case TK_else
: case TK_elseif
: case TK_end
: case TK_until
: case TK_eof
:
2037 /* Parse 'return' statement. */
2038 static void parse_return(LexState
*ls
)
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
;
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);
2060 if (e
.k
== VCALL
) { /* Append all results from a call. */
2062 setbc_b(bcptr(fs
, &e
), 0);
2063 ins
= BCINS_AD(BC_RETM
, fs
->nactvar
, e
.u
.s
.aux
- fs
->nactvar
);
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
;
2080 scope_begin(fs
, &bl
, 0);
2082 lua_assert(bl
.breaklist
== NO_JMP
);
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. */
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). */
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 */
2105 lh
->v
.u
.s
.info
= tmp
;
2107 if (lh
->v
.u
.s
.aux
== reg
) { /* t[i], i = 1, 2 */
2109 lh
->v
.u
.s
.aux
= tmp
;
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);
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
)
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. */
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. */
2156 nexps
= expr_list(ls
, &e
);
2157 if (nexps
== nvars
) {
2159 if (bc_op(*bcptr(ls
->fs
, &e
)) == BC_VARG
) { /* Vararg assignment. */
2162 } else { /* Multiple call results. */
2163 e
.u
.s
.info
= e
.u
.s
.aux
; /* Base of call is not relocatable. */
2167 bcemit_store(ls
->fs
, &lh
->v
, &e
);
2170 assign_adjust(ls
, nvars
, nexps
, &e
);
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
;
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. */
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. */
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);
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. */
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. */
2220 assign_adjust(ls
, nvars
, nexps
, &e
);
2225 /* Parse 'function' statement. */
2226 static void parse_func(LexState
*ls
, BCLine line
)
2231 lj_lex_next(ls
); /* Skip 'function'. */
2232 /* Parse function name. */
2234 while (ls
->token
== '.') /* Multiple dot-separated fields. */
2236 if (ls
->token
== ':') { /* Optional colon to signify method call. */
2240 parse_body(ls
, &b
, needself
, line
);
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
;
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);
2261 jmp_patch(fs
, bcemit_jmp(fs
), start
);
2262 lex_match(ls
, TK_end
, TK_while
, line
);
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
;
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);
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. */
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
;
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
);
2312 if (lex_opt(ls
, ',')) {
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. */
2323 bcreg_reserve(fs
, 1);
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
;
2342 switch (bc_op(ins
)) {
2344 name
= gco2str(gcref(var_get(ls
, fs
, bc_d(ins
)).name
));
2347 name
= gco2str(gcref(ls
->vstack
[fs
->uvloc
[bc_d(ins
)].vidx
].name
));
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
))
2354 o
= lj_tab_getstr(fs
->kt
, lj_str_newlit(ls
->L
, "next"));
2355 if (o
&& tvhaskslot(o
) && tvkslot(o
) == bc_d(ins
))
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
;
2372 BCReg base
= fs
->freereg
+ 3;
2373 BCPos loop
, loopend
, exprpc
= fs
->pc
;
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);
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
;
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
);
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
)
2429 lj_lex_next(ls
); /* Skip 'if' or 'elseif'. */
2430 condexit
= expr_cond(ls
);
2431 lex_check(ls
, TK_then
);
2436 /* Parse 'if' statement. */
2437 static void parse_if(LexState
*ls
, BCLine line
)
2439 FuncState
*fs
= ls
->fs
;
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'. */
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
) {
2471 parse_while(ls
, line
);
2476 lex_match(ls
, TK_end
, TK_do
, line
);
2479 parse_for(ls
, line
);
2482 parse_repeat(ls
, line
);
2485 parse_func(ls
, line
);
2493 return 1; /* Must be last. */
2497 return 1; /* Must be last. */
2498 #ifdef LUAJIT_ENABLE_LUA52COMPAT
2504 parse_call_assign(ls
);
2510 /* A chunk is a list of statements optionally separated by semicolons. */
2511 static void parse_chunk(LexState
*ls
)
2515 while (!islast
&& !endofblock(ls
->token
)) {
2516 islast
= parse_stmt(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. */
2525 /* Entry point of bytecode parser. */
2526 GCproto
*lj_parse(LexState
*ls
)
2530 lua_State
*L
= ls
->L
;
2531 #ifdef LUAJIT_DISABLE_DEBUGINFO
2532 ls
->chunkname
= lj_str_newlit(L
, "=");
2534 ls
->chunkname
= lj_str_newz(L
, ls
->chunkarg
);
2536 setstrV(L
, L
->top
, ls
->chunkname
); /* Anchor chunkname string. */
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. */
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);