mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-24 20:23:06 +00:00
update lua 5.5.1
This commit is contained in:
@@ -221,13 +221,21 @@ l_noret luaD_errerr (lua_State *L) {
|
||||
|
||||
|
||||
/*
|
||||
** Check whether stack has enough space to run a simple function (such
|
||||
** as a finalizer): At least BASIC_STACK_SIZE in the Lua stack and
|
||||
** 2 slots in the C stack.
|
||||
** Check whether stacks have enough space to run a simple function (such
|
||||
** as a finalizer): At least BASIC_STACK_SIZE in the Lua stack, two
|
||||
** available CallInfos, and two "slots" in the C stack.
|
||||
*/
|
||||
int luaD_checkminstack (lua_State *L) {
|
||||
return ((stacksize(L) < MAXSTACK - BASIC_STACK_SIZE) &&
|
||||
(getCcalls(L) < LUAI_MAXCCALLS - 2));
|
||||
if (getCcalls(L) >= LUAI_MAXCCALLS - 2)
|
||||
return 0; /* not enough C-stack slots */
|
||||
if (L->ci->next == NULL && luaE_extendCI(L, 0) == NULL)
|
||||
return 0; /* unable to allocate first ci */
|
||||
if (L->ci->next->next == NULL && luaE_extendCI(L, 0) == NULL)
|
||||
return 0; /* unable to allocate second ci */
|
||||
if (L->stack_last.p - L->top.p >= BASIC_STACK_SIZE)
|
||||
return 1; /* enough (BASIC_STACK_SIZE) free slots in the Lua stack */
|
||||
else /* try to grow stack to a size with enough free slots */
|
||||
return luaD_growstack(L, BASIC_STACK_SIZE, 0);
|
||||
}
|
||||
|
||||
|
||||
@@ -341,7 +349,7 @@ int luaD_reallocstack (lua_State *L, int newsize, int raiseerror) {
|
||||
correctstack(L, oldstack); /* change offsets back to pointers */
|
||||
L->stack_last.p = L->stack.p + newsize;
|
||||
for (i = oldsize + EXTRA_STACK; i < newsize + EXTRA_STACK; i++)
|
||||
setnilvalue(s2v(newstack + i)); /* erase new segment */
|
||||
setnilvalue2s(newstack + i); /* erase new segment */
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -422,12 +430,6 @@ void luaD_shrinkstack (lua_State *L) {
|
||||
luaE_shrinkCI(L); /* shrink CI list */
|
||||
}
|
||||
|
||||
|
||||
void luaD_inctop (lua_State *L) {
|
||||
L->top.p++;
|
||||
luaD_checkstack(L, 1);
|
||||
}
|
||||
|
||||
/* }================================================================== */
|
||||
|
||||
|
||||
@@ -546,7 +548,7 @@ l_sinline void genmoveresults (lua_State *L, StkId res, int nres,
|
||||
for (i = 0; i < nres; i++) /* move all results to correct place */
|
||||
setobjs2s(L, res + i, firstresult + i);
|
||||
for (; i < wanted; i++) /* complete wanted number of results */
|
||||
setnilvalue(s2v(res + i));
|
||||
setnilvalue2s(res + i);
|
||||
L->top.p = res + wanted; /* top points after the last result */
|
||||
}
|
||||
|
||||
@@ -566,7 +568,7 @@ l_sinline void moveresults (lua_State *L, StkId res, int nres,
|
||||
return;
|
||||
case 1 + 1: /* one value needed */
|
||||
if (nres == 0) /* no results? */
|
||||
setnilvalue(s2v(res)); /* adjust with nil */
|
||||
setnilvalue2s(res); /* adjust with nil */
|
||||
else /* at least one result */
|
||||
setobjs2s(L, res, L->top.p - nres); /* move it to proper place */
|
||||
L->top.p = res + 1;
|
||||
@@ -616,7 +618,7 @@ void luaD_poscall (lua_State *L, CallInfo *ci, int nres) {
|
||||
|
||||
|
||||
|
||||
#define next_ci(L) (L->ci->next ? L->ci->next : luaE_extendCI(L))
|
||||
#define next_ci(L) (L->ci->next ? L->ci->next : luaE_extendCI(L, 1))
|
||||
|
||||
|
||||
/*
|
||||
@@ -686,7 +688,7 @@ int luaD_pretailcall (lua_State *L, CallInfo *ci, StkId func,
|
||||
setobjs2s(L, ci->func.p + i, func + i);
|
||||
func = ci->func.p; /* moved-down function */
|
||||
for (; narg1 <= nfixparams; narg1++)
|
||||
setnilvalue(s2v(func + narg1)); /* complete missing arguments */
|
||||
setnilvalue2s(func + narg1); /* complete missing arguments */
|
||||
ci->top.p = func + 1 + fsize; /* top for new function */
|
||||
lua_assert(ci->top.p <= L->stack_last.p);
|
||||
ci->u.l.savedpc = p->code; /* starting point */
|
||||
@@ -733,7 +735,7 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) {
|
||||
L->ci = ci = prepCallInfo(L, func, status, func + 1 + fsize);
|
||||
ci->u.l.savedpc = p->code; /* starting point */
|
||||
for (; narg < nfixparams; narg++)
|
||||
setnilvalue(s2v(L->top.p++)); /* complete missing arguments */
|
||||
setnilvalue2s(L->top.p++); /* complete missing arguments */
|
||||
lua_assert(ci->top.p <= L->stack_last.p);
|
||||
return ci;
|
||||
}
|
||||
@@ -1120,28 +1122,54 @@ static void checkmode (lua_State *L, const char *mode, const char *x) {
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Before the first call to the reader function, Lua reserves a slot
|
||||
** with a table for anchoring stuff.
|
||||
*/
|
||||
static void f_parser (lua_State *L, void *ud) {
|
||||
LClosure *cl;
|
||||
struct SParser *p = cast(struct SParser *, ud);
|
||||
const char *mode = p->mode ? p->mode : "bt";
|
||||
int c = zgetc(p->z); /* read first character */
|
||||
int c;
|
||||
Table *anchor;
|
||||
ptrdiff_t otop = savestack(L, L->top.p); /* original top */
|
||||
luaD_checkstack(L, 2);
|
||||
anchor = luaH_new(L); /* create the anchor table */
|
||||
sethvalue2s(L, L->top.p++, anchor); /* anchor the anchor table */
|
||||
c = zgetc(p->z); /* read first character */
|
||||
if (c == LUA_SIGNATURE[0]) {
|
||||
int fixed = 0;
|
||||
if (strchr(mode, 'B') != NULL)
|
||||
fixed = 1;
|
||||
else
|
||||
checkmode(L, mode, "binary");
|
||||
cl = luaU_undump(L, p->z, p->name, fixed);
|
||||
cl = luaU_undump(L, p->z, anchor, p->name, fixed);
|
||||
}
|
||||
else {
|
||||
checkmode(L, mode, "text");
|
||||
cl = luaY_parser(L, p->z, &p->buff, &p->dyd, p->name, c);
|
||||
cl = luaY_parser(L, p->z, anchor, &p->buff, &p->dyd, p->name, c);
|
||||
}
|
||||
L->top.p = restorestack(L, otop); /* restore stack */
|
||||
setclLvalue2s(L, L->top.p++, cl); /* push closure */
|
||||
lua_assert(cl->nupvalues == cl->p->sizeupvalues);
|
||||
luaF_initupvals(L, cl);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Anchor an object in a table in the stack. First, anchor the object
|
||||
** temporarily in the stack, as luaH_set may call an emergency GC.
|
||||
** Then, add it in the table with itself as its key.
|
||||
*/
|
||||
void luaD_anchorobj (lua_State *L, Table *anchor, GCObject *obj) {
|
||||
setgcovalue(L, s2v(L->top.p++), obj); /* temporary anchor in the stack */
|
||||
luaH_set(L, anchor, s2v(L->top.p - 1), s2v(L->top.p - 1));
|
||||
/* Because this is a new key, luaH_set will call the GC barrier, so
|
||||
we don't need to call the barrier again here */
|
||||
L->top.p--;
|
||||
}
|
||||
|
||||
|
||||
TStatus luaD_protectedparser (lua_State *L, ZIO *z, const char *name,
|
||||
const char *mode) {
|
||||
struct SParser p;
|
||||
|
||||
Reference in New Issue
Block a user