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) {
case VNIL: case VFALSE: {
e->k = VTRUE; /* true == not nil == not false */
e->ravi_type_map = RAVI_TM_TRUE;
break;
}
case VK: case VKFLT: case VKINT: case VTRUE: {
e->k = VFALSE; /* false == not "x" == not 0.5 == not 1 == not true */
e->ravi_type_map = RAVI_TM_FALSE;
break;
}
case VJMP: {
negatecondition(fs, e);
e->ravi_type_map = RAVI_TM_BOOLEAN;
break;
}
case VRELOCABLE:
@ -1187,11 +1184,12 @@ static void codenot (FuncState *fs, expdesc *e) {
freeexp(fs, e);
e->u.info = luaK_codeABC(fs, OP_NOT, 0, e->u.info, 0);
e->k = VRELOCABLE;
e->ravi_type_map = RAVI_TM_BOOLEAN;
break;
}
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 */
{ int temp = e->f; e->f = e->t; e->t = temp; }
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 && \
(e1->ravi_type_map & (~(RAVI_TM_FLOAT | RAVI_TM_INTEGER))) == 0) { \
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 { \
e1->ravi_type_map = RAVI_TM_FLOAT; \

Loading…
Cancel
Save