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 »