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; \