Feature #2119 ยป 0048-lua-Update-to-lua-5.5.1.patch
| dependencies/lua-5.5/README | ||
|---|---|---|
|
This is Lua 5.5.0, released on 15 Dec 2025.
|
||
|
This is Lua 5.5.1, released on 24 Jul 2026.
|
||
|
For installation instructions, license details, and
|
||
|
further information about Lua, see doc/readme.html.
|
||
| dependencies/lua-5.5/Version.txt | ||
|---|---|---|
|
Sources here are from lua-5.5.0
|
||
|
(http://www.lua.org/ftp/lua-5.5.0.tar.gz)
|
||
|
Sources here are from lua-5.5.1
|
||
|
(http://www.lua.org/ftp/lua-5.5.1.tar.gz)
|
||
|
Upstream bug fixes from https://www.lua.org/bugs.html applied:
|
||
|
1, 2, 3, 4
|
||
|
Not entire lua distribution directory hierarchy is included here, and
|
||
|
some files needed for Freeciv usage have been added.
|
||
| dependencies/lua-5.5/doc/readme.html | ||
|---|---|---|
|
<OL>
|
||
|
<LI>
|
||
|
Open a terminal window and move to
|
||
|
the top-level directory, which is named <TT>lua-5.5.0</TT>.
|
||
|
the top-level directory, which is named <TT>lua-5.5.1</TT>.
|
||
|
The <TT>Makefile</TT> there controls both the build process and the installation process.
|
||
|
<P>
|
||
|
<LI>
|
||
| ... | ... | |
|
<H3>Main changes</H3>
|
||
|
<UL>
|
||
|
<LI> declarations for global variables
|
||
|
<LI> named vararg tables
|
||
|
<LI> for-loop variables are read only
|
||
|
<LI> floats are printed in decimal with enough digits to be read back correctly.
|
||
|
<LI> more levels for constructors
|
||
| ... | ... | |
|
<A HREF="https://www.lua.org/license.html">license page</A>.
|
||
|
<BLOCKQUOTE STYLE="padding-bottom: 0em">
|
||
|
Copyright © 1994–2025 Lua.org, PUC-Rio.
|
||
|
Copyright © 1994–2026 Lua.org, PUC-Rio.
|
||
|
<P>
|
||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
| ... | ... | |
|
<P CLASS="footer">
|
||
|
Last update:
|
||
|
Wed Dec 10 11:37:23 UTC 2025
|
||
|
Mon Jul 13 21:20:24 UTC 2026
|
||
|
</P>
|
||
|
<!--
|
||
|
Last change: revised for Lua 5.5.0
|
||
|
Last change: revised for Lua 5.5.1
|
||
|
-->
|
||
|
</BODY>
|
||
| dependencies/lua-5.5/src/lapi.c | ||
|---|---|---|
|
api_check(L, idx <= ci->top.p - (func + 1), "new top too large");
|
||
|
diff = ((func + 1) + idx) - L->top.p;
|
||
|
for (; diff > 0; diff--)
|
||
|
setnilvalue(s2v(L->top.p++)); /* clear new slots */
|
||
|
setnilvalue2s(L->top.p++); /* clear new slots */
|
||
|
}
|
||
|
else {
|
||
|
api_check(L, -(idx+1) <= (L->top.p - (func + 1)), "invalid new top");
|
||
| ... | ... | |
|
api_check(L, (L->ci->callstatus & CIST_TBC) && (L->tbclist.p == level),
|
||
|
"no variable to close at given level");
|
||
|
level = luaF_close(L, level, CLOSEKTOP, 0);
|
||
|
setnilvalue(s2v(level));
|
||
|
setnilvalue2s(level);
|
||
|
lua_unlock(L);
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
LUA_API unsigned (lua_numbertocstring) (lua_State *L, int idx, char *buff) {
|
||
|
LUA_API unsigned lua_numbertocstring (lua_State *L, int idx, char *buff) {
|
||
|
const TValue *o = index2value(L, idx);
|
||
|
if (ttisnumber(o)) {
|
||
|
unsigned len = luaO_tostringbuff(o, buff);
|
||
| ... | ... | |
|
LUA_API void lua_pushnil (lua_State *L) {
|
||
|
lua_lock(L);
|
||
|
setnilvalue(s2v(L->top.p));
|
||
|
setnilvalue2s(L->top.p);
|
||
|
api_incr_top(L);
|
||
|
lua_unlock(L);
|
||
|
}
|
||
| ... | ... | |
|
LUA_API const char *lua_pushstring (lua_State *L, const char *s) {
|
||
|
lua_lock(L);
|
||
|
if (s == NULL)
|
||
|
setnilvalue(s2v(L->top.p));
|
||
|
setnilvalue2s(L->top.p);
|
||
|
else {
|
||
|
TString *ts;
|
||
|
ts = luaS_new(L, s);
|
||
| ... | ... | |
|
static int finishrawget (lua_State *L, lu_byte tag) {
|
||
|
if (tagisempty(tag)) /* avoid copying empty items to the stack */
|
||
|
setnilvalue(s2v(L->top.p));
|
||
|
setnilvalue2s(L->top.p);
|
||
|
api_incr_top(L);
|
||
|
lua_unlock(L);
|
||
|
return novariant(tag);
|
||
| ... | ... | |
|
o = index2value(L, idx);
|
||
|
api_check(L, ttisfulluserdata(o), "full userdata expected");
|
||
|
if (n <= 0 || n > uvalue(o)->nuvalue) {
|
||
|
setnilvalue(s2v(L->top.p));
|
||
|
setnilvalue2s(L->top.p);
|
||
|
t = LUA_TNONE;
|
||
|
}
|
||
|
else {
|
||
| ... | ... | |
|
case LUA_GCSTEP: {
|
||
|
lu_byte oldstp = g->gcstp;
|
||
|
l_mem n = cast(l_mem, va_arg(argp, size_t));
|
||
|
l_mem newdebt;
|
||
|
int work = 0; /* true if GC did some work */
|
||
|
g->gcstp = 0; /* allow GC to run (other bits must be zero here) */
|
||
|
if (n <= 0)
|
||
|
n = g->GCdebt; /* force to run one basic step */
|
||
|
else if (g->GCdebt < n - MAX_LMEM) /* overflow? */
|
||
|
n = MAX_LMEM + g->GCdebt; /* trim 'n' (debt must be negative) */
|
||
|
luaE_setdebt(g, g->GCdebt - n);
|
||
|
newdebt = 0; /* force to run one basic step */
|
||
|
else if (g->GCdebt >= n - MAX_LMEM) /* no overflow? */
|
||
|
newdebt = g->GCdebt - n;
|
||
|
else /* overflow */
|
||
|
newdebt = -MAX_LMEM; /* set debt to mininum value */
|
||
|
luaE_setdebt(g, newdebt);
|
||
|
luaC_condGC(L, (void)0, work = 1);
|
||
|
if (work && g->gcstate == GCSpause) /* end of cycle? */
|
||
|
res = 1; /* signal it */
|
||
| ... | ... | |
|
LUA_API void lua_concat (lua_State *L, int n) {
|
||
|
lua_lock(L);
|
||
|
api_checknelems(L, n);
|
||
|
if (n > 0) {
|
||
|
api_checkpop(L, n);
|
||
|
luaV_concat(L, n);
|
||
|
luaC_checkGC(L);
|
||
|
}
|
||
| ... | ... | |
|
TValue *fi;
|
||
|
lua_lock(L);
|
||
|
fi = index2value(L, funcindex);
|
||
|
api_checknelems(L, 1);
|
||
|
api_checkpop(L, 1);
|
||
|
name = aux_upvalue(fi, n, &val, &owner);
|
||
|
if (name) {
|
||
|
L->top.p--;
|
||
| dependencies/lua-5.5/src/lauxlib.c | ||
|---|---|---|
|
};
|
||
|
/*
|
||
|
** Get/create metatable (MT) for boxes
|
||
|
*/
|
||
|
static void getBoxMT (lua_State *L) {
|
||
|
const char *BOXMT = "_UBOX*"; /* key for the metatable */
|
||
|
if (luaL_getmetatable(L, BOXMT) == LUA_TNIL) { /* MT not created yet? */
|
||
|
luaL_newlibtable(L, boxmt); /* create it */
|
||
|
luaL_setfuncs(L, boxmt, 0); /* initialize it */
|
||
|
lua_copy(L, -1, -2); /* change stack from nil,MT to MT,MT */
|
||
|
lua_setfield(L, LUA_REGISTRYINDEX, BOXMT); /* store MT in the registry */
|
||
|
}
|
||
|
}
|
||
|
static void newbox (lua_State *L) {
|
||
|
UBox *box = (UBox *)lua_newuserdatauv(L, sizeof(UBox), 0);
|
||
|
box->box = NULL;
|
||
|
box->bsize = 0;
|
||
|
if (luaL_newmetatable(L, "_UBOX*")) /* creating metatable? */
|
||
|
luaL_setfuncs(L, boxmt, 0); /* set its metamethods */
|
||
|
getBoxMT(L);
|
||
|
lua_setmetatable(L, -2);
|
||
|
}
|
||
| ... | ... | |
|
LUALIB_API int luaL_loadstring (lua_State *L, const char *s) {
|
||
|
return luaL_loadbuffer(L, s, strlen(s), s);
|
||
|
return luaL_loadbufferx(L, s, strlen(s), s, "t");
|
||
|
}
|
||
|
/* }====================================================== */
|
||
| dependencies/lua-5.5/src/lauxlib.h | ||
|---|---|---|
|
LUALIB_API int (luaL_fileresult) (lua_State *L, int stat, const char *fname);
|
||
|
LUALIB_API int (luaL_execresult) (lua_State *L, int stat);
|
||
|
LUALIB_API void *luaL_alloc (void *ud, void *ptr, size_t osize,
|
||
|
size_t nsize);
|
||
|
LUALIB_API void *(luaL_alloc) (void *ud, void *ptr, size_t osize,
|
||
|
size_t nsize);
|
||
|
/* predefined references */
|
||
| ... | ... | |
|
LUALIB_API lua_State *(luaL_newstate) (void);
|
||
|
LUALIB_API unsigned luaL_makeseed (lua_State *L);
|
||
|
LUALIB_API unsigned (luaL_makeseed) (lua_State *L);
|
||
|
LUALIB_API lua_Integer (luaL_len) (lua_State *L, int idx);
|
||
| dependencies/lua-5.5/src/lbaselib.c | ||
|---|---|---|
|
static const char *getMode (lua_State *L, int idx) {
|
||
|
const char *mode = luaL_optstring(L, idx, "bt");
|
||
|
if (strchr(mode, 'B') != NULL) /* Lua code cannot use fixed buffers */
|
||
|
const char *mode = luaL_optstring(L, idx, NULL);
|
||
|
if (mode != NULL && strchr(mode, 'B') != NULL) {
|
||
|
/* Lua code cannot use fixed buffers */
|
||
|
luaL_argerror(L, idx, "invalid mode");
|
||
|
}
|
||
|
return mode;
|
||
|
}
|
||
| ... | ... | |
|
/*
|
||
|
** reserved slot, above all arguments, to hold a copy of the returned
|
||
|
** string to avoid it being collected while parsed. 'load' has four
|
||
|
** optional arguments (chunk, source name, mode, and environment).
|
||
|
*/
|
||
|
#define RESERVEDSLOT 5
|
||
|
/*
|
||
|
** Reader for generic 'load' function: 'lua_load' uses the
|
||
|
** stack for internal stuff, so the reader cannot change the
|
||
|
** stack top. Instead, it keeps its resulting string in a
|
||
|
** reserved slot inside the stack.
|
||
|
** Reader for generic 'load' function.
|
||
|
*/
|
||
|
static const char *generic_reader (lua_State *L, void *ud, size_t *size) {
|
||
|
(void)(ud); /* not used */
|
||
|
int *firstcall = cast(int *, ud);
|
||
|
luaL_checkstack(L, 2, "too many nested functions");
|
||
|
if (*firstcall)
|
||
|
*firstcall = 0;
|
||
|
else
|
||
|
lua_pop(L, 1); /* remove previous result */
|
||
|
lua_pushvalue(L, 1); /* get function */
|
||
|
lua_call(L, 0, 1); /* call it */
|
||
|
if (lua_isnil(L, -1)) {
|
||
|
lua_pop(L, 1); /* pop result */
|
||
|
*size = 0;
|
||
|
return NULL;
|
||
|
}
|
||
|
else if (l_unlikely(!lua_isstring(L, -1)))
|
||
|
luaL_error(L, "reader function must return a string");
|
||
|
lua_replace(L, RESERVEDSLOT); /* save string in reserved slot */
|
||
|
return lua_tolstring(L, RESERVEDSLOT, size);
|
||
|
return lua_tolstring(L, -1, size);
|
||
|
}
|
||
| ... | ... | |
|
status = luaL_loadbufferx(L, s, l, chunkname, mode);
|
||
|
}
|
||
|
else { /* loading from a reader function */
|
||
|
int firstcall = 1; /* userdata for generic_reader */
|
||
|
const char *chunkname = luaL_optstring(L, 2, "=(load)");
|
||
|
luaL_checktype(L, 1, LUA_TFUNCTION);
|
||
|
lua_settop(L, RESERVEDSLOT); /* create reserved slot */
|
||
|
status = lua_load(L, generic_reader, NULL, chunkname, mode);
|
||
|
status = lua_load(L, generic_reader, &firstcall, chunkname, mode);
|
||
|
}
|
||
|
return load_aux(L, status, env);
|
||
|
}
|
||
| ... | ... | |
|
static int luaB_dofile (lua_State *L) {
|
||
|
const char *fname = luaL_optstring(L, 1, NULL);
|
||
|
lua_settop(L, 1);
|
||
|
if (l_unlikely(luaL_loadfile(L, fname) != LUA_OK))
|
||
|
if (l_unlikely(luaL_loadfilex(L, fname, "bt") != LUA_OK))
|
||
|
return lua_error(L);
|
||
|
lua_callk(L, 0, LUA_MULTRET, 0, dofilecont);
|
||
|
return dofilecont(L, 0, 0);
|
||
| dependencies/lua-5.5/src/lcode.c | ||
|---|---|---|
|
** Add nil to list of constants and return its index.
|
||
|
*/
|
||
|
static int nilK (FuncState *fs) {
|
||
|
TValue k, v;
|
||
|
setnilvalue(&v);
|
||
|
lua_State *L = fs->ls->L;
|
||
|
TValue k;
|
||
|
/* cannot use nil as key; instead use table itself */
|
||
|
sethvalue(fs->ls->L, &k, fs->kcache);
|
||
|
return k2proto(fs, &k, &v);
|
||
|
sethvalue(L, &k, fs->kcache);
|
||
|
return k2proto(fs, &k, &G(L)->nilvalue);
|
||
|
}
|
||
| ... | ... | |
|
} /* FALLTHROUGH */
|
||
|
case VLOCAL: { /* already in a register */
|
||
|
int temp = e->u.var.ridx;
|
||
|
e->u.info = temp; /* (can't do a direct assignment; values overlap) */
|
||
|
e->u.info = temp; /* (avoid a direct assignment; values overlap) */
|
||
|
e->k = VNONRELOC; /* becomes a non-relocatable value */
|
||
|
break;
|
||
|
}
|
||
| ... | ... | |
|
luaK_exp2anyreg(fs, t); /* put it in a register */
|
||
|
if (t->k == VUPVAL) {
|
||
|
lu_byte temp = cast_byte(t->u.info); /* upvalue index */
|
||
|
t->u.ind.t = temp; /* (can't do a direct assignment; values overlap) */
|
||
|
t->u.ind.t = temp; /* (avoid a direct assignment; values overlap) */
|
||
|
lua_assert(isKstr(fs, k));
|
||
|
fillidxk(t, k->u.info, VINDEXUP); /* literal short string */
|
||
|
}
|
||
| ... | ... | |
|
int kreg = luaK_exp2anyreg(fs, k); /* put key in some register */
|
||
|
lu_byte vreg = cast_byte(t->u.var.ridx); /* register with vararg param. */
|
||
|
lua_assert(vreg == fs->f->numparams);
|
||
|
t->u.ind.t = vreg; /* (avoid a direct assignment; values may overlap) */
|
||
|
t->u.ind.t = vreg; /* (avoid a direct assignment; values may overlap?) */
|
||
|
fillidxk(t, kreg, VVARGIND); /* 't' represents 'vararg[k]' */
|
||
|
}
|
||
|
else {
|
||
|
/* register index of the table */
|
||
|
t->u.ind.t = cast_byte((t->k == VLOCAL) ? t->u.var.ridx: t->u.info);
|
||
|
lu_byte temp = cast_byte((t->k == VLOCAL) ? t->u.var.ridx: t->u.info);
|
||
|
t->u.ind.t = temp; /* (avoid a direct assignment; values may overlap?) */
|
||
|
if (isKstr(fs, k))
|
||
|
fillidxk(t, k->u.info, VINDEXSTR); /* literal short string */
|
||
|
else if (isCint(k)) /* int. constant in proper range? */
|
||
| ... | ... | |
|
p->flag &= cast_byte(~PF_VAHID); /* then it will not use hidden args. */
|
||
|
for (i = 0; i < fs->pc; i++) {
|
||
|
Instruction *pc = &p->code[i];
|
||
|
/* avoid "not used" warnings when assert is off (for 'onelua.c') */
|
||
|
(void)luaP_isOT; (void)luaP_isIT;
|
||
|
lua_assert(i == 0 || luaP_isOT(*(pc - 1)) == luaP_isIT(*pc));
|
||
|
switch (GET_OPCODE(*pc)) {
|
||
|
case OP_RETURN0: case OP_RETURN1: {
|
||
| dependencies/lua-5.5/src/ldblib.c | ||
|---|---|---|
|
if (fgets(buffer, sizeof(buffer), stdin) == NULL ||
|
||
|
strcmp(buffer, "cont\n") == 0)
|
||
|
return 0;
|
||
|
if (luaL_loadbuffer(L, buffer, strlen(buffer), "=(debug command)") ||
|
||
|
if (luaL_loadbufferx(L, buffer, strlen(buffer), "=(debug command)", "t") ||
|
||
|
lua_pcall(L, 0, 0, 0))
|
||
|
lua_writestringerror("%s\n", luaL_tolstring(L, -1, NULL));
|
||
|
lua_settop(L, 0); /* remove eventual returns */
|
||
| dependencies/lua-5.5/src/ldebug.c | ||
|---|---|---|
|
static void collectvalidlines (lua_State *L, Closure *f) {
|
||
|
if (!LuaClosure(f)) {
|
||
|
setnilvalue(s2v(L->top.p));
|
||
|
setnilvalue2s(L->top.p);
|
||
|
api_incr_top(L);
|
||
|
}
|
||
|
else {
|
||
| ... | ... | |
|
kname(p, k, name);
|
||
|
return isEnv(p, lastpc, i, 1);
|
||
|
}
|
||
|
case OP_GETTABLE: {
|
||
|
case OP_GETTABLE: case OP_GETVARG: {
|
||
|
int k = GETARG_C(i); /* key index */
|
||
|
rname(p, lastpc, k, name);
|
||
|
return isEnv(p, lastpc, i, 0);
|
||
| dependencies/lua-5.5/src/ldo.c | ||
|---|---|---|
|
/*
|
||
|
** Check whether stack has enough space to run a simple function (such
|
||
|
** as a finalizer): At least BASIC_STACK_SIZE in the Lua stack and
|
||
|
** 2 slots in the C stack.
|
||
|
** Check whether stacks have enough space to run a simple function (such
|
||
|
** as a finalizer): At least BASIC_STACK_SIZE in the Lua stack, two
|
||
|
** available CallInfos, and two "slots" in the C stack.
|
||
|
*/
|
||
|
int luaD_checkminstack (lua_State *L) {
|
||
|
return ((stacksize(L) < MAXSTACK - BASIC_STACK_SIZE) &&
|
||
|
(getCcalls(L) < LUAI_MAXCCALLS - 2));
|
||
|
if (getCcalls(L) >= LUAI_MAXCCALLS - 2)
|
||
|
return 0; /* not enough C-stack slots */
|
||
|
if (L->ci->next == NULL && luaE_extendCI(L, 0) == NULL)
|
||
|
return 0; /* unable to allocate first ci */
|
||
|
if (L->ci->next->next == NULL && luaE_extendCI(L, 0) == NULL)
|
||
|
return 0; /* unable to allocate second ci */
|
||
|
if (L->stack_last.p - L->top.p >= BASIC_STACK_SIZE)
|
||
|
return 1; /* enough (BASIC_STACK_SIZE) free slots in the Lua stack */
|
||
|
else /* try to grow stack to a size with enough free slots */
|
||
|
return luaD_growstack(L, BASIC_STACK_SIZE, 0);
|
||
|
}
|
||
| ... | ... | |
|
correctstack(L, oldstack); /* change offsets back to pointers */
|
||
|
L->stack_last.p = L->stack.p + newsize;
|
||
|
for (i = oldsize + EXTRA_STACK; i < newsize + EXTRA_STACK; i++)
|
||
|
setnilvalue(s2v(newstack + i)); /* erase new segment */
|
||
|
setnilvalue2s(newstack + i); /* erase new segment */
|
||
|
return 1;
|
||
|
}
|
||
| ... | ... | |
|
luaE_shrinkCI(L); /* shrink CI list */
|
||
|
}
|
||
|
void luaD_inctop (lua_State *L) {
|
||
|
L->top.p++;
|
||
|
luaD_checkstack(L, 1);
|
||
|
}
|
||
|
/* }================================================================== */
|
||
| ... | ... | |
|
for (i = 0; i < nres; i++) /* move all results to correct place */
|
||
|
setobjs2s(L, res + i, firstresult + i);
|
||
|
for (; i < wanted; i++) /* complete wanted number of results */
|
||
|
setnilvalue(s2v(res + i));
|
||
|
setnilvalue2s(res + i);
|
||
|
L->top.p = res + wanted; /* top points after the last result */
|
||
|
}
|
||
| ... | ... | |
|
return;
|
||
|
case 1 + 1: /* one value needed */
|
||
|
if (nres == 0) /* no results? */
|
||
|
setnilvalue(s2v(res)); /* adjust with nil */
|
||
|
setnilvalue2s(res); /* adjust with nil */
|
||
|
else /* at least one result */
|
||
|
setobjs2s(L, res, L->top.p - nres); /* move it to proper place */
|
||
|
L->top.p = res + 1;
|
||
| ... | ... | |
|
#define next_ci(L) (L->ci->next ? L->ci->next : luaE_extendCI(L))
|
||
|
#define next_ci(L) (L->ci->next ? L->ci->next : luaE_extendCI(L, 1))
|
||
|
/*
|
||
| ... | ... | |
|
setobjs2s(L, ci->func.p + i, func + i);
|
||
|
func = ci->func.p; /* moved-down function */
|
||
|
for (; narg1 <= nfixparams; narg1++)
|
||
|
setnilvalue(s2v(func + narg1)); /* complete missing arguments */
|
||
|
setnilvalue2s(func + narg1); /* complete missing arguments */
|
||
|
ci->top.p = func + 1 + fsize; /* top for new function */
|
||
|
lua_assert(ci->top.p <= L->stack_last.p);
|
||
|
ci->u.l.savedpc = p->code; /* starting point */
|
||
| ... | ... | |
|
L->ci = ci = prepCallInfo(L, func, status, func + 1 + fsize);
|
||
|
ci->u.l.savedpc = p->code; /* starting point */
|
||
|
for (; narg < nfixparams; narg++)
|
||
|
setnilvalue(s2v(L->top.p++)); /* complete missing arguments */
|
||
|
setnilvalue2s(L->top.p++); /* complete missing arguments */
|
||
|
lua_assert(ci->top.p <= L->stack_last.p);
|
||
|
return ci;
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
/*
|
||
|
** Before the first call to the reader function, Lua reserves a slot
|
||
|
** with a table for anchoring stuff.
|
||
|
*/
|
||
|
static void f_parser (lua_State *L, void *ud) {
|
||
|
LClosure *cl;
|
||
|
struct SParser *p = cast(struct SParser *, ud);
|
||
|
const char *mode = p->mode ? p->mode : "bt";
|
||
|
int c = zgetc(p->z); /* read first character */
|
||
|
int c;
|
||
|
Table *anchor;
|
||
|
ptrdiff_t otop = savestack(L, L->top.p); /* original top */
|
||
|
luaD_checkstack(L, 2);
|
||
|
anchor = luaH_new(L); /* create the anchor table */
|
||
|
sethvalue2s(L, L->top.p++, anchor); /* anchor the anchor table */
|
||
|
c = zgetc(p->z); /* read first character */
|
||
|
if (c == LUA_SIGNATURE[0]) {
|
||
|
int fixed = 0;
|
||
|
if (strchr(mode, 'B') != NULL)
|
||
|
fixed = 1;
|
||
|
else
|
||
|
checkmode(L, mode, "binary");
|
||
|
cl = luaU_undump(L, p->z, p->name, fixed);
|
||
|
cl = luaU_undump(L, p->z, anchor, p->name, fixed);
|
||
|
}
|
||
|
else {
|
||
|
checkmode(L, mode, "text");
|
||
|
cl = luaY_parser(L, p->z, &p->buff, &p->dyd, p->name, c);
|
||
|
cl = luaY_parser(L, p->z, anchor, &p->buff, &p->dyd, p->name, c);
|
||
|
}
|
||
|
L->top.p = restorestack(L, otop); /* restore stack */
|
||
|
setclLvalue2s(L, L->top.p++, cl); /* push closure */
|
||
|
lua_assert(cl->nupvalues == cl->p->sizeupvalues);
|
||
|
luaF_initupvals(L, cl);
|
||
|
}
|
||
|
/*
|
||
|
** Anchor an object in a table in the stack. First, anchor the object
|
||
|
** temporarily in the stack, as luaH_set may call an emergency GC.
|
||
|
** Then, add it in the table with itself as its key.
|
||
|
*/
|
||
|
void luaD_anchorobj (lua_State *L, Table *anchor, GCObject *obj) {
|
||
|
setgcovalue(L, s2v(L->top.p++), obj); /* temporary anchor in the stack */
|
||
|
luaH_set(L, anchor, s2v(L->top.p - 1), s2v(L->top.p - 1));
|
||
|
/* Because this is a new key, luaH_set will call the GC barrier, so
|
||
|
we don't need to call the barrier again here */
|
||
|
L->top.p--;
|
||
|
}
|
||
|
TStatus luaD_protectedparser (lua_State *L, ZIO *z, const char *name,
|
||
|
const char *mode) {
|
||
|
struct SParser p;
|
||
| dependencies/lua-5.5/src/ldo.h | ||
|---|---|---|
|
LUAI_FUNC int luaD_reallocstack (lua_State *L, int newsize, int raiseerror);
|
||
|
LUAI_FUNC int luaD_growstack (lua_State *L, int n, int raiseerror);
|
||
|
LUAI_FUNC void luaD_shrinkstack (lua_State *L);
|
||
|
LUAI_FUNC void luaD_inctop (lua_State *L);
|
||
|
LUAI_FUNC int luaD_checkminstack (lua_State *L);
|
||
|
LUAI_FUNC void luaD_anchorobj (lua_State *L, Table *anchor, GCObject *obj);
|
||
|
LUAI_FUNC l_noret luaD_throw (lua_State *L, TStatus errcode);
|
||
|
LUAI_FUNC l_noret luaD_throwbaselevel (lua_State *L, TStatus errcode);
|
||
| dependencies/lua-5.5/src/lgc.c | ||
|---|---|---|
|
if (!g->gcemergency)
|
||
|
luaD_shrinkstack(th); /* do not change stack in emergency cycle */
|
||
|
for (o = th->top.p; o < th->stack_last.p + EXTRA_STACK; o++)
|
||
|
setnilvalue(s2v(o)); /* clear dead stack slice */
|
||
|
setnilvalue2s(o); /* clear dead stack slice */
|
||
|
/* 'remarkupvals' may have removed thread from 'twups' list */
|
||
|
if (!isintwups(th) && th->openupval != NULL) {
|
||
|
th->twups = g->twups; /* link it back to the list */
|
||
| ... | ... | |
|
correctgraylists(g);
|
||
|
checkSizes(L, g);
|
||
|
g->gcstate = GCSpropagate; /* skip restart */
|
||
|
if (!g->gcemergency && luaD_checkminstack(L))
|
||
|
if (g->tobefnz != NULL && !g->gcemergency && luaD_checkminstack(L))
|
||
|
callallpendingfinalizers(L);
|
||
|
}
|
||
| ... | ... | |
|
GCTM(L); /* call one finalizer */
|
||
|
stepresult = CWUFIN;
|
||
|
}
|
||
|
else { /* no more finalizers or emergency mode or no enough stack
|
||
|
else { /* no more finalizers or emergency mode or not enough stack
|
||
|
to run finalizers */
|
||
|
g->gcstate = GCSpause; /* finish collection */
|
||
|
stepresult = step2pause;
|
||
| dependencies/lua-5.5/src/llex.c | ||
|---|---|---|
|
so they cannot be collected */
|
||
|
ls->envn = luaS_newliteral(L, LUA_ENV); /* get env string */
|
||
|
ls->brkn = luaS_newliteral(L, "break"); /* get "break" string */
|
||
|
#if defined(LUA_COMPAT_GLOBAL)
|
||
|
#if LUA_COMPAT_GLOBAL
|
||
|
/* compatibility mode: "global" is not a reserved word */
|
||
|
ls->glbn = luaS_newliteral(L, "global"); /* get "global" string */
|
||
|
ls->glbn->extra = 0; /* mark it as not reserved */
|
||
| dependencies/lua-5.5/src/llimits.h | ||
|---|---|---|
|
/* floor division (defined as 'floor(a/b)') */
|
||
|
#if !defined(luai_numidiv)
|
||
|
#define luai_numidiv(L,a,b) ((void)L, l_floor(luai_numdiv(L,a,b)))
|
||
|
#define luai_numidiv(L,a,b) l_floor(luai_numdiv(L,a,b))
|
||
|
#endif
|
||
|
/* float division */
|
||
|
#if !defined(luai_numdiv)
|
||
|
#define luai_numdiv(L,a,b) ((a)/(b))
|
||
|
#define luai_numdiv(L,a,b) ((void)L, (a)/(b))
|
||
|
#endif
|
||
|
/*
|
||
| ... | ... | |
|
/* the others are quite standard operations */
|
||
|
#if !defined(luai_numadd)
|
||
|
#define luai_numadd(L,a,b) ((a)+(b))
|
||
|
#define luai_numsub(L,a,b) ((a)-(b))
|
||
|
#define luai_nummul(L,a,b) ((a)*(b))
|
||
|
#define luai_numunm(L,a) (-(a))
|
||
|
#define luai_numadd(L,a,b) ((void)L, (a)+(b))
|
||
|
#define luai_numsub(L,a,b) ((void)L, (a)-(b))
|
||
|
#define luai_nummul(L,a,b) ((void)L, (a)*(b))
|
||
|
#define luai_numunm(L,a) ((void)L, -(a))
|
||
|
#define luai_numeq(a,b) ((a)==(b))
|
||
|
#define luai_numlt(a,b) ((a)<(b))
|
||
|
#define luai_numle(a,b) ((a)<=(b))
|
||
| dependencies/lua-5.5/src/loadlib.c | ||
|---|---|---|
|
const char *name = luaL_checkstring(L, 1);
|
||
|
filename = findfile(L, name, "path", LUA_LSUBSEP);
|
||
|
if (filename == NULL) return 1; /* module not found in this path */
|
||
|
return checkload(L, (luaL_loadfile(L, filename) == LUA_OK), filename);
|
||
|
return checkload(L, (luaL_loadfilex(L, filename, "bt") == LUA_OK), filename);
|
||
|
}
|
||
| dependencies/lua-5.5/src/lobject.h | ||
|---|---|---|
|
#define ttisstrictnil(o) checktag((o), LUA_VNIL)
|
||
|
#define setnilvalue(obj) settt_(obj, LUA_VNIL)
|
||
|
#define setnilvalue(obj) settt_(obj, LUA_VNIL)
|
||
|
#define setnilvalue2s(stk) setnilvalue(s2v(stk))
|
||
|
#define isabstkey(v) checktag((v), LUA_VABSTKEY)
|
||
| dependencies/lua-5.5/src/lopcodes.c | ||
|---|---|---|
|
,opmode(0, 1, 0, 0, 1, iABC) /* OP_VARARG */
|
||
|
,opmode(0, 0, 0, 0, 1, iABC) /* OP_GETVARG */
|
||
|
,opmode(0, 0, 0, 0, 0, iABx) /* OP_ERRNNIL */
|
||
|
,opmode(0, 0, 1, 0, 1, iABC) /* OP_VARARGPREP */
|
||
|
,opmode(0, 0, 0, 0, 0, iABC) /* OP_VARARGPREP */
|
||
|
,opmode(0, 0, 0, 0, 0, iAx) /* OP_EXTRAARG */
|
||
|
};
|
||
|
/*
|
||
|
** Check whether instruction sets top for next instruction, that is,
|
||
|
** it results in multiple values.
|
||
|
*/
|
||
|
int luaP_isOT (Instruction i) {
|
||
|
OpCode op = GET_OPCODE(i);
|
||
|
switch (op) {
|
||
|
case OP_TAILCALL: return 1;
|
||
|
default:
|
||
|
return testOTMode(op) && GETARG_C(i) == 0;
|
||
|
}
|
||
|
}
|
||
|
#define testITMode(m) (luaP_opmodes[m] & (1 << 5))
|
||
|
/*
|
||
|
** Check whether instruction uses top from previous instruction, that is,
|
||
|
** it accepts multiple results.
|
||
|
** Check whether instruction uses top. That happens for OP_VARARGPREP
|
||
|
** and for instructions that use multiple values set by the previous
|
||
|
** instruction.
|
||
|
*/
|
||
|
int luaP_isIT (Instruction i) {
|
||
|
OpCode op = GET_OPCODE(i);
|
||
|
switch (op) {
|
||
|
case OP_SETLIST:
|
||
|
return testITMode(GET_OPCODE(i)) && GETARG_vB(i) == 0;
|
||
|
return GETARG_vB(i) == 0;
|
||
|
case OP_VARARGPREP:
|
||
|
return 1;
|
||
|
default:
|
||
|
return testITMode(GET_OPCODE(i)) && GETARG_B(i) == 0;
|
||
|
}
|
||
| dependencies/lua-5.5/src/lopcodes.h | ||
|---|---|---|
|
** bits 0-2: op mode
|
||
|
** bit 3: instruction set register A
|
||
|
** bit 4: operator is a test (next instruction must be a jump)
|
||
|
** bit 5: instruction uses 'L->top' set by previous instruction (when B == 0)
|
||
|
** bit 6: instruction sets 'L->top' for next instruction (when C == 0)
|
||
|
** bit 5: used by 'luaP_isIT'
|
||
|
** bit 6: used by 'luaP_isOT'
|
||
|
** bit 7: instruction is an MM instruction (call a metamethod)
|
||
|
*/
|
||
| ... | ... | |
|
#define getOpMode(m) (cast(enum OpMode, luaP_opmodes[m] & 7))
|
||
|
#define testAMode(m) (luaP_opmodes[m] & (1 << 3))
|
||
|
#define testTMode(m) (luaP_opmodes[m] & (1 << 4))
|
||
|
#define testITMode(m) (luaP_opmodes[m] & (1 << 5))
|
||
|
#define testOTMode(m) (luaP_opmodes[m] & (1 << 6))
|
||
|
#define testMMMode(m) (luaP_opmodes[m] & (1 << 7))
|
||
|
LUAI_FUNC int luaP_isOT (Instruction i);
|
||
|
/* Check whether instruction sets top for next instruction, that is,
|
||
|
** it results in multiple values. Used only for tests.
|
||
|
*/
|
||
|
#define luaP_isOT(i) \
|
||
|
(GET_OPCODE(i) == OP_TAILCALL || \
|
||
|
((luaP_opmodes[GET_OPCODE(i)] & (1 << 6)) && GETARG_C(i) == 0))
|
||
|
LUAI_FUNC int luaP_isIT (Instruction i);
|
||
| dependencies/lua-5.5/src/lparser.c | ||
|---|---|---|
|
luaC_objbarrier(L, f, f->source);
|
||
|
f->maxstacksize = 2; /* registers 0/1 are always valid */
|
||
|
fs->kcache = luaH_new(L); /* create table for function */
|
||
|
sethvalue2s(L, L->top.p, fs->kcache); /* anchor it */
|
||
|
luaD_inctop(L);
|
||
|
luaD_anchorobj(L, ls->h, obj2gco(fs->kcache)); /* anchor it */
|
||
|
enterblock(fs, bl, 0);
|
||
|
}
|
||
| ... | ... | |
|
lua_State *L = ls->L;
|
||
|
FuncState *fs = ls->fs;
|
||
|
Proto *f = fs->f;
|
||
|
TValue temp;
|
||
|
luaK_ret(fs, luaY_nvarstack(fs), 0); /* final return */
|
||
|
leaveblock(fs);
|
||
|
lua_assert(fs->bl == NULL);
|
||
| ... | ... | |
|
luaM_shrinkvector(L, f->p, f->sizep, fs->np, Proto *);
|
||
|
luaM_shrinkvector(L, f->locvars, f->sizelocvars, fs->ndebugvars, LocVar);
|
||
|
luaM_shrinkvector(L, f->upvalues, f->sizeupvalues, fs->nups, Upvaldesc);
|
||
|
/* remove kcache table from scanner table ("weigh" its anchor) */
|
||
|
sethvalue(L, &temp, fs->kcache); /* key to be set to nil */
|
||
|
luaH_set(L, ls->h, &temp, &G(L)->nilvalue);
|
||
|
ls->fs = fs->prev;
|
||
|
L->top.p--; /* pop kcache table */
|
||
|
luaC_checkGC(L);
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
default: {
|
||
|
luaX_syntaxerror(ls, "function arguments expected");
|
||
|
return; /* to avoid warnings */
|
||
|
}
|
||
|
}
|
||
|
lua_assert(f->k == VNONRELOC);
|
||
| ... | ... | |
|
statlist(ls);
|
||
|
check_match(ls, TK_UNTIL, TK_REPEAT, line);
|
||
|
condexit = cond(ls); /* read condition (inside scope block) */
|
||
|
leaveblock(fs); /* finish scope */
|
||
|
if (bl2.upval) { /* upvalues? */
|
||
|
int exit = luaK_jump(fs); /* normal exit must jump over fix */
|
||
|
luaK_patchtohere(fs, condexit); /* repetition must close upvalues */
|
||
| ... | ... | |
|
luaK_patchtohere(fs, exit); /* normal exit comes to here */
|
||
|
}
|
||
|
luaK_patchlist(fs, condexit, repeat_init); /* close the loop */
|
||
|
leaveblock(fs); /* finish scope */
|
||
|
leaveblock(fs); /* finish loop */
|
||
|
}
|
||
| ... | ... | |
|
gotostat(ls, line);
|
||
|
break;
|
||
|
}
|
||
|
#if defined(LUA_COMPAT_GLOBAL)
|
||
|
#if LUA_COMPAT_GLOBAL
|
||
|
case TK_NAME: {
|
||
|
/* compatibility code to parse global keyword when "global"
|
||
|
is not reserved */
|
||
| ... | ... | |
|
}
|
||
|
LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
|
||
|
LClosure *luaY_parser (lua_State *L, ZIO *z, Table *anchor, Mbuffer *buff,
|
||
|
Dyndata *dyd, const char *name, int firstchar) {
|
||
|
LexState lexstate;
|
||
|
FuncState funcstate;
|
||
|
LClosure *cl = luaF_newLclosure(L, 1); /* create main closure */
|
||
|
setclLvalue2s(L, L->top.p, cl); /* anchor it (to avoid being collected) */
|
||
|
luaD_inctop(L);
|
||
|
lexstate.h = luaH_new(L); /* create table for scanner */
|
||
|
sethvalue2s(L, L->top.p, lexstate.h); /* anchor it */
|
||
|
luaD_inctop(L);
|
||
|
LClosure *cl;
|
||
|
lexstate.h = anchor; /* table for scanner */
|
||
|
cl = luaF_newLclosure(L, 1); /* create main closure */
|
||
|
luaD_anchorobj(L, anchor, obj2gco(cl)); /* anchor it in scanner table */
|
||
|
funcstate.f = cl->p = luaF_newproto(L);
|
||
|
luaC_objbarrier(L, cl, cl->p);
|
||
|
funcstate.f->source = luaS_new(L, name); /* create and anchor TString */
|
||
| ... | ... | |
|
lua_assert(!funcstate.prev && funcstate.nups == 1 && !lexstate.fs);
|
||
|
/* all scopes should be correctly finished */
|
||
|
lua_assert(dyd->actvar.n == 0 && dyd->gt.n == 0 && dyd->label.n == 0);
|
||
|
L->top.p--; /* remove scanner's table */
|
||
|
return cl; /* closure is on the stack, too */
|
||
|
return cl;
|
||
|
}
|
||
| dependencies/lua-5.5/src/lparser.h | ||
|---|---|---|
|
LUAI_FUNC lu_byte luaY_nvarstack (FuncState *fs);
|
||
|
LUAI_FUNC void luaY_checklimit (FuncState *fs, int v, int l,
|
||
|
const char *what);
|
||
|
LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Mbuffer *buff,
|
||
|
Dyndata *dyd, const char *name, int firstchar);
|
||
|
LUAI_FUNC LClosure *luaY_parser (lua_State *L, ZIO *z, Table *anchor,
|
||
|
Mbuffer *buff, Dyndata *dyd,
|
||
|
const char *name, int firstchar);
|
||
|
#endif
|
||
| dependencies/lua-5.5/src/lstate.c | ||
|---|---|---|
|
}
|
||
|
CallInfo *luaE_extendCI (lua_State *L) {
|
||
|
CallInfo *luaE_extendCI (lua_State *L, int err) {
|
||
|
CallInfo *ci;
|
||
|
lua_assert(L->ci->next == NULL);
|
||
|
ci = luaM_new(L, CallInfo);
|
||
|
lua_assert(L->ci->next == NULL);
|
||
|
L->ci->next = ci;
|
||
|
ci = luaM_reallocvector(L, NULL, 0, 1, CallInfo);
|
||
|
if (l_unlikely(ci == NULL)) { /* allocation failed? */
|
||
|
if (err)
|
||
|
luaM_error(L); /* raise the error */
|
||
|
return NULL; /* else only report it */
|
||
|
}
|
||
|
ci->next = L->ci->next;
|
||
|
ci->previous = L->ci;
|
||
|
ci->next = NULL;
|
||
|
L->ci->next = ci;
|
||
|
if (ci->next)
|
||
|
ci->next->previous = ci;
|
||
|
ci->u.l.trap = 0;
|
||
|
L->nci++;
|
||
|
return ci;
|
||
| ... | ... | |
|
static void resetCI (lua_State *L) {
|
||
|
CallInfo *ci = L->ci = &L->base_ci;
|
||
|
ci->func.p = L->stack.p;
|
||
|
setnilvalue(s2v(ci->func.p)); /* 'function' entry for basic 'ci' */
|
||
|
setnilvalue2s(ci->func.p); /* 'function' entry for basic 'ci' */
|
||
|
ci->top.p = ci->func.p + 1 + LUA_MINSTACK; /* +1 for 'function' entry */
|
||
|
ci->u.c.k = NULL;
|
||
|
ci->callstatus = CIST_C;
|
||
| ... | ... | |
|
L1->stack.p = luaM_newvector(L, BASIC_STACK_SIZE + EXTRA_STACK, StackValue);
|
||
|
L1->tbclist.p = L1->stack.p;
|
||
|
for (i = 0; i < BASIC_STACK_SIZE + EXTRA_STACK; i++)
|
||
|
setnilvalue(s2v(L1->stack.p + i)); /* erase new stack */
|
||
|
setnilvalue2s(L1->stack.p + i); /* erase new stack */
|
||
|
L1->stack_last.p = L1->stack.p + BASIC_STACK_SIZE;
|
||
|
/* initialize first ci */
|
||
|
resetCI(L1);
|
||
| dependencies/lua-5.5/src/lstate.h | ||
|---|---|---|
|
/*
|
||
|
** Union of all collectable objects (only for conversions)
|
||
|
** Union of all collectable objects
|
||
|
** ISO C99, 6.5.2.3 p.5:
|
||
|
** "if a union contains several structures that share a common initial
|
||
|
** sequence [...], and if the union object currently contains one
|
||
| ... | ... | |
|
};
|
||
|
/*
|
||
|
** ISO C99, 6.7.2.1 p.14:
|
||
|
** "A pointer to a union object, suitably converted, points to each of
|
||
|
** its members [...], and vice versa."
|
||
|
/* macros to convert a GCObject into a specific value
|
||
|
** ISO C99, 6.3.2.2 p.7:
|
||
|
** "A pointer to an object or incomplete type may be converted to a
|
||
|
** pointer to a different object or incomplete type. If the resulting
|
||
|
** pointer is not correctly aligned for the pointed-to type, the
|
||
|
** behavior is undefined. Otherwise, when converted back again, the
|
||
|
** result shall compare equal to the original pointer."
|
||
|
*/
|
||
|
#define cast_u(o) cast(union GCUnion *, (o))
|
||
|
/* macros to convert a GCObject into a specific value */
|
||
|
#define gco2ts(o) \
|
||
|
check_exp(novariant((o)->tt) == LUA_TSTRING, &((cast_u(o))->ts))
|
||
|
#define gco2u(o) check_exp((o)->tt == LUA_VUSERDATA, &((cast_u(o))->u))
|
||
|
#define gco2lcl(o) check_exp((o)->tt == LUA_VLCL, &((cast_u(o))->cl.l))
|
||
|
#define gco2ccl(o) check_exp((o)->tt == LUA_VCCL, &((cast_u(o))->cl.c))
|
||
|
#define gco2cl(o) \
|
||
|
check_exp(novariant((o)->tt) == LUA_TFUNCTION, &((cast_u(o))->cl))
|
||
|
#define gco2t(o) check_exp((o)->tt == LUA_VTABLE, &((cast_u(o))->h))
|
||
|
#define gco2p(o) check_exp((o)->tt == LUA_VPROTO, &((cast_u(o))->p))
|
||
|
#define gco2th(o) check_exp((o)->tt == LUA_VTHREAD, &((cast_u(o))->th))
|
||
|
#define gco2upv(o) check_exp((o)->tt == LUA_VUPVAL, &((cast_u(o))->upv))
|
||
|
#define gco2(v,T,o) check_exp((o)->tt == v, cast(T*, o))
|
||
|
#define gco2nv(t,T,o) check_exp(novariant((o)->tt) == t, cast(T*, o))
|
||
|
#define gco2ts(o) gco2nv(LUA_TSTRING, TString, o)
|
||
|
#define gco2u(o) gco2(LUA_VUSERDATA, Udata, o)
|
||
|
#define gco2lcl(o) (&gco2(LUA_VLCL, Closure, o)->l)
|
||
|
#define gco2ccl(o) (&gco2(LUA_VCCL, Closure, o)->c)
|
||
|
#define gco2cl(o) gco2nv(LUA_TFUNCTION, Closure, o)
|
||
|
#define gco2t(o) gco2(LUA_VTABLE, Table, o)
|
||
|
#define gco2p(o) gco2(LUA_VPROTO, Proto, o)
|
||
|
#define gco2th(o) gco2(LUA_VTHREAD, lua_State, o)
|
||
|
#define gco2upv(o) gco2(LUA_VUPVAL, UpVal, o)
|
||
|
/*
|
||
|
** macro to convert a Lua object into a GCObject
|
||
|
*/
|
||
|
#define obj2gco(v) \
|
||
|
check_exp(novariant((v)->tt) >= LUA_TSTRING, &(cast_u(v)->gc))
|
||
|
check_exp(novariant((v)->tt) >= LUA_TSTRING, cast(GCObject*, v))
|
||
|
/* actual number of total memory allocated */
|
||
| ... | ... | |
|
LUAI_FUNC void luaE_setdebt (global_State *g, l_mem debt);
|
||
|
LUAI_FUNC void luaE_freethread (lua_State *L, lua_State *L1);
|
||
|
LUAI_FUNC lu_mem luaE_threadsize (lua_State *L);
|
||
|
LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L);
|
||
|
LUAI_FUNC CallInfo *luaE_extendCI (lua_State *L, int err);
|
||
|
LUAI_FUNC void luaE_shrinkCI (lua_State *L);
|
||
|
LUAI_FUNC void luaE_checkcstack (lua_State *L);
|
||
|
LUAI_FUNC void luaE_incCstack (lua_State *L);
|
||
| dependencies/lua-5.5/src/lstrlib.c | ||
|---|---|---|
|
const char *s = luaL_checklstring(L, 1, &len);
|
||
|
lua_Integer n = luaL_checkinteger(L, 2);
|
||
|
const char *sep = luaL_optlstring(L, 3, "", &lsep);
|
||
|
if (n <= 0)
|
||
|
lua_pushliteral(L, "");
|
||
|
if (n <= 0 || (len | lsep) == 0)
|
||
|
lua_pushliteral(L, ""); /* no repetitions or both strings empty */
|
||
|
else if (l_unlikely(len > MAX_SIZE - lsep ||
|
||
|
cast_st2S(len + lsep) > cast_st2S(MAX_SIZE) / n))
|
||
|
return luaL_error(L, "resulting string too large");
|
||
| ... | ... | |
|
}
|
||
|
/*
|
||
|
** Prepare state for matches. These fields are not affected by each match.
|
||
|
*/
|
||
|
static void prepstate (MatchState *ms, lua_State *L,
|
||
|
const char *s, size_t ls, const char *p, size_t lp) {
|
||
|
ms->L = L;
|
||
|
ms->matchdepth = MAXCCALLS;
|
||
|
ms->src_init = s;
|
||
|
ms->src_end = s + ls;
|
||
|
ms->p_end = p + lp;
|
||
|
}
|
||
|
/*
|
||
|
** (Re)prepare state for a match, setting fields that change during
|
||
|
** each match.
|
||
|
*/
|
||
|
static void reprepstate (MatchState *ms) {
|
||
|
ms->matchdepth = MAXCCALLS;
|
||
|
ms->level = 0;
|
||
|
lua_assert(ms->matchdepth == MAXCCALLS);
|
||
|
}
|
||
| ... | ... | |
|
reprepstate(&ms); /* (re)prepare state for new match */
|
||
|
if ((e = match(&ms, src, p)) != NULL && e != lastmatch) { /* match? */
|
||
|
n++;
|
||
|
changed = add_value(&ms, &b, src, e, tr) | changed;
|
||
|
changed = add_value(&ms, &b, src, e, tr) || changed;
|
||
|
src = lastmatch = e;
|
||
|
}
|
||
|
else if (src < ms.src_end) /* otherwise, skip one character */
|
||
| dependencies/lua-5.5/src/ltable.c | ||
|---|---|---|
|
/*
|
||
|
** Exchange the hash part of 't1' and 't2'. (In 'flags', only the
|
||
|
** dummy bit must be exchanged: The 'isrealasize' is not related
|
||
|
** to the hash part, and the metamethod bits do not change during
|
||
|
** a resize, so the "real" table can keep their values.)
|
||
|
** Exchange the hash part of 't1' and 't2'. (In 'flags', only the dummy
|
||
|
** bit must be exchanged: The metamethod bits do not change during a
|
||
|
** resize, so the "real" table can keep their values.)
|
||
|
*/
|
||
|
static void exchangehashpart (Table *t1, Table *t2) {
|
||
|
lu_byte lsizenode = t1->lsizenode;
|
||
| ... | ... | |
|
lua_assert(hres != HOK);
|
||
|
if (hres == HNOTFOUND) {
|
||
|
TValue aux;
|
||
|
const TValue *actk = key; /* actual key to insert */
|
||
|
if (l_unlikely(ttisnil(key)))
|
||
|
luaG_runerror(L, "table index is nil");
|
||
|
else if (ttisfloat(key)) {
|
||
|
lua_Number f = fltvalue(key);
|
||
|
lua_Integer k;
|
||
|
if (luaV_flttointeger(f, &k, F2Ieq)) {
|
||
|
setivalue(&aux, k); /* key is equal to an integer */
|
||
|
key = &aux; /* insert it as an integer */
|
||
|
if (luaV_flttointeger(f, &k, F2Ieq)) { /* is key equal to an integer? */
|
||
|
setivalue(&aux, k);
|
||
|
actk = &aux; /* use the integer as the key */
|
||
|
}
|
||
|
else if (l_unlikely(luai_numisnan(f)))
|
||
|
luaG_runerror(L, "table index is NaN");
|
||
| ... | ... | |
|
L->top.p--;
|
||
|
return;
|
||
|
}
|
||
|
luaH_newkey(L, t, key, value);
|
||
|
luaH_newkey(L, t, actk, value);
|
||
|
}
|
||
|
else if (hres > 0) { /* regular Node? */
|
||
|
setobj2t(L, gval(gnode(t, hres - HFIRSTNODE)), value);
|
||
| dependencies/lua-5.5/src/ltablib.c | ||
|---|---|---|
|
/*
|
||
|
** Check that 'arg' either is a table or can behave like one (that is,
|
||
|
** has a metatable with the required metamethods)
|
||
|
** has a metatable with the required metamethods).
|
||
|
*/
|
||
|
static void checktab (lua_State *L, int arg, int what) {
|
||
|
if (lua_type(L, arg) != LUA_TTABLE) { /* is it not a table? */
|
||
|
int tp = lua_type(L, arg);
|
||
|
if (tp != LUA_TTABLE) { /* is it not a table? */
|
||
|
int n = 1; /* number of elements to pop */
|
||
|
if (lua_getmetatable(L, arg) && /* must have metatable */
|
||
|
(!(what & TAB_R) || checkfield(L, "__index", ++n)) &&
|
||
|
(!(what & TAB_W) || checkfield(L, "__newindex", ++n)) &&
|
||
|
(!(what & TAB_L) || checkfield(L, "__len", ++n))) {
|
||
|
(!(what & TAB_L) || /* strings don't need '__len' to have a length */
|
||
|
tp == LUA_TSTRING || checkfield(L, "__len", ++n))) {
|
||
|
lua_pop(L, n); /* pop metatable and tested metamethods */
|
||
|
}
|
||
|
else
|
||
| ... | ... | |
|
static int tunpack (lua_State *L) {
|
||
|
lua_Unsigned n;
|
||
|
lua_Integer len = aux_getn(L, 1, TAB_R);
|
||
|
lua_Integer i = luaL_optinteger(L, 2, 1);
|
||
|
lua_Integer e = luaL_opt(L, luaL_checkinteger, 3, luaL_len(L, 1));
|
||
|
lua_Integer e = luaL_opt(L, luaL_checkinteger, 3, len);
|
||
|
if (i > e) return 0; /* empty range */
|
||
|
n = l_castS2U(e) - l_castS2U(i); /* number of elements minus 1 */
|
||
|
if (l_unlikely(n >= (unsigned int)INT_MAX ||
|
||
| dependencies/lua-5.5/src/ltm.c | ||
|---|---|---|
|
/* move fixed parameters to after the copied function */
|
||
|
for (i = 1; i <= nfixparams; i++) {
|
||
|
setobjs2s(L, L->top.p++, ci->func.p + i);
|
||
|
setnilvalue(s2v(ci->func.p + i)); /* erase original parameter (for GC) */
|
||
|
setnilvalue2s(ci->func.p + i); /* erase original parameter (for GC) */
|
||
|
}
|
||
|
ci->func.p += totalargs + 1; /* 'func' now lives after hidden arguments */
|
||
|
ci->top.p += totalargs + 1;
|
||
| ... | ... | |
|
lua_assert(p->flag & PF_VAHID);
|
||
|
buildhiddenargs(L, ci, p, totalargs, nfixparams, nextra);
|
||
|
/* set vararg parameter to nil */
|
||
|
setnilvalue(s2v(ci->func.p + nfixparams + 1));
|
||
|
setnilvalue2s(ci->func.p + nfixparams + 1);
|
||
|
lua_assert(L->top.p <= ci->top.p && ci->top.p <= L->stack_last.p);
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
return;
|
||
|
}
|
||
|
}
|
||
|
setnilvalue(s2v(ra)); /* else produce nil */
|
||
|
setnilvalue2s(ra); /* else produce nil */
|
||
|
}
|
||
| ... | ... | |
|
for (i = 0; i < touse; i++) {
|
||
|
lu_byte tag = luaH_getint(h, i + 1, s2v(where + i));
|
||
|
if (tagisempty(tag))
|
||
|
setnilvalue(s2v(where + i));
|
||
|
setnilvalue2s(where + i);
|
||
|
}
|
||
|
}
|
||
|
for (; i < wanted; i++) /* complete required results with nil */
|
||
|
setnilvalue(s2v(where + i));
|
||
|
setnilvalue2s(where + i);
|
||
|
}
|
||
| dependencies/lua-5.5/src/ltm.h | ||
|---|---|---|
|
** Mask with 1 in all fast-access methods. A 1 in any of these bits
|
||
|
** in the flag of a (meta)table means the metatable does not have the
|
||
|
** corresponding metamethod field. (Bit 6 of the flag indicates that
|
||
|
** the table is using the dummy node; bit 7 is used for 'isrealasize'.)
|
||
|
** the table is using the dummy node.)
|
||
|
*/
|
||
|
#define maskflags cast_byte(~(~0u << (TM_EQ + 1)))
|
||
| dependencies/lua-5.5/src/lua.h | ||
|---|---|---|
|
#include <stddef.h>
|
||
|
#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2025 Lua.org, PUC-Rio"
|
||
|
#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2026 Lua.org, PUC-Rio"
|
||
|
#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes"
|
||
|
#define LUA_VERSION_MAJOR_N 5
|
||
|
#define LUA_VERSION_MINOR_N 5
|
||
|
#define LUA_VERSION_RELEASE_N 0
|
||
|
#define LUA_VERSION_RELEASE_N 1
|
||
|
#define LUA_VERSION_NUM (LUA_VERSION_MAJOR_N * 100 + LUA_VERSION_MINOR_N)
|
||
|
#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + LUA_VERSION_RELEASE_N)
|
||
| ... | ... | |
|
/******************************************************************************
|
||
|
* Copyright (C) 1994-2025 Lua.org, PUC-Rio.
|
||
|
* Copyright (C) 1994-2026 Lua.org, PUC-Rio.
|
||
|
*
|
||
|
* Permission is hereby granted, free of charge, to any person obtaining
|
||
|
* a copy of this software and associated documentation files (the
|
||
| dependencies/lua-5.5/src/luaconf.h | ||
|---|---|---|
|
#if defined(LUA_USE_LINUX)
|
||
|
#define LUA_USE_POSIX
|
||
|
#define LUA_USE_DLOPEN /* needs an extra library: -ldl */
|
||
|
#if !defined(LUA_READLINELIB)
|
||
|
#define LUA_READLINELIB "libreadline.so"
|
||
|
#endif
|
||
|
#endif
|
||
|
#if defined(LUA_USE_MACOSX)
|
||
|
#define LUA_USE_POSIX
|
||
|
#define LUA_USE_DLOPEN /* macOS does not need -ldl */
|
||
|
#define LUA_READLINELIB "libedit.dylib"
|
||
|
#define LUA_USE_READLINE /* needs an extra library: -lreadline */
|
||
|
#endif
|
||
| ... | ... | |
|
#if !defined(LUA_PATH_DEFAULT)
|
||
|
#define LUA_PATH_DEFAULT \
|
||
|
LUA_LDIR"?.lua;" LUA_LDIR"?\\init.lua;" \
|
||
|
LUA_CDIR"?.lua;" LUA_CDIR"?\\init.lua;" \
|
||
|
LUA_SHRDIR"?.lua;" LUA_SHRDIR"?\\init.lua;" \
|
||
|
LUA_LDIR "?.lua;" LUA_LDIR "?\\init.lua;" \
|
||
|
LUA_CDIR "?.lua;" LUA_CDIR "?\\init.lua;" \
|
||
|
LUA_SHRDIR "?.lua;" LUA_SHRDIR "?\\init.lua;" \
|
||
|
".\\?.lua;" ".\\?\\init.lua"
|
||
|
#endif
|
||
|
#if !defined(LUA_CPATH_DEFAULT)
|
||
|
#define LUA_CPATH_DEFAULT \
|
||
|
LUA_CDIR"?.dll;" \
|
||
|
LUA_CDIR"..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \
|
||
|
LUA_CDIR"loadall.dll;" ".\\?.dll"
|
||
|
LUA_CDIR "?.dll;" \
|
||
|
LUA_CDIR "..\\lib\\lua\\" LUA_VDIR "\\?.dll;" \
|
||
|
LUA_CDIR "loadall.dll;" ".\\?.dll"
|
||
|
#endif
|
||
|
#else /* }{ */
|
||
| ... | ... | |
|
#if !defined(LUA_PATH_DEFAULT)
|
||
|
#define LUA_PATH_DEFAULT \
|
||
|
LUA_LDIR"?.lua;" LUA_LDIR"?/init.lua;" \
|
||
|
LUA_CDIR"?.lua;" LUA_CDIR"?/init.lua;" \
|
||
|
LUA_LDIR "?.lua;" LUA_LDIR "?/init.lua;" \
|
||
|
LUA_CDIR "?.lua;" LUA_CDIR "?/init.lua;" \
|
||
|
"./?.lua;" "./?/init.lua"
|
||
|
#endif
|
||
|
#if !defined(LUA_CPATH_DEFAULT)
|
||
|
#define LUA_CPATH_DEFAULT \
|
||
|
LUA_CDIR"?.so;" LUA_CDIR"loadall.so;" "./?.so"
|
||
|
LUA_CDIR "?.so;" LUA_CDIR "loadall.so;" "./?.so"
|
||
|
#endif
|
||
|
#endif /* } */
|
||
| ... | ... | |
|
/*
|
||
|
@@ LUA_COMPAT_GLOBAL avoids 'global' being a reserved word
|
||
|
*/
|
||
|
#define LUA_COMPAT_GLOBAL
|
||
|
#if !defined(LUA_COMPAT_GLOBAL)
|
||
|
#define LUA_COMPAT_GLOBAL 1
|
||
|
#endif
|
||
|
/*
|
||
| ... | ... | |
|
*/
|
||
|
#if !defined(luai_likely)
|
||
|
#if defined(__GNUC__) && !defined(LUA_NOBUILTIN)
|
||
|
#if !defined(LUA_NOBUILTIN) && defined(__GNUC__) && (__GNUC__ >= 3)
|
||
|
#define luai_likely(x) (__builtin_expect(((x) != 0), 1))
|
||
|
#define luai_unlikely(x) (__builtin_expect(((x) != 0), 0))
|
||
|
#else
|
||
| ... | ... | |
|
/*
|
||
|
@@ LUAI_MAXALIGN defines fields that, when used in a union, ensure
|
||
|
** maximum alignment for the other items in that union.
|
||
|
@@ LUAI_MAXALIGN defines fields that ensure proper alignment for
|
||
|
** memory areas offered by Lua (e.g., userdata memory).
|
||
|
** Add fields to it if you need alignment for non-ISO objects.
|
||
|
*/
|
||
|
#if defined(LLONG_MAX)
|
||
|
/* use ISO C99 stuff */
|
||
|
#define LUAI_MAXALIGN long double u; void *s; long long l
|
||
|
#else
|
||
|
/* use only C89 stuff */
|
||
|
#define LUAI_MAXALIGN lua_Number n; double u; void *s; lua_Integer i; long l
|
||
|
#endif
|
||
|
/* }================================================================== */
|
||
| dependencies/lua-5.5/src/lundump.c | ||
|---|---|---|
|
/*
|
||
|
** Load precompiled chunk.
|
||
|
*/
|
||
|
LClosure *luaU_undump (lua_State *L, ZIO *Z, const char *name, int fixed) {
|
||
|
LClosure *luaU_undump (lua_State *L, ZIO *Z, Table *anchor, const char *name,
|
||
|
int fixed) {
|
||
|
LoadState S;
|
||
|
LClosure *cl;
|
||
|
if (*name == '@' || *name == '=')
|
||
| ... | ... | |
|
S.fixed = cast_byte(fixed);
|
||
|
S.offset = 1; /* fist byte was already read */
|
||
|
checkHeader(&S);
|
||
|
cl = luaF_newLclosure(L, loadByte(&S));
|
||
|
setclLvalue2s(L, L->top.p, cl);
|
||
|
luaD_inctop(L);
|
||
|
S.h = luaH_new(L); /* create list of saved strings */
|
||
|
S.h = anchor;
|
||
|
S.nstr = 0;
|
||
|
sethvalue2s(L, L->top.p, S.h); /* anchor it */
|
||
|
luaD_inctop(L);
|
||
|
cl = luaF_newLclosure(L, loadByte(&S));
|
||
|
luaD_anchorobj(L, anchor, obj2gco(cl));
|
||
|
cl->p = luaF_newproto(L);
|
||
|
luaC_objbarrier(L, cl, cl->p);
|
||
|
loadFunction(&S, cl->p);
|
||
|
if (cl->nupvalues != cl->p->sizeupvalues)
|
||
|
error(&S, "corrupted chunk");
|
||
|
luai_verifycode(L, cl->p);
|
||
|
L->top.p--; /* pop table */
|
||
|
return cl;
|
||
|
}
|
||
| dependencies/lua-5.5/src/lundump.h | ||
|---|---|---|
|
/* load one chunk; from lundump.c */
|
||
|
LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, const char* name,
|
||
|
int fixed);
|
||
|
LUAI_FUNC LClosure* luaU_undump (lua_State* L, ZIO* Z, Table *anchor,
|
||
|
const char* name, int fixed);
|
||
|
/* dump one chunk; from ldump.c */
|
||
|
LUAI_FUNC int luaU_dump (lua_State* L, const Proto* f, lua_Writer w,
|
||
| dependencies/lua-5.5/src/lutf8lib.c | ||
|---|---|---|
|
static void pushutfchar (lua_State *L, int arg) {
|
||
|
lua_Unsigned code = (lua_Unsigned)luaL_checkinteger(L, arg);
|
||
|
luaL_argcheck(L, code <= MAXUTF, arg, "value out of range");
|
||
|
lua_pushfstring(L, "%U", (long)code);
|
||
|
lua_pushfstring(L, "%U", cast(unsigned long, code));
|
||
|
}
|
||
| dependencies/lua-5.5/src/lvm.c | ||
|---|---|---|
|
/*
|
||
|
** Execute a step of a float numerical for loop, returning
|
||
|
** true iff the loop must continue. (The integer case is
|
||
|
** written online with opcode OP_FORLOOP, for performance.)
|
||
|
** written inline with opcode OP_FORLOOP, for performance.)
|
||
|
*/
|
||
|
static int floatforloop (StkId ra) {
|
||
|
static int floatforloop (lua_State *L, StkId ra) {
|
||
|
lua_Number step = fltvalue(s2v(ra + 1));
|
||
|
lua_Number limit = fltvalue(s2v(ra));
|
||
|
lua_Number idx = fltvalue(s2v(ra + 2)); /* control variable */
|
||
| ... | ... | |
|
else { /* 't' is a table */
|
||
|
tm = fasttm(L, hvalue(t)->metatable, TM_INDEX); /* table's metamethod */
|
||
|
if (tm == NULL) { /* no metamethod? */
|
||
|
setnilvalue(s2v(val)); /* result is nil */
|
||
|
setnilvalue2s(val); /* result is nil */
|
||
|
return LUA_VNIL;
|
||
|
}
|
||
|
/* else will try the metamethod */
|
||
| ... | ... | |
|
luaT_callTM(L, tm, t, key, val);
|
||
|
return;
|
||
|
}
|
||
|
t = tm; /* else repeat assignment over 'tm' */
|
||
|
luaV_fastset(t, key, val, hres, luaH_pset);
|
||
|
if (hres == HOK) {
|
||
|
luaV_finishfastset(L, t, val);
|
||
|
return; /* done */
|
||
|
t = tm; /* else must repeat assignment over 'tm' */
|
||
|
/* do the equivalent to 'luaV_fastset', but saving 'h' */
|
||
|
if (!ttistable(t))
|
||
|
hres = HNOTATABLE;
|
||
|
else {
|
||
|
Table *h = hvalue(t); /* next call can change the value at 't' */
|
||
|
hres = luaH_pset(h, key, val);
|
||
|
if (hres == HOK) {
|
||
|
luaC_barrierback(L, obj2gco(h), val); /* luaV_finishfastset */
|
||
|
return; /* done */
|
||
|
}
|
||
|
}
|
||
|
/* else 'return luaV_finishset(L, t, key, val, slot)' (loop) */
|
||
|
/* else 'return luaV_finishset(L, t, key, val, hres)' (loop) */
|
||
|
}
|
||
|
luaG_runerror(L, "'__newindex' chain too long; possible loop");
|
||