Feature #683 » 0013-Update-included-lua-to-version-5.4.7.patch
dependencies/lua-5.4/Makefile.am | ||
---|---|---|
freeciv_lua.patch \
|
||
doc/readme.html \
|
||
doc/logo.gif \
|
||
doc/osi-certified-72x60.png
|
||
doc/OSIApproved_100X125.png
|
dependencies/lua-5.4/README | ||
---|---|---|
This is Lua 5.4.6, released on 02 May 2023.
|
||
This is Lua 5.4.7, released on 13 Jun 2024.
|
||
For installation instructions, license details, and
|
||
further information about Lua, see doc/readme.html.
|
dependencies/lua-5.4/Version.txt | ||
---|---|---|
Sources here are from lua-5.4.6
|
||
(http://www.lua.org/ftp/lua-5.4.6.tar.gz)
|
||
Sources here are from lua-5.4.7
|
||
(http://www.lua.org/ftp/lua-5.4.7.tar.gz)
|
||
Upstream bug fixes from https://www.lua.org/bugs.html applied:
|
||
1, 2, 3, 4 & 5, 6, 7
|
||
-
|
||
Not entire lua distribution directory hierarchy is included here, and
|
||
some files needed for Freeciv usage have been added.
|
dependencies/lua-5.4/doc/readme.html | ||
---|---|---|
<BODY>
|
||
<H1>
|
||
<A HREF="http://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua"></A>
|
||
<A HREF="https://www.lua.org/"><IMG SRC="logo.gif" ALT="Lua"></A>
|
||
Welcome to Lua 5.4
|
||
</H1>
|
||
... | ... | |
<P>
|
||
Lua is a powerful, efficient, lightweight, embeddable scripting language
|
||
developed by a
|
||
<A HREF="http://www.lua.org/authors.html">team</A>
|
||
<A HREF="https://www.lua.org/authors.html">team</A>
|
||
at
|
||
<A HREF="http://www.puc-rio.br/">PUC-Rio</A>,
|
||
<A HREF="https://www.puc-rio.br/">PUC-Rio</A>,
|
||
the Pontifical Catholic University of Rio de Janeiro in Brazil.
|
||
Lua is
|
||
<A HREF="#license">free software</A>
|
||
used in
|
||
<A HREF="http://www.lua.org/uses.html">many products and projects</A>
|
||
<A HREF="https://www.lua.org/uses.html">many products and projects</A>
|
||
around the world.
|
||
<P>
|
||
Lua's
|
||
<A HREF="http://www.lua.org/">official web site</A>
|
||
<A HREF="https://www.lua.org/">official website</A>
|
||
provides complete information
|
||
about Lua,
|
||
including
|
||
an
|
||
<A HREF="http://www.lua.org/about.html">executive summary</A>
|
||
<A HREF="https://www.lua.org/about.html">executive summary</A>,
|
||
tips on
|
||
<A HREF="https://www.lua.org/start.html">getting started</A>,
|
||
and
|
||
updated
|
||
<A HREF="http://www.lua.org/docs.html">documentation</A>,
|
||
<A HREF="https://www.lua.org/docs.html">documentation</A>,
|
||
especially the
|
||
<A HREF="http://www.lua.org/manual/5.4/">reference manual</A>,
|
||
<A HREF="https://www.lua.org/manual/5.4/">reference manual</A>,
|
||
which may differ slightly from the
|
||
<A HREF="contents.html">local copy</A>
|
||
distributed in this package.
|
||
... | ... | |
<H2><A NAME="install">Installing Lua</A></H2>
|
||
<P>
|
||
Lua is distributed in
|
||
<A HREF="http://www.lua.org/ftp/">source</A>
|
||
<A HREF="https://www.lua.org/ftp/">source</A>
|
||
form.
|
||
You need to build it before using it.
|
||
Building Lua should be straightforward
|
||
... | ... | |
platforms that have an ANSI C compiler.
|
||
Lua also compiles unmodified as C++.
|
||
The instructions given below for building Lua are for Unix-like platforms,
|
||
such as Linux and Mac OS X.
|
||
such as Linux and macOS.
|
||
See also
|
||
<A HREF="#other">instructions for other systems</A>
|
||
and
|
||
... | ... | |
<P>
|
||
If you don't have the time or the inclination to compile Lua yourself,
|
||
get a binary from
|
||
<A HREF="http://lua-users.org/wiki/LuaBinaries">LuaBinaries</A>.
|
||
<A HREF="https://luabinaries.sourceforge.net">LuaBinaries</A>.
|
||
<H3>Building Lua</H3>
|
||
<P>
|
||
... | ... | |
<OL>
|
||
<LI>
|
||
Open a terminal window and move to
|
||
the top-level directory, which is named <TT>lua-5.4.6</TT>.
|
||
the top-level directory, which is named <TT>lua-5.4.7</TT>.
|
||
The <TT>Makefile</TT> there controls both the build process and the installation process.
|
||
<P>
|
||
<LI>
|
||
... | ... | |
record the changes you've made.
|
||
<P>
|
||
On the other hand, if you need to customize some Lua features, you'll need
|
||
to edit <TT>src/luaconf.h</TT> before building and installing Lua.
|
||
On the other hand, if you need to customize some Lua features,
|
||
edit <TT>src/luaconf.h</TT> before building and installing Lua.
|
||
The edited file will be the one installed, and
|
||
it will be used by any Lua clients that you build, to ensure consistency.
|
||
Further customization is available to experts by editing the Lua sources.
|
||
... | ... | |
</DL>
|
||
<P>
|
||
To use Lua as a library in your own programs, you'll need to know how to
|
||
To use Lua as a library in your own programs, you need to know how to
|
||
create and use libraries with your compiler. Moreover, to dynamically load
|
||
C libraries for Lua, you'll need to know how to create dynamic libraries
|
||
and you'll need to make sure that the Lua API functions are accessible to
|
||
... | ... | |
<H2><A NAME="license">License</A></H2>
|
||
<P>
|
||
<A HREF="http://www.opensource.org/docs/definition.php">
|
||
<IMG SRC="osi-certified-72x60.png" ALIGN="right" ALT="[osi certified]" STYLE="padding-left: 30px ;">
|
||
<A HREF="https://opensource.org/osd">
|
||
<IMG SRC="OSIApproved_100X125.png" ALIGN="right" ALT="[Open Source Initiative Approved License]" STYLE="padding-left: 1em" WIDTH=50>
|
||
</A>
|
||
Lua is free software distributed under the terms of the
|
||
<A HREF="http://www.opensource.org/licenses/mit-license.html">MIT license</A>
|
||
<A HREF="https://opensource.org/license/mit">MIT license</A>
|
||
reproduced below;
|
||
it may be used for any purpose, including commercial purposes,
|
||
at absolutely no cost without having to ask us.
|
||
... | ... | |
The only requirement is that if you do use Lua,
|
||
then you should give us credit by including the appropriate copyright notice somewhere in your product or its documentation.
|
||
For details, see
|
||
<A HREF="http://www.lua.org/license.html">this</A>.
|
||
For details, see the
|
||
<A HREF="https://www.lua.org/license.html">license page</A>.
|
||
<BLOCKQUOTE STYLE="padding-bottom: 0em">
|
||
Copyright © 1994–2023 Lua.org, PUC-Rio.
|
||
Copyright © 1994–2024 Lua.org, PUC-Rio.
|
||
<P>
|
||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||
... | ... | |
<P CLASS="footer">
|
||
Last update:
|
||
Tue May 2 20:08:55 UTC 2023
|
||
Wed May 8 21:56:16 UTC 2024
|
||
</P>
|
||
<!--
|
||
Last change: revised for Lua 5.4.6
|
||
Last change: revised for Lua 5.4.7
|
||
-->
|
||
</BODY>
|
dependencies/lua-5.4/src/lapi.c | ||
---|---|---|
o = index2value(L, idx); /* previous call may reallocate the stack */
|
||
}
|
||
if (len != NULL)
|
||
*len = vslen(o);
|
||
*len = tsslen(tsvalue(o));
|
||
lua_unlock(L);
|
||
return svalue(o);
|
||
return getstr(tsvalue(o));
|
||
}
|
||
dependencies/lua-5.4/src/lauxlib.c | ||
---|---|---|
int top = lua_gettop(L);
|
||
lua_getinfo(L, "f", ar); /* push function */
|
||
lua_getfield(L, LUA_REGISTRYINDEX, LUA_LOADED_TABLE);
|
||
luaL_checkstack(L, 6, "not enough stack"); /* slots for 'findfield' */
|
||
if (findfield(L, top + 1, 2)) {
|
||
const char *name = lua_tostring(L, -1);
|
||
if (strncmp(name, LUA_GNAME ".", 3) == 0) { /* name start with '_G.'? */
|
||
... | ... | |
return 1;
|
||
}
|
||
else {
|
||
const char *msg;
|
||
luaL_pushfail(L);
|
||
msg = (en != 0) ? strerror(en) : "(no extra info)";
|
||
if (fname)
|
||
lua_pushfstring(L, "%s: %s", fname, strerror(en));
|
||
lua_pushfstring(L, "%s: %s", fname, msg);
|
||
else
|
||
lua_pushstring(L, strerror(en));
|
||
lua_pushstring(L, msg);
|
||
lua_pushinteger(L, en);
|
||
return 3;
|
||
}
|
||
... | ... | |
static int errfile (lua_State *L, const char *what, int fnameindex) {
|
||
const char *serr = strerror(errno);
|
||
int err = errno;
|
||
const char *filename = lua_tostring(L, fnameindex) + 1;
|
||
lua_pushfstring(L, "cannot %s %s: %s", what, filename, serr);
|
||
if (err != 0)
|
||
lua_pushfstring(L, "cannot %s %s: %s", what, filename, strerror(err));
|
||
else
|
||
lua_pushfstring(L, "cannot %s %s", what, filename);
|
||
lua_remove(L, fnameindex);
|
||
return LUA_ERRFILE;
|
||
}
|
||
... | ... | |
}
|
||
else {
|
||
lua_pushfstring(L, "@%s", filename);
|
||
errno = 0;
|
||
lf.f = fopen(filename, "r");
|
||
if (lf.f == NULL) return errfile(L, "open", fnameindex);
|
||
}
|
||
... | ... | |
if (c == LUA_SIGNATURE[0]) { /* binary file? */
|
||
lf.n = 0; /* remove possible newline */
|
||
if (filename) { /* "real" file? */
|
||
errno = 0;
|
||
lf.f = freopen(filename, "rb", lf.f); /* reopen in binary mode */
|
||
if (lf.f == NULL) return errfile(L, "reopen", fnameindex);
|
||
skipcomment(lf.f, &c); /* re-read initial portion */
|
||
... | ... | |
}
|
||
if (c != EOF)
|
||
lf.buff[lf.n++] = c; /* 'c' is the first character of the stream */
|
||
errno = 0;
|
||
status = lua_load(L, getF, &lf, lua_tostring(L, -1), mode);
|
||
readstatus = ferror(lf.f);
|
||
if (filename) fclose(lf.f); /* close file (even in case of errors) */
|
||
... | ... | |
LUALIB_API void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup) {
|
||
luaL_checkstack(L, nup, "too many upvalues");
|
||
for (; l->name != NULL; l++) { /* fill the table with given functions */
|
||
if (l->func == NULL) /* place holder? */
|
||
if (l->func == NULL) /* placeholder? */
|
||
lua_pushboolean(L, 0);
|
||
else {
|
||
int i;
|
||
... | ... | |
}
|
||
/*
|
||
** Standard panic funcion just prints an error message. The test
|
||
** with 'lua_type' avoids possible memory errors in 'lua_tostring'.
|
||
*/
|
||
static int panic (lua_State *L) {
|
||
const char *msg = lua_tostring(L, -1);
|
||
if (msg == NULL) msg = "error object is not a string";
|
||
const char *msg = (lua_type(L, -1) == LUA_TSTRING)
|
||
? lua_tostring(L, -1)
|
||
: "error object is not a string";
|
||
lua_writestringerror("PANIC: unprotected error in call to Lua API (%s)\n",
|
||
msg);
|
||
return 0; /* return to Lua to abort */
|
dependencies/lua-5.4/src/lcode.c | ||
---|---|---|
break;
|
||
}
|
||
case VLOCAL: { /* already in a register */
|
||
e->u.info = e->u.var.ridx;
|
||
int temp = e->u.var.ridx;
|
||
e->u.info = temp; /* (can't do a direct assignment; values overlap) */
|
||
e->k = VNONRELOC; /* becomes a non-relocatable value */
|
||
break;
|
||
}
|
||
... | ... | |
/*
|
||
** Check whether expression 'e' is a small literal string
|
||
** 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 &&
|
||
... | ... | |
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) {
|
||
t->u.ind.t = t->u.info; /* upvalue index */
|
||
t->u.ind.idx = k->u.info; /* literal string */
|
||
int temp = t->u.info; /* upvalue index */
|
||
lua_assert(isKstr(fs, k));
|
||
t->u.ind.t = temp; /* (can't do a direct assignment; values overlap) */
|
||
t->u.ind.idx = k->u.info; /* literal short string */
|
||
t->k = VINDEXUP;
|
||
}
|
||
else {
|
||
/* register index of the table */
|
||
t->u.ind.t = (t->k == VLOCAL) ? t->u.var.ridx: t->u.info;
|
||
if (isKstr(fs, k)) {
|
||
t->u.ind.idx = k->u.info; /* literal string */
|
||
t->u.ind.idx = k->u.info; /* literal short string */
|
||
t->k = VINDEXSTR;
|
||
}
|
||
else if (isCint(k)) {
|
dependencies/lua-5.4/src/ldebug.c | ||
---|---|---|
#define noLuaClosure(f) ((f) == NULL || (f)->c.tt == LUA_VCCL)
|
||
#define LuaClosure(f) ((f) != NULL && (f)->c.tt == LUA_VLCL)
|
||
static const char *funcnamefromcall (lua_State *L, CallInfo *ci,
|
||
... | ... | |
static void funcinfo (lua_Debug *ar, Closure *cl) {
|
||
if (noLuaClosure(cl)) {
|
||
if (!LuaClosure(cl)) {
|
||
ar->source = "=[C]";
|
||
ar->srclen = LL("=[C]");
|
||
ar->linedefined = -1;
|
||
... | ... | |
static void collectvalidlines (lua_State *L, Closure *f) {
|
||
if (noLuaClosure(f)) {
|
||
if (!LuaClosure(f)) {
|
||
setnilvalue(s2v(L->top.p));
|
||
api_incr_top(L);
|
||
}
|
||
else {
|
||
int i;
|
||
TValue v;
|
||
const Proto *p = f->l.p;
|
||
int currentline = p->linedefined;
|
||
Table *t = luaH_new(L); /* new table to store active lines */
|
||
sethvalue2s(L, L->top.p, t); /* push it on stack */
|
||
api_incr_top(L);
|
||
setbtvalue(&v); /* boolean 'true' to be the value of all indices */
|
||
if (!p->is_vararg) /* regular function? */
|
||
i = 0; /* consider all instructions */
|
||
else { /* vararg function */
|
||
lua_assert(GET_OPCODE(p->code[0]) == OP_VARARGPREP);
|
||
currentline = nextline(p, currentline, 0);
|
||
i = 1; /* skip first instruction (OP_VARARGPREP) */
|
||
}
|
||
for (; i < p->sizelineinfo; i++) { /* for each instruction */
|
||
currentline = nextline(p, currentline, i); /* get its line */
|
||
luaH_setint(L, t, currentline, &v); /* table[line] = true */
|
||
if (p->lineinfo != NULL) { /* proto with debug information? */
|
||
int i;
|
||
TValue v;
|
||
setbtvalue(&v); /* boolean 'true' to be the value of all indices */
|
||
if (!p->is_vararg) /* regular function? */
|
||
i = 0; /* consider all instructions */
|
||
else { /* vararg function */
|
||
lua_assert(GET_OPCODE(p->code[0]) == OP_VARARGPREP);
|
||
currentline = nextline(p, currentline, 0);
|
||
i = 1; /* skip first instruction (OP_VARARGPREP) */
|
||
}
|
||
for (; i < p->sizelineinfo; i++) { /* for each instruction */
|
||
currentline = nextline(p, currentline, i); /* get its line */
|
||
luaH_setint(L, t, currentline, &v); /* table[line] = true */
|
||
}
|
||
}
|
||
}
|
||
}
|
||
... | ... | |
}
|
||
case 'u': {
|
||
ar->nups = (f == NULL) ? 0 : f->c.nupvalues;
|
||
if (noLuaClosure(f)) {
|
||
if (!LuaClosure(f)) {
|
||
ar->isvararg = 1;
|
||
ar->nparams = 0;
|
||
}
|
||
... | ... | |
default:
|
||
return NULL; /* cannot find a reasonable name */
|
||
}
|
||
*name = getstr(G(L)->tmname[tm]) + 2;
|
||
*name = getshrstr(G(L)->tmname[tm]) + 2;
|
||
return "metamethod";
|
||
}
|
||
dependencies/lua-5.4/src/lgc.c | ||
---|---|---|
static lu_mem traversetable (global_State *g, Table *h) {
|
||
const char *weakkey, *weakvalue;
|
||
const TValue *mode = gfasttm(g, h->metatable, TM_MODE);
|
||
TString *smode;
|
||
markobjectN(g, h->metatable);
|
||
if (mode && ttisstring(mode) && /* is there a weak mode? */
|
||
(cast_void(weakkey = strchr(svalue(mode), 'k')),
|
||
cast_void(weakvalue = strchr(svalue(mode), 'v')),
|
||
if (mode && ttisshrstring(mode) && /* is there a weak mode? */
|
||
(cast_void(smode = tsvalue(mode)),
|
||
cast_void(weakkey = strchr(getshrstr(smode), 'k')),
|
||
cast_void(weakvalue = strchr(getshrstr(smode), 'v')),
|
||
(weakkey || weakvalue))) { /* is really weak? */
|
||
if (!weakkey) /* strong keys? */
|
||
traverseweakvalue(g, h);
|
||
... | ... | |
for (uv = th->openupval; uv != NULL; uv = uv->u.open.next)
|
||
markobject(g, uv); /* open upvalues cannot be collected */
|
||
if (g->gcstate == GCSatomic) { /* final traversal? */
|
||
for (; o < th->stack_last.p + EXTRA_STACK; o++)
|
||
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 */
|
||
/* 'remarkupvals' may have removed thread from 'twups' list */
|
||
if (!isintwups(th) && th->openupval != NULL) {
|
||
... | ... | |
g->twups = th;
|
||
}
|
||
}
|
||
else if (!g->gcemergency)
|
||
luaD_shrinkstack(th); /* do not change stack in emergency cycle */
|
||
return 1 + stacksize(th);
|
||
}
|
||
... | ... | |
entersweep(L); /* sweep everything to turn them back to white */
|
||
/* finish any pending sweep phase to start a new cycle */
|
||
luaC_runtilstate(L, bitmask(GCSpause));
|
||
luaC_runtilstate(L, bitmask(GCSpropagate)); /* start new cycle */
|
||
g->gcstate = GCSenteratomic; /* go straight to atomic phase */
|
||
luaC_runtilstate(L, bitmask(GCScallfin)); /* run up to finalizers */
|
||
/* estimate must be correct after a full GC cycle */
|
||
lua_assert(g->GCestimate == gettotalbytes(g));
|
dependencies/lua-5.4/src/liolib.c | ||
---|---|---|
*/
|
||
static int io_fclose (lua_State *L) {
|
||
LStream *p = tolstream(L);
|
||
int res = fclose(p->f);
|
||
return luaL_fileresult(L, (res == 0), NULL);
|
||
errno = 0;
|
||
return luaL_fileresult(L, (fclose(p->f) == 0), NULL);
|
||
}
|
||
... | ... | |
LStream *p = newfile(L);
|
||
const char *md = mode; /* to traverse/check mode */
|
||
luaL_argcheck(L, l_checkmode(md), 2, "invalid mode");
|
||
errno = 0;
|
||
p->f = fopen(filename, mode);
|
||
return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
|
||
}
|
||
... | ... | |
const char *mode = luaL_optstring(L, 2, "r");
|
||
LStream *p = newprefile(L);
|
||
luaL_argcheck(L, l_checkmodep(mode), 2, "invalid mode");
|
||
errno = 0;
|
||
p->f = l_popen(L, filename, mode);
|
||
p->closef = &io_pclose;
|
||
return (p->f == NULL) ? luaL_fileresult(L, 0, filename) : 1;
|
||
... | ... | |
static int io_tmpfile (lua_State *L) {
|
||
LStream *p = newfile(L);
|
||
errno = 0;
|
||
p->f = tmpfile();
|
||
return (p->f == NULL) ? luaL_fileresult(L, 0, NULL) : 1;
|
||
}
|
||
... | ... | |
int nargs = lua_gettop(L) - 1;
|
||
int n, success;
|
||
clearerr(f);
|
||
errno = 0;
|
||
if (nargs == 0) { /* no arguments? */
|
||
success = read_line(L, f, 1);
|
||
n = first + 1; /* to return 1 result */
|
||
... | ... | |
static int g_write (lua_State *L, FILE *f, int arg) {
|
||
int nargs = lua_gettop(L) - arg;
|
||
int status = 1;
|
||
errno = 0;
|
||
for (; nargs--; arg++) {
|
||
if (lua_type(L, arg) == LUA_TNUMBER) {
|
||
/* optimization: could be done exactly as for strings */
|
||
... | ... | |
}
|
||
if (l_likely(status))
|
||
return 1; /* file handle already on stack top */
|
||
else return luaL_fileresult(L, status, NULL);
|
||
else
|
||
return luaL_fileresult(L, status, NULL);
|
||
}
|
||
... | ... | |
l_seeknum offset = (l_seeknum)p3;
|
||
luaL_argcheck(L, (lua_Integer)offset == p3, 3,
|
||
"not an integer in proper range");
|
||
errno = 0;
|
||
op = l_fseek(f, offset, mode[op]);
|
||
if (l_unlikely(op))
|
||
return luaL_fileresult(L, 0, NULL); /* error */
|
||
... | ... | |
FILE *f = tofile(L);
|
||
int op = luaL_checkoption(L, 2, NULL, modenames);
|
||
lua_Integer sz = luaL_optinteger(L, 3, LUAL_BUFFERSIZE);
|
||
int res = setvbuf(f, NULL, mode[op], (size_t)sz);
|
||
int res;
|
||
errno = 0;
|
||
res = setvbuf(f, NULL, mode[op], (size_t)sz);
|
||
return luaL_fileresult(L, res == 0, NULL);
|
||
}
|
||
static int io_flush (lua_State *L) {
|
||
return luaL_fileresult(L, fflush(getiofile(L, IO_OUTPUT)) == 0, NULL);
|
||
FILE *f = getiofile(L, IO_OUTPUT);
|
||
errno = 0;
|
||
return luaL_fileresult(L, fflush(f) == 0, NULL);
|
||
}
|
||
static int f_flush (lua_State *L) {
|
||
return luaL_fileresult(L, fflush(tofile(L)) == 0, NULL);
|
||
FILE *f = tofile(L);
|
||
errno = 0;
|
||
return luaL_fileresult(L, fflush(f) == 0, NULL);
|
||
}
|
||
... | ... | |
** metamethods for file handles
|
||
*/
|
||
static const luaL_Reg metameth[] = {
|
||
{"__index", NULL}, /* place holder */
|
||
{"__index", NULL}, /* placeholder */
|
||
{"__gc", f_gc},
|
||
{"__close", f_gc},
|
||
{"__tostring", f_tostring},
|
dependencies/lua-5.4/src/lmathlib.c | ||
---|---|---|
** ===================================================================
|
||
*/
|
||
/*
|
||
** This code uses lots of shifts. ANSI 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
|
||
** shift there is 31 bits.
|
||
*/
|
||
/* number of binary digits in the mantissa of a float */
|
||
#define FIGS l_floatatt(MANT_DIG)
|
||
... | ... | |
/* 'long' has at least 64 bits */
|
||
#define Rand64 unsigned long
|
||
#define SRand64 long
|
||
#elif !defined(LUA_USE_C89) && defined(LLONG_MAX)
|
||
/* there is a 'long long' type (which must have at least 64 bits) */
|
||
#define Rand64 unsigned long long
|
||
#define SRand64 long long
|
||
#elif ((LUA_MAXUNSIGNED >> 31) >> 31) >= 3
|
||
/* 'lua_Unsigned' has at least 64 bits */
|
||
#define Rand64 lua_Unsigned
|
||
#define SRand64 lua_Integer
|
||
#endif
|
||
... | ... | |
}
|
||
/* must take care to not shift stuff by more than 63 slots */
|
||
/*
|
||
** Convert bits from a random integer into a float in the
|
||
** interval [0,1), getting the higher FIG bits from the
|
||
** random unsigned integer and converting that to a float.
|
||
** Some old Microsoft compilers cannot cast an unsigned long
|
||
** to a floating-point number, so we use a signed long as an
|
||
** intermediary. When lua_Number is float or double, the shift ensures
|
||
** that 'sx' is non negative; in that case, a good compiler will remove
|
||
** the correction.
|
||
*/
|
||
/* must throw out the extra (64 - FIGS) bits */
|
||
#define shift64_FIG (64 - FIGS)
|
||
/* to scale to [0, 1), multiply by scaleFIG = 2^(-FIGS) */
|
||
/* 2^(-FIGS) == 2^-1 / 2^(FIGS-1) */
|
||
#define scaleFIG (l_mathop(0.5) / ((Rand64)1 << (FIGS - 1)))
|
||
static lua_Number I2d (Rand64 x) {
|
||
return (lua_Number)(trim64(x) >> shift64_FIG) * scaleFIG;
|
||
SRand64 sx = (SRand64)(trim64(x) >> shift64_FIG);
|
||
lua_Number res = (lua_Number)(sx) * scaleFIG;
|
||
if (sx < 0)
|
||
res += l_mathop(1.0); /* correct the two's complement if negative */
|
||
lua_assert(0 <= res && res < 1);
|
||
return res;
|
||
}
|
||
/* convert a 'Rand64' to a 'lua_Unsigned' */
|
||
... | ... | |
#else /* 32 < FIGS <= 64 */
|
||
/* must take care to not shift stuff by more than 31 slots */
|
||
/* 2^(-FIGS) = 1.0 / 2^30 / 2^3 / 2^(FIGS-33) */
|
||
#define scaleFIG \
|
||
(l_mathop(1.0) / (UONE << 30) / l_mathop(8.0) / (UONE << (FIGS - 33)))
|
dependencies/lua-5.4/src/loadlib.c | ||
---|---|---|
#include "lualib.h"
|
||
/*
|
||
** LUA_IGMARK is a mark to ignore all before it when building the
|
||
** luaopen_ function name.
|
||
*/
|
||
#if !defined (LUA_IGMARK)
|
||
#define LUA_IGMARK "-"
|
||
#endif
|
||
/*
|
||
** LUA_CSUBSEP is the character that replaces dots in submodule names
|
||
** when searching for a C loader.
|
dependencies/lua-5.4/src/lobject.c | ||
---|---|---|
addstr2buff(&buff, fmt, strlen(fmt)); /* rest of 'fmt' */
|
||
clearbuff(&buff); /* empty buffer into the stack */
|
||
lua_assert(buff.pushed == 1);
|
||
return svalue(s2v(L->top.p - 1));
|
||
return getstr(tsvalue(s2v(L->top.p - 1)));
|
||
}
|
||
dependencies/lua-5.4/src/lobject.h | ||
---|---|---|
typedef struct TString {
|
||
CommonHeader;
|
||
lu_byte extra; /* reserved words for short strings; "has hash" for longs */
|
||
lu_byte shrlen; /* length for short strings */
|
||
lu_byte shrlen; /* length for short strings, 0xFF for long strings */
|
||
unsigned int hash;
|
||
union {
|
||
size_t lnglen; /* length for long strings */
|
||
... | ... | |
/*
|
||
** Get the actual string (array of bytes) from a 'TString'.
|
||
** Get the actual string (array of bytes) from a 'TString'. (Generic
|
||
** version and specialized versions for long and short strings.)
|
||
*/
|
||
#define getstr(ts) ((ts)->contents)
|
||
#define getstr(ts) ((ts)->contents)
|
||
#define getlngstr(ts) check_exp((ts)->shrlen == 0xFF, (ts)->contents)
|
||
#define getshrstr(ts) check_exp((ts)->shrlen != 0xFF, (ts)->contents)
|
||
/* get the actual string (array of bytes) from a Lua value */
|
||
#define svalue(o) getstr(tsvalue(o))
|
||
/* get string length from 'TString *s' */
|
||
#define tsslen(s) ((s)->tt == LUA_VSHRSTR ? (s)->shrlen : (s)->u.lnglen)
|
||
/* get string length from 'TValue *o' */
|
||
#define vslen(o) tsslen(tsvalue(o))
|
||
#define tsslen(s) \
|
||
((s)->shrlen != 0xFF ? (s)->shrlen : (s)->u.lnglen)
|
||
/* }================================================================== */
|
||
dependencies/lua-5.4/src/lopcodes.h | ||
---|---|---|
OP_GETUPVAL,/* A B R[A] := UpValue[B] */
|
||
OP_SETUPVAL,/* A B UpValue[B] := R[A] */
|
||
OP_GETTABUP,/* A B C R[A] := UpValue[B][K[C]:string] */
|
||
OP_GETTABUP,/* A B C R[A] := UpValue[B][K[C]:shortstring] */
|
||
OP_GETTABLE,/* A B C R[A] := R[B][R[C]] */
|
||
OP_GETI,/* A B C R[A] := R[B][C] */
|
||
OP_GETFIELD,/* A B C R[A] := R[B][K[C]:string] */
|
||
OP_GETFIELD,/* A B C R[A] := R[B][K[C]:shortstring] */
|
||
OP_SETTABUP,/* A B C UpValue[A][K[B]:string] := RK(C) */
|
||
OP_SETTABUP,/* A B C UpValue[A][K[B]:shortstring] := RK(C) */
|
||
OP_SETTABLE,/* A B C R[A][R[B]] := RK(C) */
|
||
OP_SETI,/* A B C R[A][B] := RK(C) */
|
||
OP_SETFIELD,/* A B C R[A][K[B]:string] := RK(C) */
|
||
OP_SETFIELD,/* A B C R[A][K[B]:shortstring] := RK(C) */
|
||
OP_NEWTABLE,/* A B C k R[A] := {} */
|
||
dependencies/lua-5.4/src/loslib.c | ||
---|---|---|
static int os_remove (lua_State *L) {
|
||
const char *filename = luaL_checkstring(L, 1);
|
||
errno = 0;
|
||
return luaL_fileresult(L, remove(filename) == 0, filename);
|
||
}
|
||
... | ... | |
static int os_rename (lua_State *L) {
|
||
const char *fromname = luaL_checkstring(L, 1);
|
||
const char *toname = luaL_checkstring(L, 2);
|
||
errno = 0;
|
||
return luaL_fileresult(L, rename(fromname, toname) == 0, NULL);
|
||
}
|
||
dependencies/lua-5.4/src/lstate.c | ||
---|---|---|
void luaE_warnerror (lua_State *L, const char *where) {
|
||
TValue *errobj = s2v(L->top.p - 1); /* error object */
|
||
const char *msg = (ttisstring(errobj))
|
||
? svalue(errobj)
|
||
? getstr(tsvalue(errobj))
|
||
: "error object is not a string";
|
||
/* produce warning "error in %s (%s)" (where, msg) */
|
||
luaE_warning(L, "error in ", 1);
|
dependencies/lua-5.4/src/lstring.c | ||
---|---|---|
lua_assert(a->tt == LUA_VLNGSTR && b->tt == LUA_VLNGSTR);
|
||
return (a == b) || /* same instance or... */
|
||
((len == b->u.lnglen) && /* equal length and ... */
|
||
(memcmp(getstr(a), getstr(b), len) == 0)); /* equal contents */
|
||
(memcmp(getlngstr(a), getlngstr(b), len) == 0)); /* equal contents */
|
||
}
|
||
... | ... | |
lua_assert(ts->tt == LUA_VLNGSTR);
|
||
if (ts->extra == 0) { /* no hash? */
|
||
size_t len = ts->u.lnglen;
|
||
ts->hash = luaS_hash(getstr(ts), len, ts->hash);
|
||
ts->hash = luaS_hash(getlngstr(ts), len, ts->hash);
|
||
ts->extra = 1; /* now it has its hash */
|
||
}
|
||
return ts->hash;
|
||
... | ... | |
TString *luaS_createlngstrobj (lua_State *L, size_t l) {
|
||
TString *ts = createstrobj(L, l, LUA_VLNGSTR, G(L)->seed);
|
||
ts->u.lnglen = l;
|
||
ts->shrlen = 0xFF; /* signals that it is a long string */
|
||
return ts;
|
||
}
|
||
... | ... | |
TString **list = &tb->hash[lmod(h, tb->size)];
|
||
lua_assert(str != NULL); /* otherwise 'memcmp'/'memcpy' are undefined */
|
||
for (ts = *list; ts != NULL; ts = ts->u.hnext) {
|
||
if (l == ts->shrlen && (memcmp(str, getstr(ts), l * sizeof(char)) == 0)) {
|
||
if (l == ts->shrlen && (memcmp(str, getshrstr(ts), l * sizeof(char)) == 0)) {
|
||
/* found! */
|
||
if (isdead(g, ts)) /* dead (but not collected yet)? */
|
||
changewhite(ts); /* resurrect it */
|
||
... | ... | |
list = &tb->hash[lmod(h, tb->size)]; /* rehash with new size */
|
||
}
|
||
ts = createstrobj(L, l, LUA_VSHRSTR, h);
|
||
memcpy(getstr(ts), str, l * sizeof(char));
|
||
ts->shrlen = cast_byte(l);
|
||
memcpy(getshrstr(ts), str, l * sizeof(char));
|
||
ts->u.hnext = *list;
|
||
*list = ts;
|
||
tb->nuse++;
|
||
... | ... | |
if (l_unlikely(l * sizeof(char) >= (MAX_SIZE - sizeof(TString))))
|
||
luaM_toobig(L);
|
||
ts = luaS_createlngstrobj(L, l);
|
||
memcpy(getstr(ts), str, l * sizeof(char));
|
||
memcpy(getlngstr(ts), str, l * sizeof(char));
|
||
return ts;
|
||
}
|
||
}
|
dependencies/lua-5.4/src/ltable.c | ||
---|---|---|
return t->alimit; /* this is the size */
|
||
else {
|
||
unsigned int size = t->alimit;
|
||
/* compute the smallest power of 2 not smaller than 'n' */
|
||
/* compute the smallest power of 2 not smaller than 'size' */
|
||
size |= (size >> 1);
|
||
size |= (size >> 2);
|
||
size |= (size >> 4);
|
||
... | ... | |
** put new key in its main position; otherwise (colliding node is in its main
|
||
** position), new key goes to an empty position.
|
||
*/
|
||
void luaH_newkey (lua_State *L, Table *t, const TValue *key, TValue *value) {
|
||
static void luaH_newkey (lua_State *L, Table *t, const TValue *key,
|
||
TValue *value) {
|
||
Node *mp;
|
||
TValue aux;
|
||
if (l_unlikely(ttisnil(key)))
|
||
... | ... | |
/*
|
||
** Search function for integers. If integer is inside 'alimit', get it
|
||
** directly from the array part. Otherwise, if 'alimit' is not equal to
|
||
** the real size of the array, key still can be in the array part. In
|
||
** this case, try to avoid a call to 'luaH_realasize' when key is just
|
||
** one more than the limit (so that it can be incremented without
|
||
** changing the real size of the array).
|
||
** directly from the array part. Otherwise, if 'alimit' is not
|
||
** the real size of the array, the key still can be in the array part.
|
||
** In this case, do the "Xmilia trick" to check whether 'key-1' is
|
||
** smaller than the real size.
|
||
** The trick works as follow: let 'p' be an integer such that
|
||
** '2^(p+1) >= alimit > 2^p', or '2^(p+1) > alimit-1 >= 2^p'.
|
||
** That is, 2^(p+1) is the real size of the array, and 'p' is the highest
|
||
** bit on in 'alimit-1'. What we have to check becomes 'key-1 < 2^(p+1)'.
|
||
** We compute '(key-1) & ~(alimit-1)', which we call 'res'; it will
|
||
** have the 'p' bit cleared. If the key is outside the array, that is,
|
||
** 'key-1 >= 2^(p+1)', then 'res' will have some bit on higher than 'p',
|
||
** therefore it will be larger or equal to 'alimit', and the check
|
||
** will fail. If 'key-1 < 2^(p+1)', then 'res' has no bit on higher than
|
||
** 'p', and as the bit 'p' itself was cleared, 'res' will be smaller
|
||
** than 2^p, therefore smaller than 'alimit', and the check succeeds.
|
||
** As special cases, when 'alimit' is 0 the condition is trivially false,
|
||
** and when 'alimit' is 1 the condition simplifies to 'key-1 < alimit'.
|
||
** If key is 0 or negative, 'res' will have its higher bit on, so that
|
||
** if cannot be smaller than alimit.
|
||
*/
|
||
const TValue *luaH_getint (Table *t, lua_Integer key) {
|
||
if (l_castS2U(key) - 1u < t->alimit) /* 'key' in [1, t->alimit]? */
|
||
lua_Unsigned alimit = t->alimit;
|
||
if (l_castS2U(key) - 1u < alimit) /* 'key' in [1, t->alimit]? */
|
||
return &t->array[key - 1];
|
||
else if (!limitequalsasize(t) && /* key still may be in the array part? */
|
||
(l_castS2U(key) == t->alimit + 1 ||
|
||
l_castS2U(key) - 1u < luaH_realasize(t))) {
|
||
else if (!isrealasize(t) && /* key still may be in the array part? */
|
||
(((l_castS2U(key) - 1u) & ~(alimit - 1u)) < alimit)) {
|
||
t->alimit = cast_uint(key); /* probably '#t' is here now */
|
||
return &t->array[key - 1];
|
||
}
|
||
else {
|
||
else { /* key is not in the array part; check the hash */
|
||
Node *n = hashint(t, key);
|
||
for (;;) { /* check whether 'key' is somewhere in the chain */
|
||
if (keyisinteger(n) && keyival(n) == key)
|
dependencies/lua-5.4/src/ltable.h | ||
---|---|---|
LUAI_FUNC const TValue *luaH_getshortstr (Table *t, TString *key);
|
||
LUAI_FUNC const TValue *luaH_getstr (Table *t, TString *key);
|
||
LUAI_FUNC const TValue *luaH_get (Table *t, const TValue *key);
|
||
LUAI_FUNC void luaH_newkey (lua_State *L, Table *t, const TValue *key,
|
||
TValue *value);
|
||
LUAI_FUNC void luaH_set (lua_State *L, Table *t, const TValue *key,
|
||
TValue *value);
|
||
LUAI_FUNC void luaH_finishset (lua_State *L, Table *t, const TValue *key,
|
dependencies/lua-5.4/src/ltm.h | ||
---|---|---|
#include "lobject.h"
|
||
#include "lstate.h"
|
||
/*
|
||
... | ... | |
int inv, int isfloat, TMS event);
|
||
LUAI_FUNC void luaT_adjustvarargs (lua_State *L, int nfixparams,
|
||
CallInfo *ci, const Proto *p);
|
||
LUAI_FUNC void luaT_getvarargs (lua_State *L, CallInfo *ci,
|
||
struct CallInfo *ci, const Proto *p);
|
||
LUAI_FUNC void luaT_getvarargs (lua_State *L, struct CallInfo *ci,
|
||
StkId where, int wanted);
|
||
dependencies/lua-5.4/src/lua.h | ||
---|---|---|
#define LUA_VERSION_MAJOR "5"
|
||
#define LUA_VERSION_MINOR "4"
|
||
#define LUA_VERSION_RELEASE "6"
|
||
#define LUA_VERSION_RELEASE "7"
|
||
#define LUA_VERSION_NUM 504
|
||
#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + 6)
|
||
#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + 7)
|
||
#define LUA_VERSION "Lua " LUA_VERSION_MAJOR "." LUA_VERSION_MINOR
|
||
#define LUA_RELEASE LUA_VERSION "." LUA_VERSION_RELEASE
|
||
#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2023 Lua.org, PUC-Rio"
|
||
#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2024 Lua.org, PUC-Rio"
|
||
#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes"
|
||
... | ... | |
/******************************************************************************
|
||
* Copyright (C) 1994-2023 Lua.org, PUC-Rio.
|
||
* Copyright (C) 1994-2024 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.4/src/luaconf.h | ||
---|---|---|
#endif
|
||
/*
|
||
** LUA_IGMARK is a mark to ignore all after it when building the
|
||
** module name (e.g., used to build the luaopen_ function name).
|
||
** Typically, the suffix after the mark is the module version,
|
||
** as in "mod-v1.2.so".
|
||
*/
|
||
#define LUA_IGMARK "-"
|
||
/* }================================================================== */
|
||
dependencies/lua-5.4/src/lundump.c | ||
---|---|---|
static size_t loadSize (LoadState *S) {
|
||
return loadUnsigned(S, ~(size_t)0);
|
||
return loadUnsigned(S, MAX_SIZET);
|
||
}
|
||
... | ... | |
ts = luaS_createlngstrobj(L, size); /* create string */
|
||
setsvalue2s(L, L->top.p, ts); /* anchor it ('loadVector' can GC) */
|
||
luaD_inctop(L);
|
||
loadVector(S, getstr(ts), size); /* load directly in final place */
|
||
loadVector(S, getlngstr(ts), size); /* load directly in final place */
|
||
L->top.p--; /* pop string */
|
||
}
|
||
luaC_objbarrier(L, p, ts);
|
dependencies/lua-5.4/src/lundump.h | ||
---|---|---|
/*
|
||
** Encode major-minor version in one byte, one nibble for each
|
||
*/
|
||
#define MYINT(s) (s[0]-'0') /* assume one-digit numerals */
|
||
#define LUAC_VERSION (MYINT(LUA_VERSION_MAJOR)*16+MYINT(LUA_VERSION_MINOR))
|
||
#define LUAC_VERSION (((LUA_VERSION_NUM / 100) * 16) + LUA_VERSION_NUM % 100)
|
||
#define LUAC_FORMAT 0 /* this is the official format */
|
||
dependencies/lua-5.4/src/lvm.c | ||
---|---|---|
lua_assert(obj != result);
|
||
if (!cvt2num(obj)) /* is object not a string? */
|
||
return 0;
|
||
else
|
||
return (luaO_str2num(svalue(obj), result) == vslen(obj) + 1);
|
||
else {
|
||
TString *st = tsvalue(obj);
|
||
return (luaO_str2num(getstr(st), result) == tsslen(st) + 1);
|
||
}
|
||
}
|
||
... | ... | |
/*
|
||
** Compare two strings 'ls' x 'rs', returning an integer less-equal-
|
||
** -greater than zero if 'ls' is less-equal-greater than 'rs'.
|
||
** Compare two strings 'ts1' x 'ts2', returning an integer less-equal-
|
||
** -greater than zero if 'ts1' is less-equal-greater than 'ts2'.
|
||
** The code is a little tricky because it allows '\0' in the strings
|
||
** and it uses 'strcoll' (to respect locales) for each segments
|
||
** of the strings.
|
||
** and it uses 'strcoll' (to respect locales) for each segment
|
||
** of the strings. Note that segments can compare equal but still
|
||
** have different lengths.
|
||
*/
|
||
static int l_strcmp (const TString *ls, const TString *rs) {
|
||
const char *l = getstr(ls);
|
||
size_t ll = tsslen(ls);
|
||
const char *r = getstr(rs);
|
||
size_t lr = tsslen(rs);
|
||
static int l_strcmp (const TString *ts1, const TString *ts2) {
|
||
const char *s1 = getstr(ts1);
|
||
size_t rl1 = tsslen(ts1); /* real length */
|
||
const char *s2 = getstr(ts2);
|
||
size_t rl2 = tsslen(ts2);
|
||
for (;;) { /* for each segment */
|
||
int temp = strcoll(l, r);
|
||
int temp = strcoll(s1, s2);
|
||
if (temp != 0) /* not equal? */
|
||
return temp; /* done */
|
||
else { /* strings are equal up to a '\0' */
|
||
size_t len = strlen(l); /* index of first '\0' in both strings */
|
||
if (len == lr) /* 'rs' is finished? */
|
||
return (len == ll) ? 0 : 1; /* check 'ls' */
|
||
else if (len == ll) /* 'ls' is finished? */
|
||
return -1; /* 'ls' is less than 'rs' ('rs' is not finished) */
|
||
/* both strings longer than 'len'; go on comparing after the '\0' */
|
||
len++;
|
||
l += len; ll -= len; r += len; lr -= len;
|
||
size_t zl1 = strlen(s1); /* index of first '\0' in 's1' */
|
||
size_t zl2 = strlen(s2); /* index of first '\0' in 's2' */
|
||
if (zl2 == rl2) /* 's2' is finished? */
|
||
return (zl1 == rl1) ? 0 : 1; /* check 's1' */
|
||
else if (zl1 == rl1) /* 's1' is finished? */
|
||
return -1; /* 's1' is less than 's2' ('s2' is not finished) */
|
||
/* both strings longer than 'zl'; go on comparing after the '\0' */
|
||
zl1++; zl2++;
|
||
s1 += zl1; rl1 -= zl1; s2 += zl2; rl2 -= zl2;
|
||
}
|
||
}
|
||
}
|
||
... | ... | |
static void copy2buff (StkId top, int n, char *buff) {
|
||
size_t tl = 0; /* size already copied */
|
||
do {
|
||
size_t l = vslen(s2v(top - n)); /* length of string being copied */
|
||
memcpy(buff + tl, svalue(s2v(top - n)), l * sizeof(char));
|
||
TString *st = tsvalue(s2v(top - n));
|
||
size_t l = tsslen(st); /* length of string being copied */
|
||
memcpy(buff + tl, getstr(st), l * sizeof(char));
|
||
tl += l;
|
||
} while (--n > 0);
|
||
}
|
||
... | ... | |
}
|
- « Previous
- 1
- 2
- Next »