Inline-Lua
view release on metacpan or search on metacpan
ffi/target/release/build/mlua-sys-6a99a2ae50f12319/out/luajit-build/build/src/lj_parse.c view on Meta::CPAN
#define LUA_CORE
#include "lj_obj.h"
#include "lj_gc.h"
#include "lj_err.h"
#include "lj_debug.h"
#include "lj_buf.h"
#include "lj_str.h"
#include "lj_tab.h"
#include "lj_func.h"
#include "lj_state.h"
#include "lj_bc.h"
#if LJ_HASFFI
#include "lj_ctype.h"
#endif
#include "lj_strfmt.h"
#include "lj_lex.h"
#include "lj_parse.h"
#include "lj_vm.h"
#include "lj_vmevent.h"
/* -- Parser structures and definitions ----------------------------------- */
/* Expression kinds. */
typedef enum {
/* Constant expressions must be first and in this order: */
VKNIL,
VKFALSE,
VKTRUE,
VKSTR, /* sval = string value */
VKNUM, /* nval = number value */
VKLAST = VKNUM,
VKCDATA, /* nval = cdata value, not treated as a constant expression */
/* Non-constant expressions follow: */
VLOCAL, /* info = local register, aux = vstack index */
VUPVAL, /* info = upvalue index, aux = vstack index */
VGLOBAL, /* sval = string value */
VINDEXED, /* info = table register, aux = index reg/byte/string const */
VJMP, /* info = instruction PC */
VRELOCABLE, /* info = instruction PC */
VNONRELOC, /* info = result register */
VCALL, /* info = instruction PC, aux = base */
VVOID
} ExpKind;
/* Expression descriptor. */
typedef struct ExpDesc {
union {
struct {
uint32_t info; /* Primary info. */
uint32_t aux; /* Secondary info. */
} s;
TValue nval; /* Number value. */
GCstr *sval; /* String value. */
} u;
ExpKind k;
BCPos t; /* True condition jump list. */
BCPos f; /* False condition jump list. */
} ExpDesc;
/* Macros for expressions. */
#define expr_hasjump(e) ((e)->t != (e)->f)
#define expr_isk(e) ((e)->k <= VKLAST)
#define expr_isk_nojump(e) (expr_isk(e) && !expr_hasjump(e))
#define expr_isnumk(e) ((e)->k == VKNUM)
#define expr_isnumk_nojump(e) (expr_isnumk(e) && !expr_hasjump(e))
#define expr_isstrk(e) ((e)->k == VKSTR)
#define expr_numtv(e) check_exp(expr_isnumk((e)), &(e)->u.nval)
#define expr_numberV(e) numberVnum(expr_numtv((e)))
/* Initialize expression. */
static LJ_AINLINE void expr_init(ExpDesc *e, ExpKind k, uint32_t info)
{
e->k = k;
e->u.s.info = info;
e->f = e->t = NO_JMP;
}
/* Check number constant for +-0. */
static int expr_numiszero(ExpDesc *e)
{
TValue *o = expr_numtv(e);
return tvisint(o) ? (intV(o) == 0) : tviszero(o);
}
/* Per-function linked list of scope blocks. */
typedef struct FuncScope {
struct FuncScope *prev; /* Link to outer scope. */
MSize vstart; /* Start of block-local variables. */
uint8_t nactvar; /* Number of active vars outside the scope. */
uint8_t flags; /* Scope flags. */
} FuncScope;
#define FSCOPE_LOOP 0x01 /* Scope is a (breakable) loop. */
#define FSCOPE_BREAK 0x02 /* Break used in scope. */
#define FSCOPE_GOLA 0x04 /* Goto or label used in scope. */
#define FSCOPE_UPVAL 0x08 /* Upvalue in scope. */
#define FSCOPE_NOCLOSE 0x10 /* Do not close upvalues. */
#define NAME_BREAK ((GCstr *)(uintptr_t)1)
/* Index into variable stack. */
typedef uint16_t VarIndex;
#define LJ_MAX_VSTACK (65536 - LJ_MAX_UPVAL)
/* Variable/goto/label info. */
#define VSTACK_VAR_RW 0x01 /* R/W variable. */
#define VSTACK_GOTO 0x02 /* Pending goto. */
#define VSTACK_LABEL 0x04 /* Label. */
/* Per-function state. */
typedef struct FuncState {
GCtab *kt; /* Hash table for constants. */
LexState *ls; /* Lexer state. */
lua_State *L; /* Lua state. */
FuncScope *bl; /* Current scope. */
struct FuncState *prev; /* Enclosing function. */
BCPos pc; /* Next bytecode position. */
BCPos lasttarget; /* Bytecode position of last jump target. */
( run in 2.902 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )