Inline-Lua
view release on metacpan or search on metacpan
ffi/target/release/build/mlua-sys-6a99a2ae50f12319/out/luajit-build/build/src/lj_lex.c view on Meta::CPAN
case '>':
lex_next(ls);
if (ls->c != '=') return '>'; else { lex_next(ls); return TK_ge; }
case '~':
lex_next(ls);
if (ls->c != '=') return '~'; else { lex_next(ls); return TK_ne; }
case ':':
lex_next(ls);
if (ls->c != ':') return ':'; else { lex_next(ls); return TK_label; }
case '"':
case '\'':
lex_string(ls, tv);
return TK_string;
case '.':
if (lex_savenext(ls) == '.') {
lex_next(ls);
if (ls->c == '.') {
lex_next(ls);
return TK_dots; /* ... */
}
return TK_concat; /* .. */
} else if (!lj_char_isdigit(ls->c)) {
return '.';
} else {
lex_number(ls, tv);
return TK_number;
}
case LEX_EOF:
return TK_eof;
default: {
LexChar c = ls->c;
lex_next(ls);
return c; /* Single-char tokens (+ - / ...). */
}
}
}
}
/* -- Lexer API ----------------------------------------------------------- */
/* Setup lexer state. */
int lj_lex_setup(lua_State *L, LexState *ls)
{
int header = 0;
ls->L = L;
ls->fs = NULL;
ls->pe = ls->p = NULL;
ls->vstack = NULL;
ls->sizevstack = 0;
ls->vtop = 0;
ls->bcstack = NULL;
ls->sizebcstack = 0;
ls->tok = 0;
ls->lookahead = TK_eof; /* No look-ahead token. */
ls->linenumber = 1;
ls->lastline = 1;
ls->endmark = 0;
ls->fr2 = LJ_FR2; /* Generate native bytecode by default. */
lex_next(ls); /* Read-ahead first char. */
if (ls->c == 0xef && ls->p + 2 <= ls->pe && (uint8_t)ls->p[0] == 0xbb &&
(uint8_t)ls->p[1] == 0xbf) { /* Skip UTF-8 BOM (if buffered). */
ls->p += 2;
lex_next(ls);
header = 1;
}
if (ls->c == '#') { /* Skip POSIX #! header line. */
do {
lex_next(ls);
if (ls->c == LEX_EOF) return 0;
} while (!lex_iseol(ls));
lex_newline(ls);
header = 1;
}
if (ls->c == LUA_SIGNATURE[0]) { /* Bytecode dump. */
if (header) {
/*
** Loading bytecode with an extra header is disabled for security
** reasons. This may circumvent the usual check for bytecode vs.
** Lua code by looking at the first char. Since this is a potential
** security violation no attempt is made to echo the chunkname either.
*/
setstrV(L, L->top++, lj_err_str(L, LJ_ERR_BCBAD));
lj_err_throw(L, LUA_ERRSYNTAX);
}
return 1;
}
return 0;
}
/* Cleanup lexer state. */
void lj_lex_cleanup(lua_State *L, LexState *ls)
{
global_State *g = G(L);
lj_mem_freevec(g, ls->bcstack, ls->sizebcstack, BCInsLine);
lj_mem_freevec(g, ls->vstack, ls->sizevstack, VarInfo);
lj_buf_free(g, &ls->sb);
}
/* Return next lexical token. */
void lj_lex_next(LexState *ls)
{
ls->lastline = ls->linenumber;
if (LJ_LIKELY(ls->lookahead == TK_eof)) { /* No lookahead token? */
ls->tok = lex_scan(ls, &ls->tokval); /* Get next token. */
} else { /* Otherwise return lookahead token. */
ls->tok = ls->lookahead;
ls->lookahead = TK_eof;
ls->tokval = ls->lookaheadval;
}
}
/* Look ahead for the next token. */
LexToken lj_lex_lookahead(LexState *ls)
{
lj_assertLS(ls->lookahead == TK_eof, "double lookahead");
ls->lookahead = lex_scan(ls, &ls->lookaheadval);
return ls->lookahead;
}
/* Convert token to string. */
const char *lj_lex_token2str(LexState *ls, LexToken tok)
( run in 2.592 seconds using v1.01-cache-2.11-cpan-8f98c5d2c55 )