Feature #1740 ยป 0037-lua-5.5-Update-to-lua-5.5.0-rc1.patch
| dependencies/lua-5.5/README | ||
|---|---|---|
|
This is Lua 5.5.0 (beta), released on 28 Jun 2025.
|
||
|
This is Lua 5.5.0, released on 14 Nov 2025.
|
||
|
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-beta
|
||
|
(http://www.lua.org/ftp/lua-5.5.0-beta.tar.gz)
|
||
|
Sources here are from lua-5.5.0-rc1
|
||
|
(http://www.lua.org/ftp/lua-5.5.0-rc1.tar.gz)
|
||
|
Upstream bug fixes from https://www.lua.org/bugs.html applied:
|
||
| dependencies/lua-5.5/doc/readme.html | ||
|---|---|---|
|
You need to build it before using it.
|
||
|
Building Lua should be straightforward
|
||
|
because
|
||
|
Lua is implemented in pure ANSI C and compiles unmodified in all known
|
||
|
platforms that have an ANSI C compiler.
|
||
|
Lua is implemented in pure ISO C and compiles unmodified in all known
|
||
|
platforms that have an ISO C compiler.
|
||
|
Lua also compiles unmodified as C++.
|
||
|
The instructions given below for building Lua are for Unix-like platforms,
|
||
|
such as Linux and macOS.
|
||
| ... | ... | |
|
<P CLASS="footer">
|
||
|
Last update:
|
||
|
Thu Jun 26 13:06:11 UTC 2025
|
||
|
Tue Sep 2 21:25:09 UTC 2025
|
||
|
</P>
|
||
|
<!--
|
||
|
Last change: revised for Lua 5.5.0
|
||
| dependencies/lua-5.5/freeciv_lua.patch | ||
|---|---|---|
|
diff -Nurd lua-5.5/src/ldo.c lua-5.5/src/ldo.c
|
||
|
--- lua-5.5/src/ldo.c 2025-07-05 05:37:52.108553768 +0300
|
||
|
+++ lua-5.5/src/ldo.c 2025-07-05 05:40:32.053318937 +0300
|
||
|
@@ -73,7 +73,7 @@
|
||
|
try { (f)(L, ud); } catch(...) { if ((c)->status == 0) (c)->status = -1; }
|
||
|
#define luai_jmpbuf int /* dummy field */
|
||
|
diff --git a/dependencies/lua-5.5/src/ldo.c b/dependencies/lua-5.5/src/ldo.c
|
||
|
index 44937068f8..eed4c99c96 100644
|
||
|
--- a/dependencies/lua-5.5/src/ldo.c
|
||
|
+++ b/dependencies/lua-5.5/src/ldo.c
|
||
|
@@ -92,7 +92,7 @@ static void LUAI_TRY (lua_State *L, lua_longjmp *c, Pfunc f, void *ud) {
|
||
|
}
|
||
|
|
||
|
|
||
|
-#elif defined(LUA_USE_POSIX) /* }{ */
|
||
|
+#elif defined(LUA_USE_ULONGJMP) /* }{ */
|
||
|
|
||
|
/* in POSIX, try _longjmp/_setjmp (more efficient) */
|
||
|
/* in POSIX, use _longjmp/_setjmp (more efficient) */
|
||
|
#define LUAI_THROW(L,c) _longjmp((c)->b, 1)
|
||
|
@@ -133,9 +133,9 @@
|
||
|
@@ -141,9 +141,9 @@ l_noret luaD_throw (lua_State *L, TStatus errcode) {
|
||
|
lua_unlock(L);
|
||
|
g->panic(L); /* call panic function (last chance to jump out) */
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
|
||
|
|
||
|
diff -Nurd lua-5.5/src/liolib.c lua-5.5/src/liolib.c
|
||
|
--- lua-5.5/src/liolib.c 2025-07-05 05:37:52.108553768 +0300
|
||
|
+++ lua-5.5/src/liolib.c 2025-07-05 05:40:32.053318937 +0300
|
||
|
@@ -53,7 +53,7 @@
|
||
|
diff --git a/dependencies/lua-5.5/src/liolib.c b/dependencies/lua-5.5/src/liolib.c
|
||
|
index 57615e6f32..ef44f5e671 100644
|
||
|
--- a/dependencies/lua-5.5/src/liolib.c
|
||
|
+++ b/dependencies/lua-5.5/src/liolib.c
|
||
|
@@ -53,7 +53,7 @@ static int l_checkmode (const char *mode) {
|
||
|
|
||
|
#if !defined(l_popen) /* { */
|
||
|
|
||
| ... | ... | |
|
|
||
|
#define l_popen(L,c,m) (fflush(NULL), popen(c,m))
|
||
|
#define l_pclose(L,file) (pclose(file))
|
||
|
@@ -114,7 +114,7 @@
|
||
|
@@ -114,7 +114,7 @@ static int l_checkmode (const char *mode) {
|
||
|
|
||
|
#if !defined(l_fseek) /* { */
|
||
|
|
||
|
-#if defined(LUA_USE_POSIX) /* { */
|
||
|
+#if defined(LUA_USE_FSEEKO) /* { */
|
||
|
-#if defined(LUA_USE_POSIX) || defined(LUA_USE_OFF_T) /* { */
|
||
|
+#if defined(LUA_USE_FSEEKO) || defined(LUA_USE_OFF_T) /* { */
|
||
|
|
||
|
#include <sys/types.h>
|
||
|
|
||
|
diff -Nurd lua-5.5/src/loslib.c lua-5.5/src/loslib.c
|
||
|
--- lua-5.5/src/loslib.c 2025-07-05 05:37:52.108553768 +0300
|
||
|
+++ lua-5.5/src/loslib.c 2025-07-05 05:40:32.053318937 +0300
|
||
|
diff --git a/dependencies/lua-5.5/src/loslib.c b/dependencies/lua-5.5/src/loslib.c
|
||
|
index b7a2b0d15f..f60519e14f 100644
|
||
|
--- a/dependencies/lua-5.5/src/loslib.c
|
||
|
+++ b/dependencies/lua-5.5/src/loslib.c
|
||
|
@@ -75,7 +75,7 @@
|
||
|
** where it uses gmtime_r/localtime_r
|
||
|
*/
|
||
| ... | ... | |
|
|
||
|
#include <unistd.h>
|
||
|
|
||
|
diff -Nurd lua-5.5/src/luaconf.h lua-5.5/src/luaconf.h
|
||
|
--- lua-5.5/src/luaconf.h 2025-07-05 05:37:52.108553768 +0300
|
||
|
+++ lua-5.5/src/luaconf.h 2025-07-05 05:40:32.053318937 +0300
|
||
|
diff --git a/dependencies/lua-5.5/src/luaconf.h b/dependencies/lua-5.5/src/luaconf.h
|
||
|
index 96a77802b9..500776acc0 100644
|
||
|
--- a/dependencies/lua-5.5/src/luaconf.h
|
||
|
+++ b/dependencies/lua-5.5/src/luaconf.h
|
||
|
@@ -11,6 +11,7 @@
|
||
|
#include <limits.h>
|
||
|
#include <stddef.h>
|
||
| dependencies/lua-5.5/src/lapi.c | ||
|---|---|---|
|
case LUA_VSHRSTR: return cast(lua_Unsigned, tsvalue(o)->shrlen);
|
||
|
case LUA_VLNGSTR: return cast(lua_Unsigned, tsvalue(o)->u.lnglen);
|
||
|
case LUA_VUSERDATA: return cast(lua_Unsigned, uvalue(o)->len);
|
||
|
case LUA_VTABLE: return luaH_getn(hvalue(o));
|
||
|
case LUA_VTABLE: {
|
||
|
lua_Unsigned res;
|
||
|
lua_lock(L);
|
||
|
res = luaH_getn(L, hvalue(o));
|
||
|
lua_unlock(L);
|
||
|
return res;
|
||
|
}
|
||
|
default: return 0;
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
/*
|
||
|
** Returns a pointer to the internal representation of an object.
|
||
|
** Note that ANSI C does not allow the conversion of a pointer to
|
||
|
** Note that ISO C does not allow the conversion of a pointer to
|
||
|
** function to a 'void*', so the conversion here goes through
|
||
|
** a 'size_t'. (As the returned pointer is only informative, this
|
||
|
** conversion should not be a problem.)
|
||
| ... | ... | |
|
/*
|
||
|
** The following function assumes that the registry cannot be a weak
|
||
|
** table, so that en mergency collection while using the global table
|
||
|
** table; so, an emergency collection while using the global table
|
||
|
** cannot collect it.
|
||
|
*/
|
||
|
static void getGlobalTable (lua_State *L, TValue *gt) {
|
||
| dependencies/lua-5.5/src/lauxlib.c | ||
|---|---|---|
|
static const char *getF (lua_State *L, void *ud, size_t *size) {
|
||
|
LoadF *lf = (LoadF *)ud;
|
||
|
(void)L; /* not used */
|
||
|
UNUSED(L);
|
||
|
if (lf->n > 0) { /* are there pre-read characters to be read? */
|
||
|
*size = lf->n; /* return them (chars already in buffer) */
|
||
|
lf->n = 0; /* no more pre-read characters */
|
||
| ... | ... | |
|
static const char *getS (lua_State *L, void *ud, size_t *size) {
|
||
|
LoadS *ls = (LoadS *)ud;
|
||
|
(void)L; /* not used */
|
||
|
UNUSED(L);
|
||
|
if (ls->size == 0) return NULL;
|
||
|
*size = ls->size;
|
||
|
ls->size = 0;
|
||
| ... | ... | |
|
}
|
||
|
static void *l_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
|
||
|
(void)ud; (void)osize; /* not used */
|
||
|
void *luaL_alloc (void *ud, void *ptr, size_t osize, size_t nsize) {
|
||
|
UNUSED(ud); UNUSED(osize);
|
||
|
if (nsize == 0) {
|
||
|
free(ptr);
|
||
|
return NULL;
|
||
| ... | ... | |
|
LUALIB_API unsigned int luaL_makeseed (lua_State *L) {
|
||
|
(void)L; /* unused */
|
||
|
UNUSED(L);
|
||
|
return luai_makeseed();
|
||
|
}
|
||
|
LUALIB_API lua_State *luaL_newstate (void) {
|
||
|
lua_State *L = lua_newstate(l_alloc, NULL, luai_makeseed());
|
||
|
/*
|
||
|
** Use the name with parentheses so that headers can redefine it
|
||
|
** as a macro.
|
||
|
*/
|
||
|
LUALIB_API lua_State *(luaL_newstate) (void) {
|
||
|
lua_State *L = lua_newstate(luaL_alloc, NULL, luaL_makeseed(NULL));
|
||
|
if (l_likely(L)) {
|
||
|
lua_atpanic(L, &panic);
|
||
|
lua_setwarnf(L, warnfoff, L); /* default is warnings off */
|
||
| 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);
|
||
|
/* predefined references */
|
||
|
#define LUA_NOREF (-2)
|
||
| dependencies/lua-5.5/src/lbaselib.c | ||
|---|---|---|
|
static int pairscont (lua_State *L, int status, lua_KContext k) {
|
||
|
(void)L; (void)status; (void)k; /* unused */
|
||
|
return 3;
|
||
|
return 4; /* __pairs did all the work, just return its results */
|
||
|
}
|
||
|
static int luaB_pairs (lua_State *L) {
|
||
|
luaL_checkany(L, 1);
|
||
|
if (luaL_getmetafield(L, 1, "__pairs") == LUA_TNIL) { /* no metamethod? */
|
||
|
lua_pushcfunction(L, luaB_next); /* will return generator, */
|
||
|
lua_pushvalue(L, 1); /* state, */
|
||
|
lua_pushnil(L); /* and initial value */
|
||
|
lua_pushcfunction(L, luaB_next); /* will return generator and */
|
||
|
lua_pushvalue(L, 1); /* state */
|
||
|
lua_pushnil(L); /* initial value */
|
||
|
lua_pushnil(L); /* to-be-closed object */
|
||
|
}
|
||
|
else {
|
||
|
lua_pushvalue(L, 1); /* argument 'self' to metamethod */
|
||
|
lua_callk(L, 1, 3, 0, pairscont); /* get 3 values from metamethod */
|
||
|
lua_callk(L, 1, 4, 0, pairscont); /* get 4 values from metamethod */
|
||
|
}
|
||
|
return 3;
|
||
|
return 4;
|
||
|
}
|
||
| dependencies/lua-5.5/src/lcode.c | ||
|---|---|---|
|
va_list argp;
|
||
|
pushvfstring(ls->L, argp, fmt, msg);
|
||
|
ls->t.token = 0; /* remove "near <token>" from final message */
|
||
|
ls->linenumber = ls->lastline; /* back to line of last used token */
|
||
|
luaX_syntaxerror(ls, msg);
|
||
|
}
|
||
| ... | ... | |
|
TValue val;
|
||
|
Proto *f = fs->f;
|
||
|
int tag = luaH_get(fs->kcache, key, &val); /* query scanner table */
|
||
|
int k;
|
||
|
if (!tagisempty(tag)) { /* is there an index there? */
|
||
|
k = cast_int(ivalue(&val));
|
||
|
int k = cast_int(ivalue(&val));
|
||
|
/* collisions can happen only for float keys */
|
||
|
lua_assert(ttisfloat(key) || luaV_rawequalobj(&f->k[k], v));
|
||
|
return k; /* reuse index */
|
||
|
}
|
||
|
/* constant not found; create a new entry */
|
||
|
k = addk(fs, f, v);
|
||
|
/* cache it for reuse; numerical value does not need GC barrier;
|
||
|
table is not a metatable, so it does not need to invalidate cache */
|
||
|
setivalue(&val, k);
|
||
|
luaH_set(fs->ls->L, fs->kcache, key, &val);
|
||
|
return k;
|
||
|
else { /* constant not found; create a new entry */
|
||
|
int k = addk(fs, f, v);
|
||
|
/* cache it for reuse; numerical value does not need GC barrier;
|
||
|
table is not a metatable, so it does not need to invalidate cache */
|
||
|
setivalue(&val, k);
|
||
|
luaH_set(fs->ls->L, fs->kcache, key, &val);
|
||
|
return k;
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
/*
|
||
|
** Add a float to list of constants and return its index. Floats
|
||
|
** with integral values need a different key, to avoid collision
|
||
|
** with actual integers. To that, we add to the number its smaller
|
||
|
** with actual integers. To that end, we add to the number its smaller
|
||
|
** power-of-two fraction that is still significant in its scale.
|
||
|
** For doubles, that would be 1/2^52.
|
||
|
** (For doubles, the fraction would be 2^-52).
|
||
|
** This method is not bulletproof: different numbers may generate the
|
||
|
** same key (e.g., very large numbers will overflow to 'inf') and for
|
||
|
** floats larger than 2^53 the result is still an integer. At worst,
|
||
|
** this only wastes an entry with a duplicate.
|
||
|
** floats larger than 2^53 the result is still an integer. For those
|
||
|
** cases, just generate a new entry. At worst, this only wastes an entry
|
||
|
** with a duplicate.
|
||
|
*/
|
||
|
static int luaK_numberK (FuncState *fs, lua_Number r) {
|
||
|
TValue o, kv;
|
||
| ... | ... | |
|
const lua_Number k = r * (1 + q); /* key */
|
||
|
lua_Integer ik;
|
||
|
setfltvalue(&kv, k); /* key as a TValue */
|
||
|
if (!luaV_flttointeger(k, &ik, F2Ieq)) { /* not an integral value? */
|
||
|
if (!luaV_flttointeger(k, &ik, F2Ieq)) { /* not an integer value? */
|
||
|
int n = k2proto(fs, &kv, &o); /* use key */
|
||
|
if (luaV_rawequalobj(&fs->f->k[n], &o)) /* correct value? */
|
||
|
return n;
|
||
| ... | ... | |
|
}
|
||
|
/*
|
||
|
** Get the value of 'var' in a register and generate an opcode to check
|
||
|
** whether that register is nil. 'k' is the index of the variable name
|
||
|
** in the list of constants. If its value cannot be encoded in Bx, a 0
|
||
|
** will use '?' for the name.
|
||
|
*/
|
||
|
void luaK_codecheckglobal (FuncState *fs, expdesc *var, int k, int line) {
|
||
|
luaK_exp2anyreg(fs, var);
|
||
|
luaK_fixline(fs, line);
|
||
|
k = (k >= MAXARG_Bx) ? 0 : k + 1;
|
||
|
luaK_codeABx(fs, OP_ERRNNIL, var->u.info, k);
|
||
|
luaK_fixline(fs, line);
|
||
|
freeexp(fs, var);
|
||
|
}
|
||
|
/*
|
||
|
** Convert a constant in 'v' into an expression description 'e'
|
||
|
*/
|
||
| ... | ... | |
|
}
|
||
|
}
|
||
|
/*
|
||
|
** Change a vararg parameter into a regular local variable
|
||
|
*/
|
||
|
void luaK_vapar2local (FuncState *fs, expdesc *var) {
|
||
|
fs->f->flag |= PF_VATAB; /* function will need a vararg table */
|
||
|
/* now a vararg parameter is equivalent to a regular local variable */
|
||
|
var->k = VLOCAL;
|
||
|
}
|
||
|
/*
|
||
|
** Ensure that expression 'e' is not a variable (nor a <const>).
|
||
| ... | ... | |
|
const2exp(const2val(fs, e), e);
|
||
|
break;
|
||
|
}
|
||
|
case VVARGVAR: {
|
||
|
luaK_vapar2local(fs, e); /* turn it into a local variable */
|
||
|
} /* 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->k = VRELOC;
|
||
|
break;
|
||
|
}
|
||
|
case VVARGIND: {
|
||
|
freeregs(fs, e->u.ind.t, e->u.ind.idx);
|
||
|
e->u.info = luaK_codeABC(fs, OP_GETVARG, 0, e->u.ind.t, e->u.ind.idx);
|
||
|
e->k = VRELOC;
|
||
|
break;
|
||
|
}
|
||
|
case VVARARG: case VCALL: {
|
||
|
luaK_setoneret(fs, e);
|
||
|
break;
|
||
| ... | ... | |
|
/*
|
||
|
** Ensures final expression result is either in a register
|
||
|
** or in an upvalue.
|
||
|
** Ensures final expression result is either in a register,
|
||
|
** in an upvalue, or it is the vararg parameter.
|
||
|
*/
|
||
|
void luaK_exp2anyregup (FuncState *fs, expdesc *e) {
|
||
|
if (e->k != VUPVAL || hasjumps(e))
|
||
|
if ((e->k != VUPVAL && e->k != VVARGVAR) || hasjumps(e))
|
||
|
luaK_exp2anyreg(fs, e);
|
||
|
}
|
||
| ... | ... | |
|
codeABRK(fs, OP_SETFIELD, var->u.ind.t, var->u.ind.idx, ex);
|
||
|
break;
|
||
|
}
|
||
|
case VVARGIND: {
|
||
|
fs->f->flag |= PF_VATAB; /* function will need a vararg table */
|
||
|
/* now, assignment is to a regular table */
|
||
|
} /* FALLTHROUGH */
|
||
|
case VINDEXED: {
|
||
|
codeABRK(fs, OP_SETTABLE, var->u.ind.t, var->u.ind.idx, ex);
|
||
|
break;
|
||
| ... | ... | |
|
/*
|
||
|
** Emit code to go through if 'e' is false, jump otherwise.
|
||
|
*/
|
||
|
void luaK_goiffalse (FuncState *fs, expdesc *e) {
|
||
|
static void luaK_goiffalse (FuncState *fs, expdesc *e) {
|
||
|
int pc; /* pc of new jump */
|
||
|
luaK_dischargevars(fs, e);
|
||
|
switch (e->k) {
|
||
| ... | ... | |
|
** Check whether expression 'e' is a short literal string
|
||
|
*/
|
||
|
static int isKstr (FuncState *fs, expdesc *e) {
|
||
|
return (e->k == VK && !hasjumps(e) && e->u.info <= MAXARG_B &&
|
||
|
return (e->k == VK && !hasjumps(e) && e->u.info <= MAXINDEXRK &&
|
||
|
ttisshrstring(&fs->f->k[e->u.info]));
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
/* auxiliary function to define indexing expressions */
|
||
|
static void fillidxk (expdesc *t, int idx, expkind k) {
|
||
|
t->u.ind.idx = cast_byte(idx);
|
||
|
t->k = k;
|
||
|
}
|
||
|
/*
|
||
|
** Create expression 't[k]'. 't' must have its final result already in a
|
||
|
** register or upvalue. Upvalues can only be indexed by literal strings.
|
||
| ... | ... | |
|
if (k->k == VKSTR)
|
||
|
keystr = str2K(fs, k);
|
||
|
lua_assert(!hasjumps(t) &&
|
||
|
(t->k == VLOCAL || t->k == VNONRELOC || t->k == VUPVAL));
|
||
|
(t->k == VLOCAL || t->k == VVARGVAR ||
|
||
|
t->k == VNONRELOC || t->k == VUPVAL));
|
||
|
if (t->k == VUPVAL && !isKstr(fs, k)) /* upvalue indexed by non 'Kstr'? */
|
||
|
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) */
|
||
|
lua_assert(isKstr(fs, k));
|
||
|
t->u.ind.idx = cast_short(k->u.info); /* literal short string */
|
||
|
t->k = VINDEXUP;
|
||
|
fillidxk(t, k->u.info, VINDEXUP); /* literal short string */
|
||
|
}
|
||
|
else if (t->k == VVARGVAR) { /* indexing the vararg parameter? */
|
||
|
lua_assert(t->u.ind.t == fs->f->numparams);
|
||
|
t->u.ind.t = cast_byte(t->u.var.ridx);
|
||
|
fillidxk(t, luaK_exp2anyreg(fs, k), VVARGIND); /* register */
|
||
|
}
|
||
|
else {
|
||
|
/* register index of the table */
|
||
|
t->u.ind.t = cast_byte((t->k == VLOCAL) ? t->u.var.ridx: t->u.info);
|
||
|
if (isKstr(fs, k)) {
|
||
|
t->u.ind.idx = cast_short(k->u.info); /* literal short string */
|
||
|
t->k = VINDEXSTR;
|
||
|
}
|
||
|
else if (isCint(k)) { /* int. constant in proper range? */
|
||
|
t->u.ind.idx = cast_short(k->u.ival);
|
||
|
t->k = VINDEXI;
|
||
|
}
|
||
|
else {
|
||
|
t->u.ind.idx = cast_short(luaK_exp2anyreg(fs, k)); /* register */
|
||
|
t->k = VINDEXED;
|
||
|
}
|
||
|
if (isKstr(fs, k))
|
||
|
fillidxk(t, k->u.info, VINDEXSTR); /* literal short string */
|
||
|
else if (isCint(k)) /* int. constant in proper range? */
|
||
|
fillidxk(t, cast_int(k->u.ival), VINDEXI);
|
||
|
else
|
||
|
fillidxk(t, luaK_exp2anyreg(fs, k), VINDEXED); /* register */
|
||
|
}
|
||
|
t->u.ind.keystr = keystr; /* string index in 'k' */
|
||
|
t->u.ind.ro = 0; /* by default, not read-only */
|
||
| ... | ... | |
|
SETARG_C(*pc, p->numparams + 1); /* signal that it is vararg */
|
||
|
break;
|
||
|
}
|
||
|
case OP_JMP: {
|
||
|
case OP_GETVARG: {
|
||
|
if (p->flag & PF_VATAB) /* function has a vararg table? */
|
||
|
SET_OPCODE(*pc, OP_GETTABLE); /* must get vararg there */
|
||
|
break;
|
||
|
}
|
||
|
case OP_JMP: { /* to optimize jumps to jumps */
|
||
|
int target = finaltarget(p->code, i);
|
||
|
fixjump(fs, i, target);
|
||
|
fixjump(fs, i, target); /* jump directly to final target */
|
||
|
break;
|
||
|
}
|
||
|
default: break;
|
||
| dependencies/lua-5.5/src/lcode.h | ||
|---|---|---|
|
LUAI_FUNC int luaK_exp2const (FuncState *fs, const expdesc *e, TValue *v);
|
||
|
LUAI_FUNC void luaK_fixline (FuncState *fs, int line);
|
||
|
LUAI_FUNC void luaK_nil (FuncState *fs, int from, int n);
|
||
|
LUAI_FUNC void luaK_codecheckglobal (FuncState *fs, expdesc *var, int k,
|
||
|
int line);
|
||
|
LUAI_FUNC void luaK_reserveregs (FuncState *fs, int n);
|
||
|
LUAI_FUNC void luaK_checkstack (FuncState *fs, int n);
|
||
|
LUAI_FUNC void luaK_int (FuncState *fs, int reg, lua_Integer n);
|
||
|
LUAI_FUNC void luaK_vapar2local (FuncState *fs, expdesc *var);
|
||
|
LUAI_FUNC void luaK_dischargevars (FuncState *fs, expdesc *e);
|
||
|
LUAI_FUNC int luaK_exp2anyreg (FuncState *fs, expdesc *e);
|
||
|
LUAI_FUNC void luaK_exp2anyregup (FuncState *fs, expdesc *e);
|
||
| ... | ... | |
|
LUAI_FUNC void luaK_self (FuncState *fs, expdesc *e, expdesc *key);
|
||
|
LUAI_FUNC void luaK_indexed (FuncState *fs, expdesc *t, expdesc *k);
|
||
|
LUAI_FUNC void luaK_goiftrue (FuncState *fs, expdesc *e);
|
||
|
LUAI_FUNC void luaK_goiffalse (FuncState *fs, expdesc *e);
|
||
|
LUAI_FUNC void luaK_storevar (FuncState *fs, expdesc *var, expdesc *e);
|
||
|
LUAI_FUNC void luaK_setreturns (FuncState *fs, expdesc *e, int nresults);
|
||
|
LUAI_FUNC void luaK_setoneret (FuncState *fs, expdesc *e);
|
||
| dependencies/lua-5.5/src/lctype.c | ||
|---|---|---|
|
#if defined (LUA_UCID) /* accept UniCode IDentifiers? */
|
||
|
/* consider all non-ascii codepoints to be alphabetic */
|
||
|
/* consider all non-ASCII codepoints to be alphabetic */
|
||
|
#define NONA 0x01
|
||
|
#else
|
||
|
#define NONA 0x00 /* default */
|
||
| dependencies/lua-5.5/src/ldebug.c | ||
|---|---|---|
|
}
|
||
|
l_noret luaG_errnnil (lua_State *L, LClosure *cl, int k) {
|
||
|
const char *globalname = "?"; /* default name if k == 0 */
|
||
|
if (k > 0)
|
||
|
kname(cl->p, k - 1, &globalname);
|
||
|
luaG_runerror(L, "global '%s' already defined", globalname);
|
||
|
}
|
||
|
/* add src:line information to 'msg' */
|
||
|
const char *luaG_addinfo (lua_State *L, const char *msg, TString *src,
|
||
|
int line) {
|
||
| dependencies/lua-5.5/src/ldebug.h | ||
|---|---|---|
|
const TValue *p2);
|
||
|
LUAI_FUNC l_noret luaG_ordererror (lua_State *L, const TValue *p1,
|
||
|
const TValue *p2);
|
||
|
LUAI_FUNC l_noret luaG_errnnil (lua_State *L, LClosure *cl, int k);
|
||
|
LUAI_FUNC l_noret luaG_runerror (lua_State *L, const char *fmt, ...);
|
||
|
LUAI_FUNC const char *luaG_addinfo (lua_State *L, const char *msg,
|
||
|
TString *src, int line);
|
||
| dependencies/lua-5.5/src/ldo.c | ||
|---|---|---|
|
** =======================================================
|
||
|
*/
|
||
|
/* chained list of long jump buffers */
|
||
|
typedef struct lua_longjmp {
|
||
|
struct lua_longjmp *previous;
|
||
|
jmp_buf b;
|
||
|
volatile TStatus status; /* error code */
|
||
|
} lua_longjmp;
|
||
|
/*
|
||
|
** LUAI_THROW/LUAI_TRY define how Lua does exception handling. By
|
||
|
** default, Lua handles errors with exceptions when compiling as
|
||
|
** C++ code, with _longjmp/_setjmp when asked to use them, and with
|
||
|
** C++ code, with _longjmp/_setjmp when available (POSIX), and with
|
||
|
** longjmp/setjmp otherwise.
|
||
|
*/
|
||
|
#if !defined(LUAI_THROW) /* { */
|
||
| ... | ... | |
|
/* C++ exceptions */
|
||
|
#define LUAI_THROW(L,c) throw(c)
|
||
|
#define LUAI_TRY(L,c,f,ud) \
|
||
|
try { (f)(L, ud); } catch(...) { if ((c)->status == 0) (c)->status = -1; }
|
||
|
#define luai_jmpbuf int /* dummy field */
|
||
|
static void LUAI_TRY (lua_State *L, lua_longjmp *c, Pfunc f, void *ud) {
|
||
|
try {
|
||
|
f(L, ud); /* call function protected */
|
||
|
}
|
||
|
catch (lua_longjmp *c1) { /* Lua error */
|
||
|
if (c1 != c) /* not the correct level? */
|
||
|
throw; /* rethrow to upper level */
|
||
|
}
|
||
|
catch (...) { /* non-Lua exception */
|
||
|
c->status = -1; /* create some error code */
|
||
|
}
|
||
|
}
|
||
|
#elif defined(LUA_USE_ULONGJMP) /* }{ */
|
||
|
/* in POSIX, try _longjmp/_setjmp (more efficient) */
|
||
|
/* in POSIX, use _longjmp/_setjmp (more efficient) */
|
||
|
#define LUAI_THROW(L,c) _longjmp((c)->b, 1)
|
||
|
#define LUAI_TRY(L,c,f,ud) if (_setjmp((c)->b) == 0) ((f)(L, ud))
|
||
|
#define luai_jmpbuf jmp_buf
|
||
|
#else /* }{ */
|
||
|
/* ISO C handling with long jumps */
|
||
|
#define LUAI_THROW(L,c) longjmp((c)->b, 1)
|
||
|
#define LUAI_TRY(L,c,f,ud) if (setjmp((c)->b) == 0) ((f)(L, ud))
|
||
|
#define luai_jmpbuf jmp_buf
|
||
|
#endif /* } */
|
||
|
#endif /* } */
|
||
|
/* chain list of long jump buffers */
|
||
|
struct lua_longjmp {
|
||
|
struct lua_longjmp *previous;
|
||
|
luai_jmpbuf b;
|
||
|
volatile TStatus status; /* error code */
|
||
|
};
|
||
|
void luaD_seterrorobj (lua_State *L, TStatus errcode, StkId oldtop) {
|
||
|
if (errcode == LUA_ERRMEM) { /* memory error? */
|
||
|
setsvalue2s(L, oldtop, G(L)->memerrmsg); /* reuse preregistered msg. */
|
||
| ... | ... | |
|
TStatus luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
|
||
|
l_uint32 oldnCcalls = L->nCcalls;
|
||
|
struct lua_longjmp lj;
|
||
|
lua_longjmp lj;
|
||
|
lj.status = LUA_OK;
|
||
|
lj.previous = L->errorJmp; /* chain new error handler */
|
||
|
L->errorJmp = &lj;
|
||
| ... | ... | |
|
#define STACKERRSPACE 200
|
||
|
/*
|
||
|
** LUAI_MAXSTACK limits the size of the Lua stack.
|
||
|
** It must fit into INT_MAX/2.
|
||
|
*/
|
||
|
#if !defined(LUAI_MAXSTACK)
|
||
|
#if 1000000 < (INT_MAX / 2)
|
||
|
#define LUAI_MAXSTACK 1000000
|
||
|
#else
|
||
|
#define LUAI_MAXSTACK (INT_MAX / 2u)
|
||
|
#endif
|
||
|
#endif
|
||
|
/* maximum stack size that respects size_t */
|
||
|
#define MAXSTACK_BYSIZET ((MAX_SIZET / sizeof(StackValue)) - STACKERRSPACE)
|
||
| ... | ... | |
|
#define ERRORSTACKSIZE (MAXSTACK + STACKERRSPACE)
|
||
|
/* raise an error while running the message handler */
|
||
|
/* raise a stack error while running the message handler */
|
||
|
l_noret luaD_errerr (lua_State *L) {
|
||
|
TString *msg = luaS_newliteral(L, "error in error handling");
|
||
|
setsvalue2s(L, L->top.p, msg);
|
||
| ... | ... | |
|
a stack error; cannot grow further than that. */
|
||
|
lua_assert(stacksize(L) == ERRORSTACKSIZE);
|
||
|
if (raiseerror)
|
||
|
luaD_errerr(L); /* error inside message handler */
|
||
|
luaD_errerr(L); /* stack error inside message handler */
|
||
|
return 0; /* if not 'raiseerror', just signal it */
|
||
|
}
|
||
|
else if (n < MAXSTACK) { /* avoids arithmetic overflows */
|
||
| dependencies/lua-5.5/src/ldump.c | ||
|---|---|---|
|
/*
|
||
|
** Dump a String. First dump its "size": size==0 means NULL;
|
||
|
** size==1 is followed by an index and means "reuse saved string with
|
||
|
** that index"; size>=2 is followed by the string contents with real
|
||
|
** size==size-2 and means that string, which will be saved with
|
||
|
** the next available index.
|
||
|
** Dump a String. First dump its "size":
|
||
|
** size==0 is followed by an index and means "reuse saved string with
|
||
|
** that index"; index==0 means NULL.
|
||
|
** size>=1 is followed by the string contents with real size==size-1 and
|
||
|
** means that string, which will be saved with the next available index.
|
||
|
** The real size does not include the ending '\0' (which is not dumped),
|
||
|
** so adding 1 to it cannot overflow a size_t.
|
||
|
*/
|
||
|
static void dumpString (DumpState *D, TString *ts) {
|
||
|
if (ts == NULL)
|
||
|
dumpSize(D, 0);
|
||
|
if (ts == NULL) {
|
||
|
dumpVarint(D, 0); /* will "reuse" NULL */
|
||
|
dumpVarint(D, 0); /* special index for NULL */
|
||
|
}
|
||
|
else {
|
||
|
TValue idx;
|
||
|
int tag = luaH_getstr(D->h, ts, &idx);
|
||
|
if (!tagisempty(tag)) { /* string already saved? */
|
||
|
dumpVarint(D, 1); /* reuse a saved string */
|
||
|
dumpVarint(D, 0); /* reuse a saved string */
|
||
|
dumpVarint(D, l_castS2U(ivalue(&idx))); /* index of saved string */
|
||
|
}
|
||
|
else { /* must write and save the string */
|
||
|
TValue key, value; /* to save the string in the hash */
|
||
|
size_t size;
|
||
|
const char *s = getlstr(ts, size);
|
||
|
dumpSize(D, size + 2);
|
||
|
dumpSize(D, size + 1);
|
||
|
dumpVector(D, s, size + 1); /* include ending '\0' */
|
||
|
D->nstr++; /* one more saved string */
|
||
|
setsvalue(D->L, &key, ts); /* the string is the key */
|
||
| dependencies/lua-5.5/src/lfunc.c | ||
|---|---|---|
|
*/
|
||
|
void luaF_closeupval (lua_State *L, StkId level) {
|
||
|
UpVal *uv;
|
||
|
StkId upl; /* stack index pointed by 'uv' */
|
||
|
while ((uv = L->openupval) != NULL && (upl = uplevel(uv)) >= level) {
|
||
|
while ((uv = L->openupval) != NULL && uplevel(uv) >= level) {
|
||
|
TValue *slot = &uv->u.value; /* new position for value */
|
||
|
lua_assert(uplevel(uv) < L->top.p);
|
||
|
luaF_unlinkupval(uv); /* remove upvalue from 'openupval' list */
|
||
| dependencies/lua-5.5/src/lgc.c | ||
|---|---|---|
|
*/
|
||
|
static int getmode (global_State *g, Table *h) {
|
||
|
const TValue *mode = gfasttm(g, h->metatable, TM_MODE);
|
||
|
if (mode == NULL || !ttisshrstring(mode))
|
||
|
return 0; /* ignore non-(short)string modes */
|
||
|
if (mode == NULL || !ttisstring(mode))
|
||
|
return 0; /* ignore non-string modes */
|
||
|
else {
|
||
|
const char *smode = getshrstr(tsvalue(mode));
|
||
|
const char *smode = getstr(tsvalue(mode));
|
||
|
const char *weakkey = strchr(smode, 'k');
|
||
|
const char *weakvalue = strchr(smode, 'v');
|
||
|
return ((weakkey != NULL) << 1) | (weakvalue != NULL);
|
||
| ... | ... | |
|
linkgclist(h, g->allweak); /* must clear collected entries */
|
||
|
break;
|
||
|
}
|
||
|
return 1 + 2*sizenode(h) + h->asize;
|
||
|
return cast(l_mem, 1 + 2*sizenode(h) + h->asize);
|
||
|
}
|
||
| dependencies/lua-5.5/src/liolib.c | ||
|---|---|---|
|
#if !defined(l_fseek) /* { */
|
||
|
#if defined(LUA_USE_FSEEKO) /* { */
|
||
|
#if defined(LUA_USE_FSEEKO) || defined(LUA_USE_OFF_T) /* { */
|
||
|
#include <sys/types.h>
|
||
| dependencies/lua-5.5/src/ljumptab.h | ||
|---|---|---|
|
#if 0
|
||
|
** you can update the following list with this command:
|
||
|
**
|
||
|
** sed -n '/^OP_/\!d; s/OP_/\&\&L_OP_/ ; s/,.*/,/ ; s/\/.*// ; p' lopcodes.h
|
||
|
** sed -n '/^OP_/!d; s/OP_/\&\&L_OP_/ ; s/,.*/,/ ; s/\/.*// ; p' lopcodes.h
|
||
|
**
|
||
|
#endif
|
||
| ... | ... | |
|
&&L_OP_BANDK,
|
||
|
&&L_OP_BORK,
|
||
|
&&L_OP_BXORK,
|
||
|
&&L_OP_SHRI,
|
||
|
&&L_OP_SHLI,
|
||
|
&&L_OP_SHRI,
|
||
|
&&L_OP_ADD,
|
||
|
&&L_OP_SUB,
|
||
|
&&L_OP_MUL,
|
||
| ... | ... | |
|
&&L_OP_SETLIST,
|
||
|
&&L_OP_CLOSURE,
|
||
|
&&L_OP_VARARG,
|
||
|
&&L_OP_GETVARG,
|
||
|
&&L_OP_ERRNNIL,
|
||
|
&&L_OP_VARARGPREP,
|
||
|
&&L_OP_EXTRAARG
|
||
| dependencies/lua-5.5/src/llimits.h | ||
|---|---|---|
|
/*
|
||
|
** 'l_mem' is a signed integer big enough to count the total memory
|
||
|
** used by Lua. (It is signed due to the use of debt in several
|
||
|
** computations.) Usually, 'ptrdiff_t' should work, but we use 'long'
|
||
|
** for 16-bit machines.
|
||
|
** computations.) 'lu_mem' is a corresponding unsigned type. Usually,
|
||
|
** 'ptrdiff_t' should work, but we use 'long' for 16-bit machines.
|
||
|
*/
|
||
|
#if defined(LUAI_MEM) /* { external definitions? */
|
||
|
typedef LUAI_MEM l_mem;
|
||
| ... | ... | |
|
#define MAX_SIZE (sizeof(size_t) < sizeof(lua_Integer) ? MAX_SIZET \
|
||
|
: cast_sizet(LUA_MAXINTEGER))
|
||
|
/*
|
||
|
** floor of the log2 of the maximum signed value for integral type 't'.
|
||
|
** (That is, maximum 'n' such that '2^n' fits in the given signed type.)
|
||
|
*/
|
||
|
#define log2maxs(t) (l_numbits(t) - 2)
|
||
|
/*
|
||
|
** test whether an unsigned value is a power of 2 (or zero)
|
||
|
*/
|
||
| ... | ... | |
|
#endif
|
||
|
/*
|
||
|
** lua_numbertointeger converts a float number with an integral value
|
||
|
** to an integer, or returns 0 if the float is not within the range of
|
||
|
** a lua_Integer. (The range comparisons are tricky because of
|
||
|
** rounding. The tests here assume a two-complement representation,
|
||
|
** where MININTEGER always has an exact representation as a float;
|
||
|
** MAXINTEGER may not have one, and therefore its conversion to float
|
||
|
** may have an ill-defined value.)
|
||
|
*/
|
||
|
#define lua_numbertointeger(n,p) \
|
||
|
((n) >= (LUA_NUMBER)(LUA_MININTEGER) && \
|
||
|
(n) < -(LUA_NUMBER)(LUA_MININTEGER) && \
|
||
|
(*(p) = (LUA_INTEGER)(n), 1))
|
||
|
/*
|
||
|
** LUAI_FUNC is a mark for all extern functions that are not to be
|
||
|
** exported to outside modules.
|
||
|
** LUAI_DDEF and LUAI_DDEC are marks for all extern (const) variables,
|
||
|
** none of which to be exported to outside modules (LUAI_DDEF for
|
||
|
** definitions and LUAI_DDEC for declarations).
|
||
|
** Elf and MACH/gcc (versions 3.2 and later) mark them as "hidden" to
|
||
|
** optimize access when Lua is compiled as a shared library. Not all elf
|
||
|
** targets support this attribute. Unfortunately, gcc does not offer
|
||
|
** a way to check whether the target offers that support, and those
|
||
|
** without support give a warning about it. To avoid these warnings,
|
||
|
** change to the default definition.
|
||
|
*/
|
||
|
#if !defined(LUAI_FUNC)
|
||
|
#if defined(__GNUC__) && ((__GNUC__*100 + __GNUC_MINOR__) >= 302) && \
|
||
|
(defined(__ELF__) || defined(__MACH__))
|
||
|
#define LUAI_FUNC __attribute__((visibility("internal"))) extern
|
||
|
#else
|
||
|
#define LUAI_FUNC extern
|
||
|
#endif
|
||
|
#define LUAI_DDEC(dec) LUAI_FUNC dec
|
||
|
#define LUAI_DDEF /* empty */
|
||
|
#endif
|
||
|
/* Give these macros simpler names for internal use */
|
||
|
#define l_likely(x) luai_likely(x)
|
||
|
#define l_unlikely(x) luai_unlikely(x)
|
||
|
/*
|
||
|
** {==================================================================
|
||
|
** "Abstraction Layer" for basic report of messages and errors
|
||
| dependencies/lua-5.5/src/lmathlib.c | ||
|---|---|---|
|
return 1;
|
||
|
}
|
||
|
static int math_sin (lua_State *L) {
|
||
|
lua_pushnumber(L, l_mathop(sin)(luaL_checknumber(L, 1)));
|
||
|
return 1;
|
||
|
}
|
||
|
static int math_cos (lua_State *L) {
|
||
|
lua_pushnumber(L, l_mathop(cos)(luaL_checknumber(L, 1)));
|
||
|
return 1;
|
||
|
}
|
||
|
static int math_tan (lua_State *L) {
|
||
|
lua_pushnumber(L, l_mathop(tan)(luaL_checknumber(L, 1)));
|
||
|
return 1;
|
||
|
}
|
||
|
static int math_asin (lua_State *L) {
|
||
|
lua_pushnumber(L, l_mathop(asin)(luaL_checknumber(L, 1)));
|
||
|
return 1;
|
||
|
}
|
||
|
static int math_acos (lua_State *L) {
|
||
|
lua_pushnumber(L, l_mathop(acos)(luaL_checknumber(L, 1)));
|
||
|
return 1;
|
||
|
}
|
||
|
static int math_atan (lua_State *L) {
|
||
|
lua_Number y = luaL_checknumber(L, 1);
|
||
|
lua_Number x = luaL_optnumber(L, 2, 1);
|
||
| ... | ... | |
|
return 1;
|
||
|
}
|
||
|
static int math_log (lua_State *L) {
|
||
|
lua_Number x = luaL_checknumber(L, 1);
|
||
|
lua_Number res;
|
||
| ... | ... | |
|
return 1;
|
||
|
}
|
||
|
static int math_exp (lua_State *L) {
|
||
|
lua_pushnumber(L, l_mathop(exp)(luaL_checknumber(L, 1)));
|
||
|
return 1;
|
||
|
}
|
||
|
static int math_deg (lua_State *L) {
|
||
|
lua_pushnumber(L, luaL_checknumber(L, 1) * (l_mathop(180.0) / PI));
|
||
|
return 1;
|
||
|
}
|
||
|
static int math_rad (lua_State *L) {
|
||
|
lua_pushnumber(L, luaL_checknumber(L, 1) * (PI / l_mathop(180.0)));
|
||
|
return 1;
|
||
|
}
|
||
|
static int math_frexp (lua_State *L) {
|
||
|
lua_Number x = luaL_checknumber(L, 1);
|
||
|
int ep;
|
||
|
lua_pushnumber(L, l_mathop(frexp)(x, &ep));
|
||
|
lua_pushinteger(L, ep);
|
||
|
return 2;
|
||
|
}
|
||
|
static int math_ldexp (lua_State *L) {
|
||
|
lua_Number x = luaL_checknumber(L, 1);
|
||
|
int ep = (int)luaL_checkinteger(L, 2);
|
||
|
lua_pushnumber(L, l_mathop(ldexp)(x, ep));
|
||
|
return 1;
|
||
|
}
|
||
|
static int math_min (lua_State *L) {
|
||
|
int n = lua_gettop(L); /* number of arguments */
|
||
|
int imin = 1; /* index of current minimum value */
|
||
| ... | ... | |
|
*/
|
||
|
/*
|
||
|
** This code uses lots of shifts. ANSI C does not allow shifts greater
|
||
|
** This code uses lots of shifts. ISO C does not allow shifts greater
|
||
|
** than or equal to the width of the type being shifted, so some shifts
|
||
|
** are written in convoluted ways to match that restriction. For
|
||
|
** preprocessor tests, it assumes a width of 32 bits, so the maximum
|
||
| ... | ... | |
|
return 1;
|
||
|
}
|
||
|
static int math_frexp (lua_State *L) {
|
||
|
int e;
|
||
|
lua_pushnumber(L, l_mathop(frexp)(luaL_checknumber(L, 1), &e));
|
||
|
lua_pushinteger(L, e);
|
||
|
return 2;
|
||
|
}
|
||
|
static int math_ldexp (lua_State *L) {
|
||
|
lua_Number x = luaL_checknumber(L, 1);
|
||
|
int ep = (int)luaL_checkinteger(L, 2);
|
||
|
lua_pushnumber(L, l_mathop(ldexp)(x, ep));
|
||
|
return 1;
|
||
|
}
|
||
|
static int math_log10 (lua_State *L) {
|
||
|
lua_pushnumber(L, l_mathop(log10)(luaL_checknumber(L, 1)));
|
||
|
return 1;
|
||
| ... | ... | |
|
{"tointeger", math_toint},
|
||
|
{"floor", math_floor},
|
||
|
{"fmod", math_fmod},
|
||
|
{"frexp", math_frexp},
|
||
|
{"ult", math_ult},
|
||
|
{"ldexp", math_ldexp},
|
||
|
{"log", math_log},
|
||
|
{"max", math_max},
|
||
|
{"min", math_min},
|
||
| ... | ... | |
|
{"sinh", math_sinh},
|
||
|
{"tanh", math_tanh},
|
||
|
{"pow", math_pow},
|
||
|
{"frexp", math_frexp},
|
||
|
{"ldexp", math_ldexp},
|
||
|
{"log10", math_log10},
|
||
|
#endif
|
||
|
/* placeholders */
|
||
| dependencies/lua-5.5/src/loadlib.c | ||
|---|---|---|
|
/* }================================================================== */
|
||
|
/*
|
||
|
** External strings created by DLLs may need the DLL code to be
|
||
|
** deallocated. This implies that a DLL can only be unloaded after all
|
||
|
** its strings were deallocated. To ensure that, we create a 'library
|
||
|
** string' to represent each DLL, and when this string is deallocated
|
||
|
** it closes its corresponding DLL.
|
||
|
** (The string itself is irrelevant; its userdata is the DLL pointer.)
|
||
|
*/
|
||
|
/*
|
||
|
** return registry.CLIBS[path]
|
||
|
*/
|
||
| ... | ... | |
|
/*
|
||
|
** registry.CLIBS[path] = plib -- for queries
|
||
|
** registry.CLIBS[#CLIBS + 1] = plib -- also keep a list of all libraries
|
||
|
** Deallocate function for library strings.
|
||
|
** Unload the DLL associated with the string being deallocated.
|
||
|
*/
|
||
|
static void addtoclib (lua_State *L, const char *path, void *plib) {
|
||
|
lua_getfield(L, LUA_REGISTRYINDEX, CLIBS);
|
||
|
lua_pushlightuserdata(L, plib);
|
||
|
lua_pushvalue(L, -1);
|
||
|
lua_setfield(L, -3, path); /* CLIBS[path] = plib */
|
||
|
lua_rawseti(L, -2, luaL_len(L, -2) + 1); /* CLIBS[#CLIBS + 1] = plib */
|
||
|
lua_pop(L, 1); /* pop CLIBS table */
|
||
|
static void *freelib (void *ud, void *ptr, size_t osize, size_t nsize) {
|
||
|
/* string itself is irrelevant and static */
|
||
|
(void)ptr; (void)osize; (void)nsize;
|
||
|
lsys_unloadlib(ud); /* unload library represented by the string */
|
||
|
return NULL;
|
||
|
}
|
||
|
/*
|
||
|
** __gc tag method for CLIBS table: calls 'lsys_unloadlib' for all lib
|
||
|
** handles in list CLIBS
|
||
|
** Create a library string that, when deallocated, will unload 'plib'
|
||
|
*/
|
||
|
static int gctm (lua_State *L) {
|
||
|
lua_Integer n = luaL_len(L, 1);
|
||
|
for (; n >= 1; n--) { /* for each handle, in reverse order */
|
||
|
lua_rawgeti(L, 1, n); /* get handle CLIBS[n] */
|
||
|
lsys_unloadlib(lua_touserdata(L, -1));
|
||
|
lua_pop(L, 1); /* pop handle */
|
||
|
}
|
||
|
return 0;
|
||
|
static void createlibstr (lua_State *L, void *plib) {
|
||
|
/* common content for all library strings */
|
||
|
static const char dummy[] = "01234567890";
|
||
|
lua_pushexternalstring(L, dummy, sizeof(dummy) - 1, freelib, plib);
|
||
|
}
|
||
|
/*
|
||
|
** registry.CLIBS[path] = plib -- for queries.
|
||
|
** Also create a reference to strlib, so that the library string will
|
||
|
** only be collected when registry.CLIBS is collected.
|
||
|
*/
|
||
|
static void addtoclib (lua_State *L, const char *path, void *plib) {
|
||
|
lua_getfield(L, LUA_REGISTRYINDEX, CLIBS);
|
||
|
lua_pushlightuserdata(L, plib);
|
||
|
lua_setfield(L, -2, path); /* CLIBS[path] = plib */
|
||
|
createlibstr(L, plib);
|
||
|
luaL_ref(L, -2); /* keep library string in CLIBS */
|
||
|
lua_pop(L, 1); /* pop CLIBS table */
|
||
|
}
|
||
|
/* error codes for 'lookforfunc' */
|
||
|
#define ERRLIB 1
|
||
| ... | ... | |
|
** Then, if 'sym' is '*', return true (as library has been loaded).
|
||
|
** Otherwise, look for symbol 'sym' in the library and push a
|
||
|
** C function with that symbol.
|
||
|
** Return 0 and 'true' or a function in the stack; in case of
|
||
|
** errors, return an error code and an error message in the stack.
|
||
|
** Return 0 with 'true' or a function in the stack; in case of
|
||
|
** errors, return an error code with an error message in the stack.
|
||
|
*/
|
||
|
static int lookforfunc (lua_State *L, const char *path, const char *sym) {
|
||
|
void *reg = checkclib(L, path); /* check loaded C libraries */
|
||
| ... | ... | |
|
}
|
||
|
/*
|
||
|
** create table CLIBS to keep track of loaded C libraries,
|
||
|
** setting a finalizer to close all libraries when closing state.
|
||
|
*/
|
||
|
static void createclibstable (lua_State *L) {
|
||
|
luaL_getsubtable(L, LUA_REGISTRYINDEX, CLIBS); /* create CLIBS table */
|
||
|
lua_createtable(L, 0, 1); /* create metatable for CLIBS */
|
||
|
lua_pushcfunction(L, gctm);
|
||
|
lua_setfield(L, -2, "__gc"); /* set finalizer for CLIBS table */
|
||
|
lua_setmetatable(L, -2);
|
||
|
}
|
||
|
LUAMOD_API int luaopen_package (lua_State *L) {
|
||
|
createclibstable(L);
|
||
|
luaL_getsubtable(L, LUA_REGISTRYINDEX, CLIBS); /* create CLIBS table */
|
||
|
lua_pop(L, 1); /* will not use it now */
|
||
|
luaL_newlib(L, pk_funcs); /* create 'package' table */
|
||
|
createsearcherstable(L);
|
||
|
/* set paths */
|
||
| dependencies/lua-5.5/src/lobject.c | ||
|---|---|---|
|
/*
|
||
|
** Computes ceil(log2(x))
|
||
|
** Computes ceil(log2(x)), which is the smallest integer n such that
|
||
|
** x <= (1 << n).
|
||
|
*/
|
||
|
lu_byte luaO_ceillog2 (unsigned int x) {
|
||
|
static const lu_byte log_2[256] = { /* log_2[i - 1] = ceil(log2(i)) */
|
||
| ... | ... | |
|
** overflow, so we check which order is best.
|
||
|
*/
|
||
|
l_mem luaO_applyparam (lu_byte p, l_mem x) {
|
||
|
unsigned int m = p & 0xF; /* mantissa */
|
||
|
int m = p & 0xF; /* mantissa */
|
||
|
int e = (p >> 4); /* exponent */
|
||
|
if (e > 0) { /* normalized? */
|
||
|
e--; /* correct exponent */
|
||
| ... | ... | |
|
int luaO_utf8esc (char *buff, l_uint32 x) {
|
||
|
int n = 1; /* number of bytes put in buffer (backwards) */
|
||
|
lua_assert(x <= 0x7FFFFFFFu);
|
||
|
if (x < 0x80) /* ascii? */
|
||
|
if (x < 0x80) /* ASCII? */
|
||
|
buff[UTF8BUFFSZ - 1] = cast_char(x);
|
||
|
else { /* need continuation bytes */
|
||
|
unsigned int mfb = 0x3f; /* maximum that fits in first byte */
|
||
| dependencies/lua-5.5/src/lobject.h | ||
|---|---|---|
|
#define strisshr(ts) ((ts)->shrlen >= 0)
|
||
|
#define isextstr(ts) (ttislngstring(ts) && tsvalue(ts)->shrlen != LSTRREG)
|
||
|
/*
|
||
| ... | ... | |
|
/*
|
||
|
** Flags in Prototypes
|
||
|
*/
|
||
|
#define PF_ISVARARG 1
|
||
|
#define PF_FIXED 2 /* prototype has parts in fixed memory */
|
||
|
#define PF_ISVARARG 1 /* function is vararg */
|
||
|
#define PF_VAVAR 2 /* function has vararg parameter */
|
||
|
#define PF_VATAB 4 /* function has vararg table */
|
||
|
#define PF_FIXED 8 /* prototype has parts in fixed memory */
|
||
|
/*
|
||
| dependencies/lua-5.5/src/lopcodes.c | ||
|---|---|---|
|
,opmode(0, 0, 0, 0, 1, iABC) /* OP_BANDK */
|
||
|
,opmode(0, 0, 0, 0, 1, iABC) /* OP_BORK */
|
||
|
,opmode(0, 0, 0, 0, 1, iABC) /* OP_BXORK */
|
||
|
,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHRI */
|
||
|
,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHLI */
|
||
|
,opmode(0, 0, 0, 0, 1, iABC) /* OP_SHRI */
|
||
|
,opmode(0, 0, 0, 0, 1, iABC) /* OP_ADD */
|
||
|
,opmode(0, 0, 0, 0, 1, iABC) /* OP_SUB */
|
||
|
,opmode(0, 0, 0, 0, 1, iABC) /* OP_MUL */
|
||
| ... | ... | |
|
,opmode(0, 0, 1, 0, 0, ivABC) /* OP_SETLIST */
|
||
|
,opmode(0, 0, 0, 0, 1, iABx) /* OP_CLOSURE */
|
||
|
,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, iAx) /* OP_EXTRAARG */
|
||
|
};
|
||
| dependencies/lua-5.5/src/lopcodes.h | ||
|---|---|---|
|
OP_BORK,/* A B C R[A] := R[B] | K[C]:integer */
|
||
|
OP_BXORK,/* A B C R[A] := R[B] ~ K[C]:integer */
|
||
|
OP_SHRI,/* A B sC R[A] := R[B] >> sC */
|
||
|
OP_SHLI,/* A B sC R[A] := sC << R[B] */
|
||
|
OP_SHRI,/* A B sC R[A] := R[B] >> sC */
|
||
|
OP_ADD,/* A B C R[A] := R[B] + R[C] */
|
||
|
OP_SUB,/* A B C R[A] := R[B] - R[C] */
|
||
| ... | ... | |
|
OP_VARARG,/* A C R[A], R[A+1], ..., R[A+C-2] = vararg */
|
||
|
OP_VARARGPREP,/*A (adjust vararg parameters) */
|
||
|
OP_GETVARG, /* A B C R[A] := R[B][R[C]], R[B] is vararg parameter */
|
||
|
OP_ERRNNIL,/* A Bx raise error if R[A] ~= nil (K[Bx] is global name)*/
|
||
|
OP_VARARGPREP,/* (adjust vararg parameters) */
|
||
|
OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */
|
||
|
} OpCode;
|
||
| dependencies/lua-5.5/src/lopnames.h | ||
|---|---|---|
|
"BANDK",
|
||
|
"BORK",
|
||
|
"BXORK",
|
||
|
"SHRI",
|
||
|
"SHLI",
|
||
|
"SHRI",
|
||
|
"ADD",
|
||
|
"SUB",
|
||
|
"MUL",
|
||
| ... | ... | |
|
"SETLIST",
|
||
|
"CLOSURE",
|
||
|
"VARARG",
|
||
|
"GETVARG",
|
||
|
"ERRNNIL",
|
||
|
"VARARGPREP",
|
||
|
"EXTRAARG",
|
||
|
NULL
|
||
| dependencies/lua-5.5/src/loslib.c | ||
|---|---|---|
|
#if defined(LUA_USE_WINDOWS)
|
||
|
#define LUA_STRFTIMEOPTIONS "aAbBcdHIjmMpSUwWxXyYzZ%" \
|
||
|
"||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y" /* two-char options */
|
||
|
#elif defined(LUA_USE_C89) /* ANSI C 89 (only 1-char options) */
|
||
|
#elif defined(LUA_USE_C89) /* C89 (only 1-char options) */
|
||
|
#define LUA_STRFTIMEOPTIONS "aAbBcdHIjmMpSUwWxXyYZ%"
|
||
|
#else /* C99 specification */
|
||
|
#define LUA_STRFTIMEOPTIONS "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%" \
|
||
| dependencies/lua-5.5/src/lparser.c | ||
|---|---|---|
|
/* maximum number of variable declarationss per function (must be
|
||
|
/* maximum number of variable declarations per function (must be
|
||
|
smaller than 250, due to the bytecode format) */
|
||
|
#define MAXVARS 200
|
||
| ... | ... | |
|
Dyndata *dyd = ls->dyd;
|
||
|
Vardesc *var;
|
||
|
luaM_growvector(L, dyd->actvar.arr, dyd->actvar.n + 1,
|
||
|
dyd->actvar.size, Vardesc, SHRT_MAX, "variable declarationss");
|
||
|
dyd->actvar.size, Vardesc, SHRT_MAX, "variable declarations");
|
||
|
var = &dyd->actvar.arr[dyd->actvar.n++];
|
||
|
var->vd.kind = kind; /* default */
|
||
|
var->vd.name = name;
|
||
| ... | ... | |
|
/*
|
||
|
** Raises an error if variable described by 'e' is read only
|
||
|
** Raises an error if variable described by 'e' is read only; moreover,
|
||
|
** if 'e' is t[exp] where t is the vararg parameter, change it to index
|
||
|
** a real table. (Virtual vararg tables cannot be changed.)
|
||
|
*/
|
||
|
static void check_readonly (LexState *ls, expdesc *e) {
|
||
|
FuncState *fs = ls->fs;
|
||
| ... | ... | |
|
varname = ls->dyd->actvar.arr[e->u.info].vd.name;
|
||
|
break;
|
||
|
}
|
||
|
case VLOCAL: {
|
||
|
case VLOCAL: case VVARGVAR: {
|
||
|
Vardesc *vardesc = getlocalvardesc(fs, e->u.var.vidx);
|
||
|
if (vardesc->vd.kind != VDKREG) /* not a regular variable? */
|
||
|
varname = vardesc->vd.name;
|
||
| ... | ... | |
|
varname = up->name;
|
||
|
break;
|
||
|
}
|
||
|
case VVARGIND: {
|
||
|
fs->f->flag |= PF_VATAB; /* function will need a vararg table */
|
||
|
e->k = VINDEXED;
|
||
|
} /* FALLTHROUGH */
|
||
|
case VINDEXUP: case VINDEXSTR: case VINDEXED: { /* global variable */
|
||
|
if (e->u.ind.ro) /* read-only? */
|
||
|
varname = tsvalue(&fs->f->k[e->u.ind.keystr]);
|
||
| ... | ... | |
|
else if (eqstr(n, vd->vd.name)) { /* found? */
|
||
|
if (vd->vd.kind == RDKCTC) /* compile-time constant? */
|
||
|
init_exp(var, VCONST, fs->firstlocal + i);
|
||
|
else /* local variable */
|
||
|
else { /* local variable */
|
||
|
init_var(fs, var, i);
|
||
|
if (vd->vd.kind == RDKVAVAR) /* vararg parameter? */
|
||
|
var->k = VVARGVAR;
|
||
|
}
|
||
|
return cast_int(var->k);
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
static void singlevaraux (FuncState *fs, TString *n, expdesc *var, int base) {
|
||
|
int v = searchvar(fs, n, var); /* look up variables at current level */
|
||
|
if (v >= 0) { /* found? */
|
||
|
if (v == VLOCAL && !base)
|
||
|
markupval(fs, var->u.var.vidx); /* local will be used as an upval */
|
||
|
if (!base) {
|
||
|
if (var->k == VVARGVAR) /* vararg parameter? */
|
||
|
luaK_vapar2local(fs, var); /* change it to a regular local */
|
||
|
if (var->k == VLOCAL)
|
||
|
markupval(fs, var->u.var.vidx); /* will be used as an upvalue */
|
||
|
}
|
||
|
/* else nothing else to be done */
|
||
|
}
|
||
|
else { /* not found at current level; try upvalues */
|
||
|
int idx = searchupvalue(fs, n); /* try existing upvalues */
|
||
| ... | ... | |
|
}
|
||
|
static void buildglobal (LexState *ls, TString *varname, expdesc *var) {
|
||
|
FuncState *fs = ls->fs;
|
||
|
expdesc key;
|
||
|
init_exp(var, VGLOBAL, -1); /* global by default */
|
||
|
singlevaraux(fs, ls->envn, var, 1); /* get environment variable */
|
||
|
if (var->k == VGLOBAL)
|
||
|
luaK_semerror(ls, "_ENV is global when accessing variable '%s'",
|
||
|
getstr(varname));
|
||
|
luaK_exp2anyregup(fs, var); /* _ENV could be a constant */
|
||
|
codestring(&key, varname); /* key is variable name */
|
||
|
luaK_indexed(fs, var, &key); /* 'var' represents _ENV[varname] */
|
||
|
}
|
||
|
/*
|
||
|
** Find a variable with the given name 'n', handling global variables
|
||
|
** too.
|
||
| ... | ... | |
|
init_exp(var, VGLOBAL, -1); /* global by default */
|
||
|
singlevaraux(fs, varname, var, 1);
|
||
|
if (var->k == VGLOBAL) { /* global name? */
|
||
|
expdesc key;
|
||
|
int info = var->u.info;
|
||
|
/* global by default in the scope of a global declaration? */
|
||