mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-24 20:23:06 +00:00
Update lua 5.4.3
This commit is contained in:
@@ -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 ,
|
For detail ,
|
||||||
Shared Proto : http://lua-users.org/lists/lua-l/2014-03/msg00489.html
|
Shared Proto : http://lua-users.org/lists/lua-l/2014-03/msg00489.html
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ LUA_API int lua_gettop (lua_State *L) {
|
|||||||
|
|
||||||
LUA_API void lua_settop (lua_State *L, int idx) {
|
LUA_API void lua_settop (lua_State *L, int idx) {
|
||||||
CallInfo *ci;
|
CallInfo *ci;
|
||||||
StkId func;
|
StkId func, newtop;
|
||||||
ptrdiff_t diff; /* difference for new top */
|
ptrdiff_t diff; /* difference for new top */
|
||||||
lua_lock(L);
|
lua_lock(L);
|
||||||
ci = L->ci;
|
ci = L->ci;
|
||||||
@@ -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");
|
api_check(L, -(idx+1) <= (L->top - (func + 1)), "invalid new top");
|
||||||
diff = idx + 1; /* will "subtract" index (as it is negative) */
|
diff = idx + 1; /* will "subtract" index (as it is negative) */
|
||||||
}
|
}
|
||||||
#if defined(LUA_COMPAT_5_4_0)
|
api_check(L, L->tbclist < L->top, "previous pop of an unclosed slot");
|
||||||
if (diff < 0 && hastocloseCfunc(ci->nresults))
|
newtop = L->top + diff;
|
||||||
luaF_close(L, L->top + diff, CLOSEKTOP, 0);
|
if (diff < 0 && L->tbclist >= newtop) {
|
||||||
#endif
|
lua_assert(hastocloseCfunc(ci->nresults));
|
||||||
api_check(L, L->tbclist < L->top + diff, "cannot pop an unclosed slot");
|
luaF_close(L, newtop, CLOSEKTOP, 0);
|
||||||
L->top += diff;
|
}
|
||||||
|
L->top = newtop; /* correct top only after closing any upvalue */
|
||||||
lua_unlock(L);
|
lua_unlock(L);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "luaconf.h"
|
||||||
#include "lua.h"
|
#include "lua.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -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) \
|
#define luaL_newlibtable(L,l) \
|
||||||
lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
|
lua_createtable(L, 0, sizeof(l)/sizeof((l)[0]) - 1)
|
||||||
@@ -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))
|
(luaL_checkversion(L), luaL_newlibtable(L,l), luaL_setfuncs(L,l,0))
|
||||||
|
|
||||||
#define luaL_argcheck(L, cond,arg,extramsg) \
|
#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) \
|
#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_checkstring(L,n) (luaL_checklstring(L, (n), NULL))
|
||||||
#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL))
|
#define luaL_optstring(L,n,d) (luaL_optlstring(L, (n), (d), NULL))
|
||||||
|
|||||||
@@ -50,6 +50,8 @@ static int currentpc (CallInfo *ci) {
|
|||||||
** an integer division gets the right place. When the source file has
|
** an integer division gets the right place. When the source file has
|
||||||
** large sequences of empty/comment lines, it may need extra entries,
|
** large sequences of empty/comment lines, it may need extra entries,
|
||||||
** so the original estimate needs a correction.
|
** 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
|
** 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
|
** is valid as long as the debug info has been generated with the same
|
||||||
** value for MAXIWTHABS or smaller. (Previous releases use a little
|
** value for MAXIWTHABS or smaller. (Previous releases use a little
|
||||||
@@ -63,7 +65,8 @@ static int getbaseline (const Proto *f, int pc, int *basepc) {
|
|||||||
else {
|
else {
|
||||||
int i = cast_uint(pc) / MAXIWTHABS - 1; /* get an estimate */
|
int i = cast_uint(pc) / MAXIWTHABS - 1; /* get an estimate */
|
||||||
/* estimate must be a lower bond of the correct base */
|
/* 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)
|
while (i + 1 < f->sizeabslineinfo && pc >= f->abslineinfo[i + 1].pc)
|
||||||
i++; /* low estimate; adjust it */
|
i++; /* low estimate; adjust it */
|
||||||
*basepc = f->abslineinfo[i].pc;
|
*basepc = f->abslineinfo[i].pc;
|
||||||
|
|||||||
@@ -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.
|
** Insert a variable in the list of to-be-closed variables.
|
||||||
*/
|
*/
|
||||||
@@ -163,13 +172,11 @@ void luaF_newtbcupval (lua_State *L, StkId level) {
|
|||||||
if (l_isfalse(s2v(level)))
|
if (l_isfalse(s2v(level)))
|
||||||
return; /* false doesn't need to be closed */
|
return; /* false doesn't need to be closed */
|
||||||
checkclosemth(L, level); /* value must have a close method */
|
checkclosemth(L, level); /* value must have a close method */
|
||||||
while (level - L->tbclist > USHRT_MAX) { /* is delta too large? */
|
while (cast_uint(level - L->tbclist) > MAXDELTA) {
|
||||||
L->tbclist += USHRT_MAX; /* create a dummy node at maximum delta */
|
L->tbclist += MAXDELTA; /* create a dummy node at maximum delta */
|
||||||
L->tbclist->tbclist.delta = USHRT_MAX;
|
L->tbclist->tbclist.delta = 0;
|
||||||
L->tbclist->tbclist.isdummy = 1;
|
|
||||||
}
|
}
|
||||||
level->tbclist.delta = level - L->tbclist;
|
level->tbclist.delta = cast(unsigned short, level - L->tbclist);
|
||||||
level->tbclist.isdummy = 0;
|
|
||||||
L->tbclist = level;
|
L->tbclist = level;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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
|
** Close all upvalues and to-be-closed variables up to the given stack
|
||||||
** level.
|
** level.
|
||||||
@@ -211,11 +231,9 @@ void luaF_close (lua_State *L, StkId level, int status, int yy) {
|
|||||||
luaF_closeupval(L, level); /* first, close the upvalues */
|
luaF_closeupval(L, level); /* first, close the upvalues */
|
||||||
while (L->tbclist >= level) { /* traverse tbc's down to that level */
|
while (L->tbclist >= level) { /* traverse tbc's down to that level */
|
||||||
StkId tbc = L->tbclist; /* get variable index */
|
StkId tbc = L->tbclist; /* get variable index */
|
||||||
L->tbclist -= tbc->tbclist.delta; /* remove it from list */
|
poptbclist(L); /* remove it from list */
|
||||||
if (!tbc->tbclist.isdummy) { /* not a dummy entry? */
|
prepcallclosemth(L, tbc, status, yy); /* close variable */
|
||||||
prepcallclosemth(L, tbc, status, yy); /* close variable */
|
level = restorestack(L, levelrel);
|
||||||
level = restorestack(L, levelrel);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -139,13 +139,14 @@ typedef struct TValue {
|
|||||||
** Entries in a Lua stack. Field 'tbclist' forms a list of all
|
** Entries in a Lua stack. Field 'tbclist' forms a list of all
|
||||||
** to-be-closed variables active in this stack. Dummy entries are
|
** to-be-closed variables active in this stack. Dummy entries are
|
||||||
** used when the distance between two tbc variables does not fit
|
** 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 {
|
typedef union StackValue {
|
||||||
TValue val;
|
TValue val;
|
||||||
struct {
|
struct {
|
||||||
TValuefields;
|
TValuefields;
|
||||||
lu_byte isdummy;
|
|
||||||
unsigned short delta;
|
unsigned short delta;
|
||||||
} tbclist;
|
} tbclist;
|
||||||
} StackValue;
|
} StackValue;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
#include "atomic.h"
|
#include "atomic.h"
|
||||||
|
|
||||||
static unsigned int STRSEED;
|
static unsigned int STRSEED;
|
||||||
static ATOM_SIZET STRID = 0;
|
static size_t STRID = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Maximum size for string table.
|
** Maximum size for string table.
|
||||||
|
|||||||
@@ -68,20 +68,25 @@
|
|||||||
#define MAXHSIZE luaM_limitN(1u << MAXHBITS, Node)
|
#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 hashpow2(t,n) (gnode(t, lmod((n), sizenode(t))))
|
||||||
|
|
||||||
|
/*
|
||||||
|
** 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 hashstr(t,str) hashpow2(t, (str)->hash)
|
||||||
#define hashboolean(t,p) hashpow2(t, p)
|
#define hashboolean(t,p) hashpow2(t, p)
|
||||||
|
|
||||||
#define hashint(t,i) hashpow2(t, i)
|
#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.
|
|
||||||
*/
|
|
||||||
#define hashmod(t,n) (gnode(t, ((n) % ((sizenode(t)-1)|1))))
|
|
||||||
|
|
||||||
|
|
||||||
#define hashpointer(t,p) hashmod(t, point2uint(p))
|
#define hashpointer(t,p) hashmod(t, point2uint(p))
|
||||||
|
|
||||||
|
|
||||||
@@ -135,24 +140,38 @@ static int l_hashfloat (lua_Number n) {
|
|||||||
*/
|
*/
|
||||||
static Node *mainposition (const Table *t, int ktt, const Value *kvl) {
|
static Node *mainposition (const Table *t, int ktt, const Value *kvl) {
|
||||||
switch (withvariant(ktt)) {
|
switch (withvariant(ktt)) {
|
||||||
case LUA_VNUMINT:
|
case LUA_VNUMINT: {
|
||||||
return hashint(t, ivalueraw(*kvl));
|
lua_Integer key = ivalueraw(*kvl);
|
||||||
case LUA_VNUMFLT:
|
return hashint(t, key);
|
||||||
return hashmod(t, l_hashfloat(fltvalueraw(*kvl)));
|
}
|
||||||
case LUA_VSHRSTR:
|
case LUA_VNUMFLT: {
|
||||||
return hashstr(t, tsvalueraw(*kvl));
|
lua_Number n = fltvalueraw(*kvl);
|
||||||
case LUA_VLNGSTR:
|
return hashmod(t, l_hashfloat(n));
|
||||||
return hashpow2(t, luaS_hashlongstr(tsvalueraw(*kvl)));
|
}
|
||||||
|
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:
|
case LUA_VFALSE:
|
||||||
return hashboolean(t, 0);
|
return hashboolean(t, 0);
|
||||||
case LUA_VTRUE:
|
case LUA_VTRUE:
|
||||||
return hashboolean(t, 1);
|
return hashboolean(t, 1);
|
||||||
case LUA_VLIGHTUSERDATA:
|
case LUA_VLIGHTUSERDATA: {
|
||||||
return hashpointer(t, pvalueraw(*kvl));
|
void *p = pvalueraw(*kvl);
|
||||||
case LUA_VLCF:
|
return hashpointer(t, p);
|
||||||
return hashpointer(t, fvalueraw(*kvl));
|
}
|
||||||
default:
|
case LUA_VLCF: {
|
||||||
return hashpointer(t, gcvalueraw(*kvl));
|
lua_CFunction f = fvalueraw(*kvl);
|
||||||
|
return hashpointer(t, f);
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
GCObject *o = gcvalueraw(*kvl);
|
||||||
|
return hashpointer(t, o);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -663,22 +663,30 @@
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
** macros to improve jump prediction, used mostly for error handling
|
** 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__) && !defined(LUA_NOBUILTIN)
|
||||||
#if defined(__GNUC__)
|
#define luai_likely(x) (__builtin_expect(((x) != 0), 1))
|
||||||
#define l_likely(x) (__builtin_expect(((x) != 0), 1))
|
#define luai_unlikely(x) (__builtin_expect(((x) != 0), 0))
|
||||||
#define l_unlikely(x) (__builtin_expect(((x) != 0), 0))
|
|
||||||
#else
|
#else
|
||||||
#define l_likely(x) (x)
|
#define luai_likely(x) (x)
|
||||||
#define l_unlikely(x) (x)
|
#define luai_unlikely(x) (x)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* }================================================================== */
|
/* }================================================================== */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user