Better deduction for not

pull/213/head
XmiliaH 3 years ago
parent f80e4d5442
commit 435480f4db

@ -1168,17 +1168,14 @@ static void codenot (FuncState *fs, expdesc *e) {
switch (e->k) { switch (e->k) {
case VNIL: case VFALSE: { case VNIL: case VFALSE: {
e->k = VTRUE; /* true == not nil == not false */ e->k = VTRUE; /* true == not nil == not false */
e->ravi_type_map = RAVI_TM_TRUE;
break; break;
} }
case VK: case VKFLT: case VKINT: case VTRUE: { case VK: case VKFLT: case VKINT: case VTRUE: {
e->k = VFALSE; /* false == not "x" == not 0.5 == not 1 == not true */ e->k = VFALSE; /* false == not "x" == not 0.5 == not 1 == not true */
e->ravi_type_map = RAVI_TM_FALSE;
break; break;
} }
case VJMP: { case VJMP: {
negatecondition(fs, e); negatecondition(fs, e);
e->ravi_type_map = RAVI_TM_BOOLEAN;
break; break;
} }
case VRELOCABLE: case VRELOCABLE:
@ -1187,11 +1184,12 @@ static void codenot (FuncState *fs, expdesc *e) {
freeexp(fs, e); freeexp(fs, e);
e->u.info = luaK_codeABC(fs, OP_NOT, 0, e->u.info, 0); e->u.info = luaK_codeABC(fs, OP_NOT, 0, e->u.info, 0);
e->k = VRELOCABLE; e->k = VRELOCABLE;
e->ravi_type_map = RAVI_TM_BOOLEAN;
break; break;
} }
default: lua_assert(0); /* cannot happen */ default: lua_assert(0); /* cannot happen */
} }
e->ravi_type_map = ((e->ravi_type_map & RAVI_TM_TRUISH) ? RAVI_TM_FALSE : 0) |
((e->ravi_type_map & RAVI_TM_FALSISH) ? RAVI_TM_TRUE : 0);
/* interchange true and false lists */ /* interchange true and false lists */
{ int temp = e->f; e->f = e->t; e->t = temp; } { int temp = e->f; e->f = e->t; e->t = temp; }
removevalues(fs, e->f); /* values are useless when negated */ removevalues(fs, e->f); /* values are useless when negated */
@ -1358,7 +1356,7 @@ static void codebinexpval (FuncState *fs, OpCode op,
if ((e1->ravi_type_map & (~(RAVI_TM_FLOAT | RAVI_TM_INTEGER))) == 0 && \ if ((e1->ravi_type_map & (~(RAVI_TM_FLOAT | RAVI_TM_INTEGER))) == 0 && \
(e1->ravi_type_map & (~(RAVI_TM_FLOAT | RAVI_TM_INTEGER))) == 0) { \ (e1->ravi_type_map & (~(RAVI_TM_FLOAT | RAVI_TM_INTEGER))) == 0) { \
if (e1->ravi_type_map & e2->ravi_type_map & RAVI_TM_INTEGER) { \ if (e1->ravi_type_map & e2->ravi_type_map & RAVI_TM_INTEGER) { \
e1->ravi_type_map = RAVI_TM_FLOAT | RAVI_TM_INTEGER; \ e1->ravi_type_map = RAVI_TM_FLOAT | ii; \
} \ } \
else { \ else { \
e1->ravi_type_map = RAVI_TM_FLOAT; \ e1->ravi_type_map = RAVI_TM_FLOAT; \

Loading…
Cancel
Save