Skip to content

Commit

Permalink
Update lua 5.4.3
Browse files Browse the repository at this point in the history
  • Loading branch information
cloudwu committed Mar 30, 2021
1 parent 11165ce commit e0d4fda
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 58 deletions.
2 changes: 1 addition & 1 deletion 3rd/lua/README
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
This is a modify version of lua 5.4.2 .
This is a modify version of lua 5.4.3 .

For detail ,
Shared Proto : http://lua-users.org/lists/lua-l/2014-03/msg00489.html
Expand Down
15 changes: 8 additions & 7 deletions 3rd/lua/lapi.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ LUA_API int lua_gettop (lua_State *L) {

LUA_API void lua_settop (lua_State *L, int idx) {
CallInfo *ci;
StkId func;
StkId func, newtop;
ptrdiff_t diff; /* difference for new top */
lua_lock(L);
ci = L->ci;
Expand All @@ -188,12 +188,13 @@ LUA_API void lua_settop (lua_State *L, int idx) {
api_check(L, -(idx+1) <= (L->top - (func + 1)), "invalid new top");
diff = idx + 1; /* will "subtract" index (as it is negative) */
}
#if defined(LUA_COMPAT_5_4_0)
if (diff < 0 && hastocloseCfunc(ci->nresults))
luaF_close(L, L->top + diff, CLOSEKTOP, 0);
#endif
api_check(L, L->tbclist < L->top + diff, "cannot pop an unclosed slot");
L->top += diff;
api_check(L, L->tbclist < L->top, "previous pop of an unclosed slot");
newtop = L->top + diff;
if (diff < 0 && L->tbclist >= newtop) {
lua_assert(hastocloseCfunc(ci->nresults));
luaF_close(L, newtop, CLOSEKTOP, 0);
}
L->top = newtop; /* correct top only after closing any upvalue */
lua_unlock(L);
}

Expand Down
9 changes: 3 additions & 6 deletions 3rd/lua/lauxlib.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <stddef.h>
#include <stdio.h>

#include "luaconf.h"
#include "lua.h"


Expand Down Expand Up @@ -124,10 +125,6 @@ LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname,
** ===============================================================
*/

#if !defined(l_likely)
#define l_likely(x) (x)
#endif


#define luaL_newlibtable(L,l) \
lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
Expand All @@ -136,10 +133,10 @@ LUALIB_API void (luaL_requiref) (lua_State *L, const char *modname,
(luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))

#define luaL_argcheck(L, cond,arg,extramsg) \
((void)(l_likely(cond) || luaL_argerror(L, (arg), (extramsg))))
((void)(luai_likely(cond) || luaL_argerror(L, (arg), (extramsg))))

#define luaL_argexpected(L,cond,arg,tname) \
((void)(l_likely(cond) || luaL_typeerror(L, (arg), (tname))))
((void)(luai_likely(cond) || luaL_typeerror(L, (arg), (tname))))

#define luaL_checkstring(L,n) (luaL_checklstring(L, (n), NULL))
#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL))
Expand Down
5 changes: 4 additions & 1 deletion 3rd/lua/ldebug.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ static int currentpc (CallInfo *ci) {
** an integer division gets the right place. When the source file has
** large sequences of empty/comment lines, it may need extra entries,
** so the original estimate needs a correction.
** If the original estimate is -1, the initial 'if' ensures that the
** 'while' will run at least once.
** The assertion that the estimate is a lower bound for the correct base
** is valid as long as the debug info has been generated with the same
** value for MAXIWTHABS or smaller. (Previous releases use a little
Expand All @@ -63,7 +65,8 @@ static int getbaseline (const Proto *f, int pc, int *basepc) {
else {
int i = cast_uint(pc) / MAXIWTHABS - 1; /* get an estimate */
/* estimate must be a lower bond of the correct base */
lua_assert(i < f->sizeabslineinfo && f->abslineinfo[i].pc <= pc);
lua_assert(i < 0 ||
(i < f->sizeabslineinfo && f->abslineinfo[i].pc <= pc));
while (i + 1 < f->sizeabslineinfo && pc >= f->abslineinfo[i + 1].pc)
i++; /* low estimate; adjust it */
*basepc = f->abslineinfo[i].pc;
Expand Down
40 changes: 29 additions & 11 deletions 3rd/lua/lfunc.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,15 @@ static void prepcallclosemth (lua_State *L, StkId level, int status, int yy) {
}


/*
** Maximum value for deltas in 'tbclist', dependent on the type
** of delta. (This macro assumes that an 'L' is in scope where it
** is used.)
*/
#define MAXDELTA \
((256ul << ((sizeof(L->stack->tbclist.delta) - 1) * 8)) - 1)


/*
** Insert a variable in the list of to-be-closed variables.
*/
Expand All @@ -163,13 +172,11 @@ void luaF_newtbcupval (lua_State *L, StkId level) {
if (l_isfalse(s2v(level)))
return; /* false doesn't need to be closed */
checkclosemth(L, level); /* value must have a close method */
while (level - L->tbclist > USHRT_MAX) { /* is delta too large? */
L->tbclist += USHRT_MAX; /* create a dummy node at maximum delta */
L->tbclist->tbclist.delta = USHRT_MAX;
L->tbclist->tbclist.isdummy = 1;
while (cast_uint(level - L->tbclist) > MAXDELTA) {
L->tbclist += MAXDELTA; /* create a dummy node at maximum delta */
L->tbclist->tbclist.delta = 0;
}
level->tbclist.delta = level - L->tbclist;
level->tbclist.isdummy = 0;
level->tbclist.delta = cast(unsigned short, level - L->tbclist);
L->tbclist = level;
}

Expand Down Expand Up @@ -202,6 +209,19 @@ void luaF_closeupval (lua_State *L, StkId level) {
}


/*
** Remove firt element from the tbclist plus its dummy nodes.
*/
static void poptbclist (lua_State *L) {
StkId tbc = L->tbclist;
lua_assert(tbc->tbclist.delta > 0); /* first element cannot be dummy */
tbc -= tbc->tbclist.delta;
while (tbc > L->stack && tbc->tbclist.delta == 0)
tbc -= MAXDELTA; /* remove dummy nodes */
L->tbclist = tbc;
}


/*
** Close all upvalues and to-be-closed variables up to the given stack
** level.
Expand All @@ -211,11 +231,9 @@ void luaF_close (lua_State *L, StkId level, int status, int yy) {
luaF_closeupval(L, level); /* first, close the upvalues */
while (L->tbclist >= level) { /* traverse tbc's down to that level */
StkId tbc = L->tbclist; /* get variable index */
L->tbclist -= tbc->tbclist.delta; /* remove it from list */
if (!tbc->tbclist.isdummy) { /* not a dummy entry? */
prepcallclosemth(L, tbc, status, yy); /* close variable */
level = restorestack(L, levelrel);
}
poptbclist(L); /* remove it from list */
prepcallclosemth(L, tbc, status, yy); /* close variable */
level = restorestack(L, levelrel);
}
}

Expand Down
5 changes: 3 additions & 2 deletions 3rd/lua/lobject.h
Original file line number Diff line number Diff line change
Expand Up @@ -139,13 +139,14 @@ typedef struct TValue {
** Entries in a Lua stack. Field 'tbclist' forms a list of all
** to-be-closed variables active in this stack. Dummy entries are
** used when the distance between two tbc variables does not fit
** in an unsigned short.
** in an unsigned short. They are represented by delta==0, and
** their real delta is always the maximum value that fits in
** that field.
*/
typedef union StackValue {
TValue val;
struct {
TValuefields;
lu_byte isdummy;
unsigned short delta;
} tbclist;
} StackValue;
Expand Down
2 changes: 1 addition & 1 deletion 3rd/lua/lstring.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
#include "atomic.h"

static unsigned int STRSEED;
static ATOM_SIZET STRID = 0;
static size_t STRID = 0;

/*
** Maximum size for string table.
Expand Down
61 changes: 40 additions & 21 deletions 3rd/lua/ltable.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,20 +68,25 @@
#define MAXHSIZE luaM_limitN(1u << MAXHBITS, Node)


/*
** When the original hash value is good, hashing by a power of 2
** avoids the cost of '%'.
*/
#define hashpow2(t,n) (gnode(t, lmod((n), sizenode(t))))

#define hashstr(t,str) hashpow2(t, (str)->hash)
#define hashboolean(t,p) hashpow2(t, p)
#define hashint(t,i) hashpow2(t, i)


/*
** for some types, it is better to avoid modulus by power of 2, as
** they tend to have many 2 factors.
** for other types, it is better to avoid modulo by power of 2, as
** they can have many 2 factors.
*/
#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1))))


#define hashstr(t,str) hashpow2(t, (str)->hash)
#define hashboolean(t,p) hashpow2(t, p)

#define hashint(t,i) hashpow2(t, i)


#define hashpointer(t,p) hashmod(t, point2uint(p))


Expand Down Expand Up @@ -135,24 +140,38 @@ static int l_hashfloat (lua_Number n) {
*/
static Node *mainposition (const Table *t, int ktt, const Value *kvl) {
switch (withvariant(ktt)) {
case LUA_VNUMINT:
return hashint(t, ivalueraw(*kvl));
case LUA_VNUMFLT:
return hashmod(t, l_hashfloat(fltvalueraw(*kvl)));
case LUA_VSHRSTR:
return hashstr(t, tsvalueraw(*kvl));
case LUA_VLNGSTR:
return hashpow2(t, luaS_hashlongstr(tsvalueraw(*kvl)));
case LUA_VNUMINT: {
lua_Integer key = ivalueraw(*kvl);
return hashint(t, key);
}
case LUA_VNUMFLT: {
lua_Number n = fltvalueraw(*kvl);
return hashmod(t, l_hashfloat(n));
}
case LUA_VSHRSTR: {
TString *ts = tsvalueraw(*kvl);
return hashstr(t, ts);
}
case LUA_VLNGSTR: {
TString *ts = tsvalueraw(*kvl);
return hashpow2(t, luaS_hashlongstr(ts));
}
case LUA_VFALSE:
return hashboolean(t, 0);
case LUA_VTRUE:
return hashboolean(t, 1);
case LUA_VLIGHTUSERDATA:
return hashpointer(t, pvalueraw(*kvl));
case LUA_VLCF:
return hashpointer(t, fvalueraw(*kvl));
default:
return hashpointer(t, gcvalueraw(*kvl));
case LUA_VLIGHTUSERDATA: {
void *p = pvalueraw(*kvl);
return hashpointer(t, p);
}
case LUA_VLCF: {
lua_CFunction f = fvalueraw(*kvl);
return hashpointer(t, f);
}
default: {
GCObject *o = gcvalueraw(*kvl);
return hashpointer(t, o);
}
}
}

Expand Down
24 changes: 16 additions & 8 deletions 3rd/lua/luaconf.h
Original file line number Diff line number Diff line change
Expand Up @@ -663,22 +663,30 @@

/*
** macros to improve jump prediction, used mostly for error handling
** and debug facilities.
** and debug facilities. (Some macros in the Lua API use these macros.
** Define LUA_NOBUILTIN if you do not want '__builtin_expect' in your
** code.)
*/
#if (defined(LUA_CORE) || defined(LUA_LIB)) && !defined(l_likely)
#if !defined(luai_likely)

#include <stdio.h>
#if defined(__GNUC__)
#define l_likely(x) (__builtin_expect(((x) != 0), 1))
#define l_unlikely(x) (__builtin_expect(((x) != 0), 0))
#if defined(__GNUC__) && !defined(LUA_NOBUILTIN)
#define luai_likely(x) (__builtin_expect(((x) != 0), 1))
#define luai_unlikely(x) (__builtin_expect(((x) != 0), 0))
#else
#define l_likely(x) (x)
#define l_unlikely(x) (x)
#define luai_likely(x) (x)
#define luai_unlikely(x) (x)
#endif

#endif


#if defined(LUA_CORE) || defined(LUA_LIB)
/* shorter names for Lua's own use */
#define l_likely(x) luai_likely(x)
#define l_unlikely(x) luai_unlikely(x)
#endif



/* }================================================================== */

Expand Down

0 comments on commit e0d4fda

Please sign in to comment.