mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-22 02:53:09 +00:00
Update lua 5.4.6 rc1
This commit is contained in:
@@ -1351,6 +1351,35 @@ static int constfolding (FuncState *fs, int op, expdesc *e1,
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Convert a BinOpr to an OpCode (ORDER OPR - ORDER OP)
|
||||
*/
|
||||
l_sinline OpCode binopr2op (BinOpr opr, BinOpr baser, OpCode base) {
|
||||
lua_assert(baser <= opr &&
|
||||
((baser == OPR_ADD && opr <= OPR_SHR) ||
|
||||
(baser == OPR_LT && opr <= OPR_LE)));
|
||||
return cast(OpCode, (cast_int(opr) - cast_int(baser)) + cast_int(base));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Convert a UnOpr to an OpCode (ORDER OPR - ORDER OP)
|
||||
*/
|
||||
l_sinline OpCode unopr2op (UnOpr opr) {
|
||||
return cast(OpCode, (cast_int(opr) - cast_int(OPR_MINUS)) +
|
||||
cast_int(OP_UNM));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Convert a BinOpr to a tag method (ORDER OPR - ORDER TM)
|
||||
*/
|
||||
l_sinline TMS binopr2TM (BinOpr opr) {
|
||||
lua_assert(OPR_ADD <= opr && opr <= OPR_SHR);
|
||||
return cast(TMS, (cast_int(opr) - cast_int(OPR_ADD)) + cast_int(TM_ADD));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Emit code for unary expressions that "produce values"
|
||||
** (everything but 'not').
|
||||
@@ -1389,15 +1418,15 @@ static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2,
|
||||
** Emit code for binary expressions that "produce values" over
|
||||
** two registers.
|
||||
*/
|
||||
static void codebinexpval (FuncState *fs, OpCode op,
|
||||
static void codebinexpval (FuncState *fs, BinOpr opr,
|
||||
expdesc *e1, expdesc *e2, int line) {
|
||||
OpCode op = binopr2op(opr, OPR_ADD, OP_ADD);
|
||||
int v2 = luaK_exp2anyreg(fs, e2); /* make sure 'e2' is in a register */
|
||||
/* 'e1' must be already in a register or it is a constant */
|
||||
lua_assert((VNIL <= e1->k && e1->k <= VKSTR) ||
|
||||
e1->k == VNONRELOC || e1->k == VRELOC);
|
||||
lua_assert(OP_ADD <= op && op <= OP_SHR);
|
||||
finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN,
|
||||
cast(TMS, (op - OP_ADD) + TM_ADD));
|
||||
finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN, binopr2TM(opr));
|
||||
}
|
||||
|
||||
|
||||
@@ -1418,9 +1447,9 @@ static void codebini (FuncState *fs, OpCode op,
|
||||
*/
|
||||
static void codebinK (FuncState *fs, BinOpr opr,
|
||||
expdesc *e1, expdesc *e2, int flip, int line) {
|
||||
TMS event = cast(TMS, opr + TM_ADD);
|
||||
TMS event = binopr2TM(opr);
|
||||
int v2 = e2->u.info; /* K index */
|
||||
OpCode op = cast(OpCode, opr + OP_ADDK);
|
||||
OpCode op = binopr2op(opr, OPR_ADD, OP_ADDK);
|
||||
finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, event);
|
||||
}
|
||||
|
||||
@@ -1457,10 +1486,9 @@ static void swapexps (expdesc *e1, expdesc *e2) {
|
||||
*/
|
||||
static void codebinNoK (FuncState *fs, BinOpr opr,
|
||||
expdesc *e1, expdesc *e2, int flip, int line) {
|
||||
OpCode op = cast(OpCode, opr + OP_ADD);
|
||||
if (flip)
|
||||
swapexps(e1, e2); /* back to original order */
|
||||
codebinexpval(fs, op, e1, e2, line); /* use standard operators */
|
||||
codebinexpval(fs, opr, e1, e2, line); /* use standard operators */
|
||||
}
|
||||
|
||||
|
||||
@@ -1490,7 +1518,7 @@ static void codecommutative (FuncState *fs, BinOpr op,
|
||||
flip = 1;
|
||||
}
|
||||
if (op == OPR_ADD && isSCint(e2)) /* immediate operand? */
|
||||
codebini(fs, cast(OpCode, OP_ADDI), e1, e2, flip, line, TM_ADD);
|
||||
codebini(fs, OP_ADDI, e1, e2, flip, line, TM_ADD);
|
||||
else
|
||||
codearith(fs, op, e1, e2, flip, line);
|
||||
}
|
||||
@@ -1518,25 +1546,27 @@ static void codebitwise (FuncState *fs, BinOpr opr,
|
||||
** Emit code for order comparisons. When using an immediate operand,
|
||||
** 'isfloat' tells whether the original value was a float.
|
||||
*/
|
||||
static void codeorder (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) {
|
||||
static void codeorder (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {
|
||||
int r1, r2;
|
||||
int im;
|
||||
int isfloat = 0;
|
||||
OpCode op;
|
||||
if (isSCnumber(e2, &im, &isfloat)) {
|
||||
/* use immediate operand */
|
||||
r1 = luaK_exp2anyreg(fs, e1);
|
||||
r2 = im;
|
||||
op = cast(OpCode, (op - OP_LT) + OP_LTI);
|
||||
op = binopr2op(opr, OPR_LT, OP_LTI);
|
||||
}
|
||||
else if (isSCnumber(e1, &im, &isfloat)) {
|
||||
/* transform (A < B) to (B > A) and (A <= B) to (B >= A) */
|
||||
r1 = luaK_exp2anyreg(fs, e2);
|
||||
r2 = im;
|
||||
op = (op == OP_LT) ? OP_GTI : OP_GEI;
|
||||
op = binopr2op(opr, OPR_LT, OP_GTI);
|
||||
}
|
||||
else { /* regular case, compare two registers */
|
||||
r1 = luaK_exp2anyreg(fs, e1);
|
||||
r2 = luaK_exp2anyreg(fs, e2);
|
||||
op = binopr2op(opr, OPR_LT, OP_LT);
|
||||
}
|
||||
freeexps(fs, e1, e2);
|
||||
e1->u.info = condjump(fs, op, r1, r2, isfloat, 1);
|
||||
@@ -1579,16 +1609,16 @@ static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {
|
||||
/*
|
||||
** Apply prefix operation 'op' to expression 'e'.
|
||||
*/
|
||||
void luaK_prefix (FuncState *fs, UnOpr op, expdesc *e, int line) {
|
||||
void luaK_prefix (FuncState *fs, UnOpr opr, expdesc *e, int line) {
|
||||
static const expdesc ef = {VKINT, {0}, NO_JUMP, NO_JUMP};
|
||||
luaK_dischargevars(fs, e);
|
||||
switch (op) {
|
||||
switch (opr) {
|
||||
case OPR_MINUS: case OPR_BNOT: /* use 'ef' as fake 2nd operand */
|
||||
if (constfolding(fs, op + LUA_OPUNM, e, &ef))
|
||||
if (constfolding(fs, opr + LUA_OPUNM, e, &ef))
|
||||
break;
|
||||
/* else */ /* FALLTHROUGH */
|
||||
case OPR_LEN:
|
||||
codeunexpval(fs, cast(OpCode, op + OP_UNM), e, line);
|
||||
codeunexpval(fs, unopr2op(opr), e, line);
|
||||
break;
|
||||
case OPR_NOT: codenot(fs, e); break;
|
||||
default: lua_assert(0);
|
||||
@@ -1718,30 +1748,27 @@ void luaK_posfix (FuncState *fs, BinOpr opr,
|
||||
/* coded as (r1 >> -I) */;
|
||||
}
|
||||
else /* regular case (two registers) */
|
||||
codebinexpval(fs, OP_SHL, e1, e2, line);
|
||||
codebinexpval(fs, opr, e1, e2, line);
|
||||
break;
|
||||
}
|
||||
case OPR_SHR: {
|
||||
if (isSCint(e2))
|
||||
codebini(fs, OP_SHRI, e1, e2, 0, line, TM_SHR); /* r1 >> I */
|
||||
else /* regular case (two registers) */
|
||||
codebinexpval(fs, OP_SHR, e1, e2, line);
|
||||
codebinexpval(fs, opr, e1, e2, line);
|
||||
break;
|
||||
}
|
||||
case OPR_EQ: case OPR_NE: {
|
||||
codeeq(fs, opr, e1, e2);
|
||||
break;
|
||||
}
|
||||
case OPR_LT: case OPR_LE: {
|
||||
OpCode op = cast(OpCode, (opr - OPR_EQ) + OP_EQ);
|
||||
codeorder(fs, op, e1, e2);
|
||||
break;
|
||||
}
|
||||
case OPR_GT: case OPR_GE: {
|
||||
/* '(a > b)' <=> '(b < a)'; '(a >= b)' <=> '(b <= a)' */
|
||||
OpCode op = cast(OpCode, (opr - OPR_NE) + OP_EQ);
|
||||
swapexps(e1, e2);
|
||||
codeorder(fs, op, e1, e2);
|
||||
opr = cast(BinOpr, (opr - OPR_GT) + OPR_LT);
|
||||
} /* FALLTHROUGH */
|
||||
case OPR_LT: case OPR_LE: {
|
||||
codeorder(fs, opr, e1, e2);
|
||||
break;
|
||||
}
|
||||
default: lua_assert(0);
|
||||
|
||||
@@ -76,7 +76,7 @@ static int luaB_auxwrap (lua_State *L) {
|
||||
if (l_unlikely(r < 0)) { /* error? */
|
||||
int stat = lua_status(co);
|
||||
if (stat != LUA_OK && stat != LUA_YIELD) { /* error in the coroutine? */
|
||||
stat = lua_resetthread(co, L); /* close its tbc variables */
|
||||
stat = lua_closethread(co, L); /* close its tbc variables */
|
||||
lua_assert(stat != LUA_OK);
|
||||
lua_xmove(co, L, 1); /* move error message to the caller */
|
||||
}
|
||||
@@ -172,7 +172,7 @@ static int luaB_close (lua_State *L) {
|
||||
int status = auxstatus(L, co);
|
||||
switch (status) {
|
||||
case COS_DEAD: case COS_YIELD: {
|
||||
status = lua_resetthread(co, L);
|
||||
status = lua_closethread(co, L);
|
||||
if (status == LUA_OK) {
|
||||
lua_pushboolean(L, 1);
|
||||
return 1;
|
||||
|
||||
@@ -656,18 +656,19 @@ static const char *funcnamefromcall (lua_State *L, CallInfo *ci,
|
||||
|
||||
|
||||
/*
|
||||
** Check whether pointer 'o' points to some value in the stack
|
||||
** frame of the current function. Because 'o' may not point to a
|
||||
** value in this stack, we cannot compare it with the region
|
||||
** boundaries (undefined behaviour in ISO C).
|
||||
** Check whether pointer 'o' points to some value in the stack frame of
|
||||
** the current function and, if so, returns its index. Because 'o' may
|
||||
** not point to a value in this stack, we cannot compare it with the
|
||||
** region boundaries (undefined behavior in ISO C).
|
||||
*/
|
||||
static int isinstack (CallInfo *ci, const TValue *o) {
|
||||
StkId pos;
|
||||
for (pos = ci->func.p + 1; pos < ci->top.p; pos++) {
|
||||
if (o == s2v(pos))
|
||||
return 1;
|
||||
static int instack (CallInfo *ci, const TValue *o) {
|
||||
int pos;
|
||||
StkId base = ci->func.p + 1;
|
||||
for (pos = 0; base + pos < ci->top.p; pos++) {
|
||||
if (o == s2v(base + pos))
|
||||
return pos;
|
||||
}
|
||||
return 0; /* not found */
|
||||
return -1; /* not found */
|
||||
}
|
||||
|
||||
|
||||
@@ -708,9 +709,11 @@ static const char *varinfo (lua_State *L, const TValue *o) {
|
||||
const char *kind = NULL;
|
||||
if (isLua(ci)) {
|
||||
kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */
|
||||
if (!kind && isinstack(ci, o)) /* no? try a register */
|
||||
kind = getobjname(ci_func(ci)->p, currentpc(ci),
|
||||
cast_int(cast(StkId, o) - (ci->func.p + 1)), &name);
|
||||
if (!kind) { /* not an upvalue? */
|
||||
int reg = instack(ci, o); /* try a register */
|
||||
if (reg >= 0) /* is 'o' a register? */
|
||||
kind = getobjname(ci_func(ci)->p, currentpc(ci), reg, &name);
|
||||
}
|
||||
}
|
||||
return formatvarinfo(L, kind, name);
|
||||
}
|
||||
@@ -845,7 +848,7 @@ static int changedline (const Proto *p, int oldpc, int newpc) {
|
||||
if (p->lineinfo == NULL) /* no debug information? */
|
||||
return 0;
|
||||
if (newpc - oldpc < MAXIWTHABS / 2) { /* not too far apart? */
|
||||
int delta = 0; /* line diference */
|
||||
int delta = 0; /* line difference */
|
||||
int pc = oldpc;
|
||||
for (;;) {
|
||||
int lineinfo = p->lineinfo[++pc];
|
||||
|
||||
@@ -299,17 +299,13 @@ static int stackinuse (lua_State *L) {
|
||||
*/
|
||||
void luaD_shrinkstack (lua_State *L) {
|
||||
int inuse = stackinuse(L);
|
||||
int nsize = inuse * 2; /* proposed new size */
|
||||
int max = inuse * 3; /* maximum "reasonable" size */
|
||||
if (max > LUAI_MAXSTACK) {
|
||||
max = LUAI_MAXSTACK; /* respect stack limit */
|
||||
if (nsize > LUAI_MAXSTACK)
|
||||
nsize = LUAI_MAXSTACK;
|
||||
}
|
||||
int max = (inuse > LUAI_MAXSTACK / 3) ? LUAI_MAXSTACK : inuse * 3;
|
||||
/* if thread is currently not handling a stack overflow and its
|
||||
size is larger than maximum "reasonable" size, shrink it */
|
||||
if (inuse <= LUAI_MAXSTACK && stacksize(L) > max)
|
||||
if (inuse <= LUAI_MAXSTACK && stacksize(L) > max) {
|
||||
int nsize = (inuse > LUAI_MAXSTACK / 2) ? LUAI_MAXSTACK : inuse * 2;
|
||||
luaD_reallocstack(L, nsize, 0); /* ok if that fails */
|
||||
}
|
||||
else /* don't change stack */
|
||||
condmovestack(L,{},{}); /* (change only for debugging) */
|
||||
luaE_shrinkCI(L); /* shrink CI list */
|
||||
@@ -629,7 +625,7 @@ CallInfo *luaD_precall (lua_State *L, StkId func, int nresults) {
|
||||
** check the stack before doing anything else. 'luaD_precall' already
|
||||
** does that.
|
||||
*/
|
||||
l_sinline void ccall (lua_State *L, StkId func, int nResults, int inc) {
|
||||
l_sinline void ccall (lua_State *L, StkId func, int nResults, l_uint32 inc) {
|
||||
CallInfo *ci;
|
||||
L->nCcalls += inc;
|
||||
if (l_unlikely(getCcalls(L) >= LUAI_MAXCCALLS)) {
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "lprefix.h"
|
||||
|
||||
|
||||
#include <limits.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "lua.h"
|
||||
@@ -55,8 +56,11 @@ static void dumpByte (DumpState *D, int y) {
|
||||
}
|
||||
|
||||
|
||||
/* dumpInt Buff Size */
|
||||
#define DIBS ((sizeof(size_t) * 8 / 7) + 1)
|
||||
/*
|
||||
** 'dumpSize' buffer size: each byte can store up to 7 bits. (The "+6"
|
||||
** rounds up the division.)
|
||||
*/
|
||||
#define DIBS ((sizeof(size_t) * CHAR_BIT + 6) / 7)
|
||||
|
||||
static void dumpSize (DumpState *D, size_t x) {
|
||||
lu_byte buff[DIBS];
|
||||
|
||||
@@ -128,7 +128,7 @@ l_noret luaX_syntaxerror (LexState *ls, const char *msg) {
|
||||
** ensuring there is only one copy of each unique string. The table
|
||||
** here is used as a set: the string enters as the key, while its value
|
||||
** is irrelevant. We use the string itself as the value only because it
|
||||
** is a TValue readly available. Later, the code generation can change
|
||||
** is a TValue readily available. Later, the code generation can change
|
||||
** this value.
|
||||
*/
|
||||
TString *luaX_newstring (LexState *ls, const char *str, size_t l) {
|
||||
|
||||
@@ -71,11 +71,24 @@ typedef signed char ls_byte;
|
||||
|
||||
|
||||
/*
|
||||
** conversion of pointer to unsigned integer:
|
||||
** this is for hashing only; there is no problem if the integer
|
||||
** cannot hold the whole pointer value
|
||||
** conversion of pointer to unsigned integer: this is for hashing only;
|
||||
** there is no problem if the integer cannot hold the whole pointer
|
||||
** value. (In strict ISO C this may cause undefined behavior, but no
|
||||
** actual machine seems to bother.)
|
||||
*/
|
||||
#define point2uint(p) ((unsigned int)((size_t)(p) & UINT_MAX))
|
||||
#if !defined(LUA_USE_C89) && defined(__STDC_VERSION__) && \
|
||||
__STDC_VERSION__ >= 199901L
|
||||
#include <stdint.h>
|
||||
#if defined(UINTPTR_MAX) /* even in C99 this type is optional */
|
||||
#define L_P2I uintptr_t
|
||||
#else /* no 'intptr'? */
|
||||
#define L_P2I uintmax_t /* use the largest available integer */
|
||||
#endif
|
||||
#else /* C89 option */
|
||||
#define L_P2I size_t
|
||||
#endif
|
||||
|
||||
#define point2uint(p) ((unsigned int)((L_P2I)(p) & UINT_MAX))
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ iABC C(8) | B(8) |k| A(8) | Op(7) |
|
||||
iABx Bx(17) | A(8) | Op(7) |
|
||||
iAsBx sBx (signed)(17) | A(8) | Op(7) |
|
||||
iAx Ax(25) | Op(7) |
|
||||
isJ sJ(25) | Op(7) |
|
||||
isJ sJ (signed)(25) | Op(7) |
|
||||
|
||||
A signed argument is represented in excess K: the represented value is
|
||||
the written unsigned value minus K, where K is half the maximum for the
|
||||
|
||||
@@ -30,23 +30,14 @@
|
||||
*/
|
||||
#if !defined(LUA_STRFTIMEOPTIONS) /* { */
|
||||
|
||||
/* options for ANSI C 89 (only 1-char options) */
|
||||
#define L_STRFTIMEC89 "aAbBcdHIjmMpSUwWxXyYZ%"
|
||||
|
||||
/* options for ISO C 99 and POSIX */
|
||||
#define L_STRFTIMEC99 "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%" \
|
||||
"||" "EcECExEXEyEY" "OdOeOHOIOmOMOSOuOUOVOwOWOy" /* two-char options */
|
||||
|
||||
/* options for Windows */
|
||||
#define L_STRFTIMEWIN "aAbBcdHIjmMpSUwWxXyYzZ%" \
|
||||
"||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y" /* two-char options */
|
||||
|
||||
#if defined(LUA_USE_WINDOWS)
|
||||
#define LUA_STRFTIMEOPTIONS L_STRFTIMEWIN
|
||||
#elif defined(LUA_USE_C89)
|
||||
#define LUA_STRFTIMEOPTIONS L_STRFTIMEC89
|
||||
#define LUA_STRFTIMEOPTIONS "aAbBcdHIjmMpSUwWxXyYzZ%" \
|
||||
"||" "#c#x#d#H#I#j#m#M#S#U#w#W#y#Y" /* two-char options */
|
||||
#elif defined(LUA_USE_C89) /* ANSI C 89 (only 1-char options) */
|
||||
#define LUA_STRFTIMEOPTIONS "aAbBcdHIjmMpSUwWxXyYZ%"
|
||||
#else /* C99 specification */
|
||||
#define LUA_STRFTIMEOPTIONS L_STRFTIMEC99
|
||||
#define LUA_STRFTIMEOPTIONS "aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ%" \
|
||||
"||" "EcECExEXEyEY" "OdOeOHOIOmOMOSOuOUOVOwOWOy" /* two-char options */
|
||||
#endif
|
||||
|
||||
#endif /* } */
|
||||
@@ -138,21 +129,14 @@
|
||||
/* }================================================================== */
|
||||
|
||||
|
||||
/*
|
||||
** Despite claiming to be ISO, the C library in some Apple platforms
|
||||
** does not implement 'system'.
|
||||
*/
|
||||
#if !defined(l_system) && defined(__APPLE__) /* { */
|
||||
#include "TargetConditionals.h"
|
||||
#if TARGET_OS_IOS || TARGET_OS_WATCH || TARGET_OS_TV
|
||||
#define l_system(cmd) ((cmd) == NULL ? 0 : -1)
|
||||
#endif
|
||||
#endif /* } */
|
||||
|
||||
#if !defined(l_system)
|
||||
#if defined(LUA_USE_IOS)
|
||||
/* Despite claiming to be ISO C, iOS does not implement 'system'. */
|
||||
#define l_system(cmd) ((cmd) == NULL ? 0 : -1)
|
||||
#else
|
||||
#define l_system(cmd) system(cmd) /* default definition */
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
static int os_execute (lua_State *L) {
|
||||
|
||||
@@ -521,12 +521,12 @@ static l_noret jumpscopeerror (LexState *ls, Labeldesc *gt) {
|
||||
|
||||
/*
|
||||
** Solves the goto at index 'g' to given 'label' and removes it
|
||||
** from the list of pending goto's.
|
||||
** from the list of pending gotos.
|
||||
** If it jumps into the scope of some variable, raises an error.
|
||||
*/
|
||||
static void solvegoto (LexState *ls, int g, Labeldesc *label) {
|
||||
int i;
|
||||
Labellist *gl = &ls->dyd->gt; /* list of goto's */
|
||||
Labellist *gl = &ls->dyd->gt; /* list of gotos */
|
||||
Labeldesc *gt = &gl->arr[g]; /* goto to be resolved */
|
||||
lua_assert(eqstr(gt->name, label->name));
|
||||
if (l_unlikely(gt->nactvar < label->nactvar)) /* enter some scope? */
|
||||
@@ -580,7 +580,7 @@ static int newgotoentry (LexState *ls, TString *name, int line, int pc) {
|
||||
/*
|
||||
** Solves forward jumps. Check whether new label 'lb' matches any
|
||||
** pending gotos in current block and solves them. Return true
|
||||
** if any of the goto's need to close upvalues.
|
||||
** if any of the gotos need to close upvalues.
|
||||
*/
|
||||
static int solvegotos (LexState *ls, Labeldesc *lb) {
|
||||
Labellist *gl = &ls->dyd->gt;
|
||||
@@ -601,7 +601,7 @@ static int solvegotos (LexState *ls, Labeldesc *lb) {
|
||||
/*
|
||||
** Create a new label with the given 'name' at the given 'line'.
|
||||
** 'last' tells whether label is the last non-op statement in its
|
||||
** block. Solves all pending goto's to this new label and adds
|
||||
** block. Solves all pending gotos to this new label and adds
|
||||
** a close instruction if necessary.
|
||||
** Returns true iff it added a close instruction.
|
||||
*/
|
||||
|
||||
@@ -339,7 +339,7 @@ int luaE_resetthread (lua_State *L, int status) {
|
||||
}
|
||||
|
||||
|
||||
LUA_API int lua_resetthread (lua_State *L, lua_State *from) {
|
||||
LUA_API int lua_closethread (lua_State *L, lua_State *from) {
|
||||
int status;
|
||||
lua_lock(L);
|
||||
L->nCcalls = (from) ? getCcalls(from) : 0;
|
||||
@@ -349,6 +349,14 @@ LUA_API int lua_resetthread (lua_State *L, lua_State *from) {
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Deprecated! Use 'lua_closethread' instead.
|
||||
*/
|
||||
LUA_API int lua_resetthread (lua_State *L) {
|
||||
return lua_closethread(L, NULL);
|
||||
}
|
||||
|
||||
|
||||
LUA_API lua_State *lua_newstate (lua_Alloc f, void *ud) {
|
||||
int i;
|
||||
lua_State *L;
|
||||
|
||||
@@ -570,7 +570,7 @@ static const char *match_capture (MatchState *ms, const char *s, int l) {
|
||||
static const char *match (MatchState *ms, const char *s, const char *p) {
|
||||
if (l_unlikely(ms->matchdepth-- == 0))
|
||||
luaL_error(ms->L, "pattern too complex");
|
||||
init: /* using goto's to optimize tail recursion */
|
||||
init: /* using goto to optimize tail recursion */
|
||||
if (p != ms->p_end) { /* end of pattern? */
|
||||
switch (*p) {
|
||||
case '(': { /* start capture */
|
||||
|
||||
@@ -259,9 +259,11 @@ LUAI_FUNC unsigned int luaH_realasize (const Table *t) {
|
||||
size |= (size >> 2);
|
||||
size |= (size >> 4);
|
||||
size |= (size >> 8);
|
||||
#if (UINT_MAX >> 14) > 3 /* unsigned int has more than 16 bits */
|
||||
size |= (size >> 16);
|
||||
#if (UINT_MAX >> 30) > 3
|
||||
size |= (size >> 32); /* unsigned int has more than 32 bits */
|
||||
#endif
|
||||
#endif
|
||||
size++;
|
||||
lua_assert(ispow2(size) && size/2 < t->alimit && t->alimit < size);
|
||||
|
||||
@@ -666,7 +666,7 @@ int main (int argc, char **argv) {
|
||||
l_message(argv[0], "cannot create state: not enough memory");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
lua_gc(L, LUA_GCSTOP); /* stop GC while buidling state */
|
||||
lua_gc(L, LUA_GCSTOP); /* stop GC while building state */
|
||||
lua_pushcfunction(L, &pmain); /* to call 'pmain' in protected mode */
|
||||
lua_pushinteger(L, argc); /* 1st argument */
|
||||
lua_pushlightuserdata(L, argv); /* 2nd argument */
|
||||
|
||||
@@ -18,14 +18,14 @@
|
||||
|
||||
#define LUA_VERSION_MAJOR "5"
|
||||
#define LUA_VERSION_MINOR "4"
|
||||
#define LUA_VERSION_RELEASE "5"
|
||||
#define LUA_VERSION_RELEASE "6"
|
||||
|
||||
#define LUA_VERSION_NUM 504
|
||||
#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + 5)
|
||||
#define LUA_VERSION_RELEASE_NUM (LUA_VERSION_NUM * 100 + 6)
|
||||
|
||||
#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-2022 Lua.org, PUC-Rio"
|
||||
#define LUA_COPYRIGHT LUA_RELEASE " Copyright (C) 1994-2023 Lua.org, PUC-Rio"
|
||||
#define LUA_AUTHORS "R. Ierusalimschy, L. H. de Figueiredo, W. Celes"
|
||||
|
||||
|
||||
@@ -163,7 +163,8 @@ extern const char lua_ident[];
|
||||
LUA_API lua_State *(lua_newstate) (lua_Alloc f, void *ud);
|
||||
LUA_API void (lua_close) (lua_State *L);
|
||||
LUA_API lua_State *(lua_newthread) (lua_State *L);
|
||||
LUA_API int (lua_resetthread) (lua_State *L, lua_State *from);
|
||||
LUA_API int (lua_closethread) (lua_State *L, lua_State *from);
|
||||
LUA_API int (lua_resetthread) (lua_State *L); /* Deprecated! */
|
||||
|
||||
LUA_API lua_CFunction (lua_atpanic) (lua_State *L, lua_CFunction panicf);
|
||||
|
||||
@@ -500,7 +501,7 @@ struct lua_Debug {
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
* Copyright (C) 1994-2022 Lua.org, PUC-Rio.
|
||||
* Copyright (C) 1994-2023 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
|
||||
|
||||
723
3rd/lua/luac.c
Normal file
723
3rd/lua/luac.c
Normal file
@@ -0,0 +1,723 @@
|
||||
/*
|
||||
** $Id: luac.c $
|
||||
** Lua compiler (saves bytecodes to files; also lists bytecodes)
|
||||
** See Copyright Notice in lua.h
|
||||
*/
|
||||
|
||||
#define luac_c
|
||||
#define LUA_CORE
|
||||
|
||||
#include "lprefix.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "lua.h"
|
||||
#include "lauxlib.h"
|
||||
|
||||
#include "ldebug.h"
|
||||
#include "lobject.h"
|
||||
#include "lopcodes.h"
|
||||
#include "lopnames.h"
|
||||
#include "lstate.h"
|
||||
#include "lundump.h"
|
||||
|
||||
static void PrintFunction(const Proto* f, int full);
|
||||
#define luaU_print PrintFunction
|
||||
|
||||
#define PROGNAME "luac" /* default program name */
|
||||
#define OUTPUT PROGNAME ".out" /* default output file */
|
||||
|
||||
static int listing=0; /* list bytecodes? */
|
||||
static int dumping=1; /* dump bytecodes? */
|
||||
static int stripping=0; /* strip debug information? */
|
||||
static char Output[]={ OUTPUT }; /* default output file name */
|
||||
static const char* output=Output; /* actual output file name */
|
||||
static const char* progname=PROGNAME; /* actual program name */
|
||||
static TString **tmname;
|
||||
|
||||
static void fatal(const char* message)
|
||||
{
|
||||
fprintf(stderr,"%s: %s\n",progname,message);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
static void cannot(const char* what)
|
||||
{
|
||||
fprintf(stderr,"%s: cannot %s %s: %s\n",progname,what,output,strerror(errno));
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
static void usage(const char* message)
|
||||
{
|
||||
if (*message=='-')
|
||||
fprintf(stderr,"%s: unrecognized option '%s'\n",progname,message);
|
||||
else
|
||||
fprintf(stderr,"%s: %s\n",progname,message);
|
||||
fprintf(stderr,
|
||||
"usage: %s [options] [filenames]\n"
|
||||
"Available options are:\n"
|
||||
" -l list (use -l -l for full listing)\n"
|
||||
" -o name output to file 'name' (default is \"%s\")\n"
|
||||
" -p parse only\n"
|
||||
" -s strip debug information\n"
|
||||
" -v show version information\n"
|
||||
" -- stop handling options\n"
|
||||
" - stop handling options and process stdin\n"
|
||||
,progname,Output);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
#define IS(s) (strcmp(argv[i],s)==0)
|
||||
|
||||
static int doargs(int argc, char* argv[])
|
||||
{
|
||||
int i;
|
||||
int version=0;
|
||||
if (argv[0]!=NULL && *argv[0]!=0) progname=argv[0];
|
||||
for (i=1; i<argc; i++)
|
||||
{
|
||||
if (*argv[i]!='-') /* end of options; keep it */
|
||||
break;
|
||||
else if (IS("--")) /* end of options; skip it */
|
||||
{
|
||||
++i;
|
||||
if (version) ++version;
|
||||
break;
|
||||
}
|
||||
else if (IS("-")) /* end of options; use stdin */
|
||||
break;
|
||||
else if (IS("-l")) /* list */
|
||||
++listing;
|
||||
else if (IS("-o")) /* output file */
|
||||
{
|
||||
output=argv[++i];
|
||||
if (output==NULL || *output==0 || (*output=='-' && output[1]!=0))
|
||||
usage("'-o' needs argument");
|
||||
if (IS("-")) output=NULL;
|
||||
}
|
||||
else if (IS("-p")) /* parse only */
|
||||
dumping=0;
|
||||
else if (IS("-s")) /* strip debug information */
|
||||
stripping=1;
|
||||
else if (IS("-v")) /* show version */
|
||||
++version;
|
||||
else /* unknown option */
|
||||
usage(argv[i]);
|
||||
}
|
||||
if (i==argc && (listing || !dumping))
|
||||
{
|
||||
dumping=0;
|
||||
argv[--i]=Output;
|
||||
}
|
||||
if (version)
|
||||
{
|
||||
printf("%s\n",LUA_COPYRIGHT);
|
||||
if (version==argc-1) exit(EXIT_SUCCESS);
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
||||
#define FUNCTION "(function()end)();\n"
|
||||
|
||||
static const char* reader(lua_State* L, void* ud, size_t* size)
|
||||
{
|
||||
UNUSED(L);
|
||||
if ((*(int*)ud)--)
|
||||
{
|
||||
*size=sizeof(FUNCTION)-1;
|
||||
return FUNCTION;
|
||||
}
|
||||
else
|
||||
{
|
||||
*size=0;
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#define toproto(L,i) getproto(s2v(L->top.p+(i)))
|
||||
|
||||
static const Proto* combine(lua_State* L, int n)
|
||||
{
|
||||
if (n==1)
|
||||
return toproto(L,-1);
|
||||
else
|
||||
{
|
||||
Proto* f;
|
||||
int i=n;
|
||||
if (lua_load(L,reader,&i,"=(" PROGNAME ")",NULL)!=LUA_OK) fatal(lua_tostring(L,-1));
|
||||
f=toproto(L,-1);
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
f->p[i]=toproto(L,i-n-1);
|
||||
if (f->p[i]->sizeupvalues>0) f->p[i]->upvalues[0].instack=0;
|
||||
}
|
||||
return f;
|
||||
}
|
||||
}
|
||||
|
||||
static int writer(lua_State* L, const void* p, size_t size, void* u)
|
||||
{
|
||||
UNUSED(L);
|
||||
return (fwrite(p,size,1,(FILE*)u)!=1) && (size!=0);
|
||||
}
|
||||
|
||||
static int pmain(lua_State* L)
|
||||
{
|
||||
int argc=(int)lua_tointeger(L,1);
|
||||
char** argv=(char**)lua_touserdata(L,2);
|
||||
const Proto* f;
|
||||
int i;
|
||||
tmname=G(L)->tmname;
|
||||
if (!lua_checkstack(L,argc)) fatal("too many input files");
|
||||
for (i=0; i<argc; i++)
|
||||
{
|
||||
const char* filename=IS("-") ? NULL : argv[i];
|
||||
if (luaL_loadfile(L,filename)!=LUA_OK) fatal(lua_tostring(L,-1));
|
||||
}
|
||||
f=combine(L,argc);
|
||||
if (listing) luaU_print(f,listing>1);
|
||||
if (dumping)
|
||||
{
|
||||
FILE* D= (output==NULL) ? stdout : fopen(output,"wb");
|
||||
if (D==NULL) cannot("open");
|
||||
lua_lock(L);
|
||||
luaU_dump(L,f,writer,D,stripping);
|
||||
lua_unlock(L);
|
||||
if (ferror(D)) cannot("write");
|
||||
if (fclose(D)) cannot("close");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
lua_State* L;
|
||||
int i=doargs(argc,argv);
|
||||
argc-=i; argv+=i;
|
||||
if (argc<=0) usage("no input files given");
|
||||
L=luaL_newstate();
|
||||
if (L==NULL) fatal("cannot create state: not enough memory");
|
||||
lua_pushcfunction(L,&pmain);
|
||||
lua_pushinteger(L,argc);
|
||||
lua_pushlightuserdata(L,argv);
|
||||
if (lua_pcall(L,2,0,0)!=LUA_OK) fatal(lua_tostring(L,-1));
|
||||
lua_close(L);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
** print bytecodes
|
||||
*/
|
||||
|
||||
#define UPVALNAME(x) ((f->upvalues[x].name) ? getstr(f->upvalues[x].name) : "-")
|
||||
#define VOID(p) ((const void*)(p))
|
||||
#define eventname(i) (getstr(tmname[i]))
|
||||
|
||||
static void PrintString(const TString* ts)
|
||||
{
|
||||
const char* s=getstr(ts);
|
||||
size_t i,n=tsslen(ts);
|
||||
printf("\"");
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
int c=(int)(unsigned char)s[i];
|
||||
switch (c)
|
||||
{
|
||||
case '"':
|
||||
printf("\\\"");
|
||||
break;
|
||||
case '\\':
|
||||
printf("\\\\");
|
||||
break;
|
||||
case '\a':
|
||||
printf("\\a");
|
||||
break;
|
||||
case '\b':
|
||||
printf("\\b");
|
||||
break;
|
||||
case '\f':
|
||||
printf("\\f");
|
||||
break;
|
||||
case '\n':
|
||||
printf("\\n");
|
||||
break;
|
||||
case '\r':
|
||||
printf("\\r");
|
||||
break;
|
||||
case '\t':
|
||||
printf("\\t");
|
||||
break;
|
||||
case '\v':
|
||||
printf("\\v");
|
||||
break;
|
||||
default:
|
||||
if (isprint(c)) printf("%c",c); else printf("\\%03d",c);
|
||||
break;
|
||||
}
|
||||
}
|
||||
printf("\"");
|
||||
}
|
||||
|
||||
static void PrintType(const Proto* f, int i)
|
||||
{
|
||||
const TValue* o=&f->k[i];
|
||||
switch (ttypetag(o))
|
||||
{
|
||||
case LUA_VNIL:
|
||||
printf("N");
|
||||
break;
|
||||
case LUA_VFALSE:
|
||||
case LUA_VTRUE:
|
||||
printf("B");
|
||||
break;
|
||||
case LUA_VNUMFLT:
|
||||
printf("F");
|
||||
break;
|
||||
case LUA_VNUMINT:
|
||||
printf("I");
|
||||
break;
|
||||
case LUA_VSHRSTR:
|
||||
case LUA_VLNGSTR:
|
||||
printf("S");
|
||||
break;
|
||||
default: /* cannot happen */
|
||||
printf("?%d",ttypetag(o));
|
||||
break;
|
||||
}
|
||||
printf("\t");
|
||||
}
|
||||
|
||||
static void PrintConstant(const Proto* f, int i)
|
||||
{
|
||||
const TValue* o=&f->k[i];
|
||||
switch (ttypetag(o))
|
||||
{
|
||||
case LUA_VNIL:
|
||||
printf("nil");
|
||||
break;
|
||||
case LUA_VFALSE:
|
||||
printf("false");
|
||||
break;
|
||||
case LUA_VTRUE:
|
||||
printf("true");
|
||||
break;
|
||||
case LUA_VNUMFLT:
|
||||
{
|
||||
char buff[100];
|
||||
sprintf(buff,LUA_NUMBER_FMT,fltvalue(o));
|
||||
printf("%s",buff);
|
||||
if (buff[strspn(buff,"-0123456789")]=='\0') printf(".0");
|
||||
break;
|
||||
}
|
||||
case LUA_VNUMINT:
|
||||
printf(LUA_INTEGER_FMT,ivalue(o));
|
||||
break;
|
||||
case LUA_VSHRSTR:
|
||||
case LUA_VLNGSTR:
|
||||
PrintString(tsvalue(o));
|
||||
break;
|
||||
default: /* cannot happen */
|
||||
printf("?%d",ttypetag(o));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#define COMMENT "\t; "
|
||||
#define EXTRAARG GETARG_Ax(code[pc+1])
|
||||
#define EXTRAARGC (EXTRAARG*(MAXARG_C+1))
|
||||
#define ISK (isk ? "k" : "")
|
||||
|
||||
static void PrintCode(const Proto* f)
|
||||
{
|
||||
const Instruction* code=f->code;
|
||||
int pc,n=f->sizecode;
|
||||
for (pc=0; pc<n; pc++)
|
||||
{
|
||||
Instruction i=code[pc];
|
||||
OpCode o=GET_OPCODE(i);
|
||||
int a=GETARG_A(i);
|
||||
int b=GETARG_B(i);
|
||||
int c=GETARG_C(i);
|
||||
int ax=GETARG_Ax(i);
|
||||
int bx=GETARG_Bx(i);
|
||||
int sb=GETARG_sB(i);
|
||||
int sc=GETARG_sC(i);
|
||||
int sbx=GETARG_sBx(i);
|
||||
int isk=GETARG_k(i);
|
||||
int line=luaG_getfuncline(f,pc);
|
||||
printf("\t%d\t",pc+1);
|
||||
if (line>0) printf("[%d]\t",line); else printf("[-]\t");
|
||||
printf("%-9s\t",opnames[o]);
|
||||
switch (o)
|
||||
{
|
||||
case OP_MOVE:
|
||||
printf("%d %d",a,b);
|
||||
break;
|
||||
case OP_LOADI:
|
||||
printf("%d %d",a,sbx);
|
||||
break;
|
||||
case OP_LOADF:
|
||||
printf("%d %d",a,sbx);
|
||||
break;
|
||||
case OP_LOADK:
|
||||
printf("%d %d",a,bx);
|
||||
printf(COMMENT); PrintConstant(f,bx);
|
||||
break;
|
||||
case OP_LOADKX:
|
||||
printf("%d",a);
|
||||
printf(COMMENT); PrintConstant(f,EXTRAARG);
|
||||
break;
|
||||
case OP_LOADFALSE:
|
||||
printf("%d",a);
|
||||
break;
|
||||
case OP_LFALSESKIP:
|
||||
printf("%d",a);
|
||||
break;
|
||||
case OP_LOADTRUE:
|
||||
printf("%d",a);
|
||||
break;
|
||||
case OP_LOADNIL:
|
||||
printf("%d %d",a,b);
|
||||
printf(COMMENT "%d out",b+1);
|
||||
break;
|
||||
case OP_GETUPVAL:
|
||||
printf("%d %d",a,b);
|
||||
printf(COMMENT "%s",UPVALNAME(b));
|
||||
break;
|
||||
case OP_SETUPVAL:
|
||||
printf("%d %d",a,b);
|
||||
printf(COMMENT "%s",UPVALNAME(b));
|
||||
break;
|
||||
case OP_GETTABUP:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT "%s",UPVALNAME(b));
|
||||
printf(" "); PrintConstant(f,c);
|
||||
break;
|
||||
case OP_GETTABLE:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_GETI:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_GETFIELD:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT); PrintConstant(f,c);
|
||||
break;
|
||||
case OP_SETTABUP:
|
||||
printf("%d %d %d%s",a,b,c,ISK);
|
||||
printf(COMMENT "%s",UPVALNAME(a));
|
||||
printf(" "); PrintConstant(f,b);
|
||||
if (isk) { printf(" "); PrintConstant(f,c); }
|
||||
break;
|
||||
case OP_SETTABLE:
|
||||
printf("%d %d %d%s",a,b,c,ISK);
|
||||
if (isk) { printf(COMMENT); PrintConstant(f,c); }
|
||||
break;
|
||||
case OP_SETI:
|
||||
printf("%d %d %d%s",a,b,c,ISK);
|
||||
if (isk) { printf(COMMENT); PrintConstant(f,c); }
|
||||
break;
|
||||
case OP_SETFIELD:
|
||||
printf("%d %d %d%s",a,b,c,ISK);
|
||||
printf(COMMENT); PrintConstant(f,b);
|
||||
if (isk) { printf(" "); PrintConstant(f,c); }
|
||||
break;
|
||||
case OP_NEWTABLE:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT "%d",c+EXTRAARGC);
|
||||
break;
|
||||
case OP_SELF:
|
||||
printf("%d %d %d%s",a,b,c,ISK);
|
||||
if (isk) { printf(COMMENT); PrintConstant(f,c); }
|
||||
break;
|
||||
case OP_ADDI:
|
||||
printf("%d %d %d",a,b,sc);
|
||||
break;
|
||||
case OP_ADDK:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT); PrintConstant(f,c);
|
||||
break;
|
||||
case OP_SUBK:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT); PrintConstant(f,c);
|
||||
break;
|
||||
case OP_MULK:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT); PrintConstant(f,c);
|
||||
break;
|
||||
case OP_MODK:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT); PrintConstant(f,c);
|
||||
break;
|
||||
case OP_POWK:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT); PrintConstant(f,c);
|
||||
break;
|
||||
case OP_DIVK:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT); PrintConstant(f,c);
|
||||
break;
|
||||
case OP_IDIVK:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT); PrintConstant(f,c);
|
||||
break;
|
||||
case OP_BANDK:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT); PrintConstant(f,c);
|
||||
break;
|
||||
case OP_BORK:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT); PrintConstant(f,c);
|
||||
break;
|
||||
case OP_BXORK:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT); PrintConstant(f,c);
|
||||
break;
|
||||
case OP_SHRI:
|
||||
printf("%d %d %d",a,b,sc);
|
||||
break;
|
||||
case OP_SHLI:
|
||||
printf("%d %d %d",a,b,sc);
|
||||
break;
|
||||
case OP_ADD:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_SUB:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_MUL:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_MOD:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_POW:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_DIV:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_IDIV:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_BAND:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_BOR:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_BXOR:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_SHL:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_SHR:
|
||||
printf("%d %d %d",a,b,c);
|
||||
break;
|
||||
case OP_MMBIN:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT "%s",eventname(c));
|
||||
break;
|
||||
case OP_MMBINI:
|
||||
printf("%d %d %d %d",a,sb,c,isk);
|
||||
printf(COMMENT "%s",eventname(c));
|
||||
if (isk) printf(" flip");
|
||||
break;
|
||||
case OP_MMBINK:
|
||||
printf("%d %d %d %d",a,b,c,isk);
|
||||
printf(COMMENT "%s ",eventname(c)); PrintConstant(f,b);
|
||||
if (isk) printf(" flip");
|
||||
break;
|
||||
case OP_UNM:
|
||||
printf("%d %d",a,b);
|
||||
break;
|
||||
case OP_BNOT:
|
||||
printf("%d %d",a,b);
|
||||
break;
|
||||
case OP_NOT:
|
||||
printf("%d %d",a,b);
|
||||
break;
|
||||
case OP_LEN:
|
||||
printf("%d %d",a,b);
|
||||
break;
|
||||
case OP_CONCAT:
|
||||
printf("%d %d",a,b);
|
||||
break;
|
||||
case OP_CLOSE:
|
||||
printf("%d",a);
|
||||
break;
|
||||
case OP_TBC:
|
||||
printf("%d",a);
|
||||
break;
|
||||
case OP_JMP:
|
||||
printf("%d",GETARG_sJ(i));
|
||||
printf(COMMENT "to %d",GETARG_sJ(i)+pc+2);
|
||||
break;
|
||||
case OP_EQ:
|
||||
printf("%d %d %d",a,b,isk);
|
||||
break;
|
||||
case OP_LT:
|
||||
printf("%d %d %d",a,b,isk);
|
||||
break;
|
||||
case OP_LE:
|
||||
printf("%d %d %d",a,b,isk);
|
||||
break;
|
||||
case OP_EQK:
|
||||
printf("%d %d %d",a,b,isk);
|
||||
printf(COMMENT); PrintConstant(f,b);
|
||||
break;
|
||||
case OP_EQI:
|
||||
printf("%d %d %d",a,sb,isk);
|
||||
break;
|
||||
case OP_LTI:
|
||||
printf("%d %d %d",a,sb,isk);
|
||||
break;
|
||||
case OP_LEI:
|
||||
printf("%d %d %d",a,sb,isk);
|
||||
break;
|
||||
case OP_GTI:
|
||||
printf("%d %d %d",a,sb,isk);
|
||||
break;
|
||||
case OP_GEI:
|
||||
printf("%d %d %d",a,sb,isk);
|
||||
break;
|
||||
case OP_TEST:
|
||||
printf("%d %d",a,isk);
|
||||
break;
|
||||
case OP_TESTSET:
|
||||
printf("%d %d %d",a,b,isk);
|
||||
break;
|
||||
case OP_CALL:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT);
|
||||
if (b==0) printf("all in "); else printf("%d in ",b-1);
|
||||
if (c==0) printf("all out"); else printf("%d out",c-1);
|
||||
break;
|
||||
case OP_TAILCALL:
|
||||
printf("%d %d %d%s",a,b,c,ISK);
|
||||
printf(COMMENT "%d in",b-1);
|
||||
break;
|
||||
case OP_RETURN:
|
||||
printf("%d %d %d%s",a,b,c,ISK);
|
||||
printf(COMMENT);
|
||||
if (b==0) printf("all out"); else printf("%d out",b-1);
|
||||
break;
|
||||
case OP_RETURN0:
|
||||
break;
|
||||
case OP_RETURN1:
|
||||
printf("%d",a);
|
||||
break;
|
||||
case OP_FORLOOP:
|
||||
printf("%d %d",a,bx);
|
||||
printf(COMMENT "to %d",pc-bx+2);
|
||||
break;
|
||||
case OP_FORPREP:
|
||||
printf("%d %d",a,bx);
|
||||
printf(COMMENT "exit to %d",pc+bx+3);
|
||||
break;
|
||||
case OP_TFORPREP:
|
||||
printf("%d %d",a,bx);
|
||||
printf(COMMENT "to %d",pc+bx+2);
|
||||
break;
|
||||
case OP_TFORCALL:
|
||||
printf("%d %d",a,c);
|
||||
break;
|
||||
case OP_TFORLOOP:
|
||||
printf("%d %d",a,bx);
|
||||
printf(COMMENT "to %d",pc-bx+2);
|
||||
break;
|
||||
case OP_SETLIST:
|
||||
printf("%d %d %d",a,b,c);
|
||||
if (isk) printf(COMMENT "%d",c+EXTRAARGC);
|
||||
break;
|
||||
case OP_CLOSURE:
|
||||
printf("%d %d",a,bx);
|
||||
printf(COMMENT "%p",VOID(f->p[bx]));
|
||||
break;
|
||||
case OP_VARARG:
|
||||
printf("%d %d",a,c);
|
||||
printf(COMMENT);
|
||||
if (c==0) printf("all out"); else printf("%d out",c-1);
|
||||
break;
|
||||
case OP_VARARGPREP:
|
||||
printf("%d",a);
|
||||
break;
|
||||
case OP_EXTRAARG:
|
||||
printf("%d",ax);
|
||||
break;
|
||||
#if 0
|
||||
default:
|
||||
printf("%d %d %d",a,b,c);
|
||||
printf(COMMENT "not handled");
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
printf("\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#define SS(x) ((x==1)?"":"s")
|
||||
#define S(x) (int)(x),SS(x)
|
||||
|
||||
static void PrintHeader(const Proto* f)
|
||||
{
|
||||
const char* s=f->source ? getstr(f->source) : "=?";
|
||||
if (*s=='@' || *s=='=')
|
||||
s++;
|
||||
else if (*s==LUA_SIGNATURE[0])
|
||||
s="(bstring)";
|
||||
else
|
||||
s="(string)";
|
||||
printf("\n%s <%s:%d,%d> (%d instruction%s at %p)\n",
|
||||
(f->linedefined==0)?"main":"function",s,
|
||||
f->linedefined,f->lastlinedefined,
|
||||
S(f->sizecode),VOID(f));
|
||||
printf("%d%s param%s, %d slot%s, %d upvalue%s, ",
|
||||
(int)(f->numparams),f->is_vararg?"+":"",SS(f->numparams),
|
||||
S(f->maxstacksize),S(f->sizeupvalues));
|
||||
printf("%d local%s, %d constant%s, %d function%s\n",
|
||||
S(f->sizelocvars),S(f->sizek),S(f->sizep));
|
||||
}
|
||||
|
||||
static void PrintDebug(const Proto* f)
|
||||
{
|
||||
int i,n;
|
||||
n=f->sizek;
|
||||
printf("constants (%d) for %p:\n",n,VOID(f));
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
printf("\t%d\t",i);
|
||||
PrintType(f,i);
|
||||
PrintConstant(f,i);
|
||||
printf("\n");
|
||||
}
|
||||
n=f->sizelocvars;
|
||||
printf("locals (%d) for %p:\n",n,VOID(f));
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
printf("\t%d\t%s\t%d\t%d\n",
|
||||
i,getstr(f->locvars[i].varname),f->locvars[i].startpc+1,f->locvars[i].endpc+1);
|
||||
}
|
||||
n=f->sizeupvalues;
|
||||
printf("upvalues (%d) for %p:\n",n,VOID(f));
|
||||
for (i=0; i<n; i++)
|
||||
{
|
||||
printf("\t%d\t%s\t%d\t%d\n",
|
||||
i,UPVALNAME(i),f->upvalues[i].instack,f->upvalues[i].idx);
|
||||
}
|
||||
}
|
||||
|
||||
static void PrintFunction(const Proto* f, int full)
|
||||
{
|
||||
int i,n=f->sizep;
|
||||
PrintHeader(f);
|
||||
PrintCode(f);
|
||||
if (full) PrintDebug(f);
|
||||
for (i=0; i<n; i++) PrintFunction(f->p[i],full);
|
||||
}
|
||||
@@ -70,6 +70,12 @@
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(LUA_USE_IOS)
|
||||
#define LUA_USE_POSIX
|
||||
#define LUA_USE_DLOPEN
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
@@ LUAI_IS32INT is true iff 'int' has (at least) 32 bits.
|
||||
*/
|
||||
|
||||
@@ -248,6 +248,8 @@ static void loadDebug (LoadState *S, Proto *f) {
|
||||
f->locvars[i].endpc = loadInt(S);
|
||||
}
|
||||
n = loadInt(S);
|
||||
if (n != 0) /* does it have debug information? */
|
||||
n = f->sizeupvalues; /* must be this many */
|
||||
for (i = 0; i < n; i++)
|
||||
f->upvalues[i].name = loadStringN(S, f);
|
||||
}
|
||||
|
||||
@@ -1412,6 +1412,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
|
||||
vmbreak;
|
||||
}
|
||||
vmcase(OP_MODK) {
|
||||
savestate(L, ci); /* in case of division by 0 */
|
||||
op_arithK(L, luaV_mod, luaV_modf);
|
||||
vmbreak;
|
||||
}
|
||||
@@ -1424,6 +1425,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
|
||||
vmbreak;
|
||||
}
|
||||
vmcase(OP_IDIVK) {
|
||||
savestate(L, ci); /* in case of division by 0 */
|
||||
op_arithK(L, luaV_idiv, luai_numidiv);
|
||||
vmbreak;
|
||||
}
|
||||
@@ -1472,6 +1474,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
|
||||
vmbreak;
|
||||
}
|
||||
vmcase(OP_MOD) {
|
||||
savestate(L, ci); /* in case of division by 0 */
|
||||
op_arith(L, luaV_mod, luaV_modf);
|
||||
vmbreak;
|
||||
}
|
||||
@@ -1484,6 +1487,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
|
||||
vmbreak;
|
||||
}
|
||||
vmcase(OP_IDIV) { /* floor division */
|
||||
savestate(L, ci); /* in case of division by 0 */
|
||||
op_arith(L, luaV_idiv, luai_numidiv);
|
||||
vmbreak;
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ SYSCFLAGS=
|
||||
SYSLDFLAGS=
|
||||
SYSLIBS=
|
||||
|
||||
MYCFLAGS=-I../../skynet-src -g
|
||||
MYCFLAGS= -I../../skynet-src -g
|
||||
MYLDFLAGS=
|
||||
MYLIBS=
|
||||
MYOBJS=
|
||||
@@ -30,7 +30,7 @@ CMCFLAGS=
|
||||
|
||||
# == END OF USER SETTINGS -- NO NEED TO CHANGE ANYTHING BELOW THIS LINE =======
|
||||
|
||||
PLATS= guess aix bsd c89 freebsd generic linux linux-readline macosx mingw posix solaris
|
||||
PLATS= guess aix bsd c89 freebsd generic ios linux linux-readline macosx mingw posix solaris
|
||||
|
||||
LUA_A= liblua.a
|
||||
CORE_O= lapi.o lcode.o lctype.o ldebug.o ldo.o ldump.o lfunc.o lgc.o llex.o lmem.o lobject.o lopcodes.o lparser.o lstate.o lstring.o ltable.o ltm.o lundump.o lvm.o lzio.o
|
||||
@@ -44,7 +44,7 @@ LUAC_T= luac
|
||||
LUAC_O= luac.o
|
||||
|
||||
ALL_O= $(BASE_O) $(LUA_O) $(LUAC_O)
|
||||
ALL_T= $(LUA_A) $(LUA_T)
|
||||
ALL_T= $(LUA_A) $(LUA_T) $(LUAC_T)
|
||||
ALL_A= $(LUA_A)
|
||||
|
||||
# Targets start here.
|
||||
@@ -117,6 +117,9 @@ FreeBSD NetBSD OpenBSD freebsd:
|
||||
|
||||
generic: $(ALL)
|
||||
|
||||
ios:
|
||||
$(MAKE) $(ALL) SYSCFLAGS="-DLUA_USE_IOS"
|
||||
|
||||
Linux linux: linux-noreadline
|
||||
|
||||
linux-noreadline:
|
||||
|
||||
@@ -233,7 +233,7 @@ static int luaB_auxwrap (lua_State *L) {
|
||||
if (r < 0) {
|
||||
int stat = lua_status(co);
|
||||
if (stat != LUA_OK && stat != LUA_YIELD)
|
||||
lua_resetthread(co, L); /* close variables in case of errors */
|
||||
lua_closethread(co, L); /* close variables in case of errors */
|
||||
if (lua_type(L, -1) == LUA_TSTRING) { /* error object is a string? */
|
||||
luaL_where(L, 1); /* add extra info, if available */
|
||||
lua_insert(L, -2);
|
||||
|
||||
Reference in New Issue
Block a user