From 435480f4dbc62ec10830998cc2f710dce14cbcde Mon Sep 17 00:00:00 2001 From: XmiliaH Date: Fri, 19 Feb 2021 18:54:42 +0100 Subject: [PATCH] Better deduction for not --- src/lcode.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/lcode.c b/src/lcode.c index 8d21452..63bf720 100644 --- a/src/lcode.c +++ b/src/lcode.c @@ -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; \