mirror of
https://github.com/lua/lua
synced 2024-11-25 06:09:36 +03:00
More orderliness in casts of enumerations
This commit is contained in:
parent
94689ac3ad
commit
7ca8105a2e
55
lcode.c
55
lcode.c
@ -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"
|
** Emit code for unary expressions that "produce values"
|
||||||
** (everything but 'not').
|
** (everything but 'not').
|
||||||
@ -1391,14 +1420,13 @@ static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2,
|
|||||||
*/
|
*/
|
||||||
static void codebinexpval (FuncState *fs, BinOpr opr,
|
static void codebinexpval (FuncState *fs, BinOpr opr,
|
||||||
expdesc *e1, expdesc *e2, int line) {
|
expdesc *e1, expdesc *e2, int line) {
|
||||||
OpCode op = cast(OpCode, opr + OP_ADD);
|
OpCode op = binopr2op(opr, OPR_ADD, OP_ADD);
|
||||||
int v2 = luaK_exp2anyreg(fs, e2); /* make sure 'e2' is in a register */
|
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 */
|
/* 'e1' must be already in a register or it is a constant */
|
||||||
lua_assert((VNIL <= e1->k && e1->k <= VKSTR) ||
|
lua_assert((VNIL <= e1->k && e1->k <= VKSTR) ||
|
||||||
e1->k == VNONRELOC || e1->k == VRELOC);
|
e1->k == VNONRELOC || e1->k == VRELOC);
|
||||||
lua_assert(OP_ADD <= op && op <= OP_SHR);
|
lua_assert(OP_ADD <= op && op <= OP_SHR);
|
||||||
finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN,
|
finishbinexpval(fs, e1, e2, op, v2, 0, line, OP_MMBIN, binopr2TM(opr));
|
||||||
cast(TMS, opr + TM_ADD));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1419,9 +1447,9 @@ static void codebini (FuncState *fs, OpCode op,
|
|||||||
*/
|
*/
|
||||||
static void codebinK (FuncState *fs, BinOpr opr,
|
static void codebinK (FuncState *fs, BinOpr opr,
|
||||||
expdesc *e1, expdesc *e2, int flip, int line) {
|
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 */
|
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);
|
finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1527,18 +1555,18 @@ static void codeorder (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) {
|
|||||||
/* use immediate operand */
|
/* use immediate operand */
|
||||||
r1 = luaK_exp2anyreg(fs, e1);
|
r1 = luaK_exp2anyreg(fs, e1);
|
||||||
r2 = im;
|
r2 = im;
|
||||||
op = cast(OpCode, (opr - OPR_LT) + OP_LTI);
|
op = binopr2op(opr, OPR_LT, OP_LTI);
|
||||||
}
|
}
|
||||||
else if (isSCnumber(e1, &im, &isfloat)) {
|
else if (isSCnumber(e1, &im, &isfloat)) {
|
||||||
/* transform (A < B) to (B > A) and (A <= B) to (B >= A) */
|
/* transform (A < B) to (B > A) and (A <= B) to (B >= A) */
|
||||||
r1 = luaK_exp2anyreg(fs, e2);
|
r1 = luaK_exp2anyreg(fs, e2);
|
||||||
r2 = im;
|
r2 = im;
|
||||||
op = cast(OpCode, (opr - OPR_LT) + OP_GTI);
|
op = binopr2op(opr, OPR_LT, OP_GTI);
|
||||||
}
|
}
|
||||||
else { /* regular case, compare two registers */
|
else { /* regular case, compare two registers */
|
||||||
r1 = luaK_exp2anyreg(fs, e1);
|
r1 = luaK_exp2anyreg(fs, e1);
|
||||||
r2 = luaK_exp2anyreg(fs, e2);
|
r2 = luaK_exp2anyreg(fs, e2);
|
||||||
op = cast(OpCode, (opr - OPR_EQ) + OP_EQ);
|
op = binopr2op(opr, OPR_LT, OP_LT);
|
||||||
}
|
}
|
||||||
freeexps(fs, e1, e2);
|
freeexps(fs, e1, e2);
|
||||||
e1->u.info = condjump(fs, op, r1, r2, isfloat, 1);
|
e1->u.info = condjump(fs, op, r1, r2, isfloat, 1);
|
||||||
@ -1590,7 +1618,7 @@ void luaK_prefix (FuncState *fs, UnOpr opr, expdesc *e, int line) {
|
|||||||
break;
|
break;
|
||||||
/* else */ /* FALLTHROUGH */
|
/* else */ /* FALLTHROUGH */
|
||||||
case OPR_LEN:
|
case OPR_LEN:
|
||||||
codeunexpval(fs, cast(OpCode, opr + OP_UNM), e, line);
|
codeunexpval(fs, unopr2op(opr), e, line);
|
||||||
break;
|
break;
|
||||||
case OPR_NOT: codenot(fs, e); break;
|
case OPR_NOT: codenot(fs, e); break;
|
||||||
default: lua_assert(0);
|
default: lua_assert(0);
|
||||||
@ -1734,14 +1762,13 @@ void luaK_posfix (FuncState *fs, BinOpr opr,
|
|||||||
codeeq(fs, opr, e1, e2);
|
codeeq(fs, opr, e1, e2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OPR_LT: case OPR_LE: {
|
|
||||||
codeorder(fs, opr, e1, e2);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case OPR_GT: case OPR_GE: {
|
case OPR_GT: case OPR_GE: {
|
||||||
/* '(a > b)' <=> '(b < a)'; '(a >= b)' <=> '(b <= a)' */
|
/* '(a > b)' <=> '(b < a)'; '(a >= b)' <=> '(b <= a)' */
|
||||||
swapexps(e1, e2);
|
swapexps(e1, e2);
|
||||||
codeorder(fs, (opr - OPR_NE) + OPR_EQ, e1, e2);
|
opr = cast(BinOpr, (opr - OPR_GT) + OPR_LT);
|
||||||
|
} /* FALLTHROUGH */
|
||||||
|
case OPR_LT: case OPR_LE: {
|
||||||
|
codeorder(fs, opr, e1, e2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: lua_assert(0);
|
default: lua_assert(0);
|
||||||
|
29
ldebug.c
29
ldebug.c
@ -656,18 +656,19 @@ static const char *funcnamefromcall (lua_State *L, CallInfo *ci,
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Check whether pointer 'o' points to some value in the stack
|
** Check whether pointer 'o' points to some value in the stack frame of
|
||||||
** frame of the current function. Because 'o' may not point to a
|
** the current function and, if so, returns its index. Because 'o' may
|
||||||
** value in this stack, we cannot compare it with the region
|
** not point to a value in this stack, we cannot compare it with the
|
||||||
** boundaries (undefined behaviour in ISO C).
|
** region boundaries (undefined behaviour in ISO C).
|
||||||
*/
|
*/
|
||||||
static int isinstack (CallInfo *ci, const TValue *o) {
|
static int instack (CallInfo *ci, const TValue *o) {
|
||||||
StkId pos;
|
int pos;
|
||||||
for (pos = ci->func.p + 1; pos < ci->top.p; pos++) {
|
StkId base = ci->func.p + 1;
|
||||||
if (o == s2v(pos))
|
for (pos = 0; base + pos < ci->top.p; pos++) {
|
||||||
return 1;
|
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;
|
const char *kind = NULL;
|
||||||
if (isLua(ci)) {
|
if (isLua(ci)) {
|
||||||
kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */
|
kind = getupvalname(ci, o, &name); /* check whether 'o' is an upvalue */
|
||||||
if (!kind && isinstack(ci, o)) /* no? try a register */
|
if (!kind) { /* not an upvalue? */
|
||||||
kind = getobjname(ci_func(ci)->p, currentpc(ci),
|
int reg = instack(ci, o); /* try a register */
|
||||||
cast_int(cast(StkId, o) - (ci->func.p + 1)), &name);
|
if (reg >= 0) /* is 'o' a register? */
|
||||||
|
kind = getobjname(ci_func(ci)->p, currentpc(ci), reg, &name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return formatvarinfo(L, kind, name);
|
return formatvarinfo(L, kind, name);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user