Filter refactoring: Expanded the short instructions with common code.

This will make the further changes more straightforward.
This commit is contained in:
Maria Matejka 2018-12-20 14:05:32 +01:00
parent a8740d6c09
commit c577493908

View file

@ -36,11 +36,18 @@
res.val.i = v1.val.i / v2.val.i; res.val.i = v1.val.i / v2.val.i;
break; break;
case FI_AND: case FI_AND:
ARG(1,T_BOOL);
if (!v1.val.i) {
res = v1;
} else {
ARG(2,T_BOOL);
res = v2;
}
break;
case FI_OR: case FI_OR:
ARG(1,T_BOOL); ARG(1,T_BOOL);
if (v1.val.i == (what->fi_code == FI_OR)) { if (v1.val.i) {
res.type = T_BOOL; res = v1;
res.val.i = v1.val.i;
} else { } else {
ARG(2,T_BOOL); ARG(2,T_BOOL);
res = v2; res = v2;
@ -142,28 +149,39 @@
/* Relational operators */ /* Relational operators */
#define COMPARE(x) \ case FI_NEQ:
ARG_ANY(1); \ ARG_ANY(1);
ARG_ANY(2); \ ARG_ANY(2);
i = val_compare(v1, v2); \ res.type = T_BOOL;
if (i==CMP_ERROR) \ res.val.i = !val_same(v1, v2);
runtime( "Can't compare values of incompatible types" ); \
res.type = T_BOOL; \
res.val.i = (x); \
break; break;
#define SAME(x) \ case FI_EQ:
ARG_ANY(1); \ ARG_ANY(1);
ARG_ANY(2); \ ARG_ANY(2);
i = val_same(v1, v2); \ res.type = T_BOOL;
res.type = T_BOOL; \ res.val.i = val_same(v1, v2);
res.val.i = (x); \
break; break;
case FI_NEQ: SAME(!i); case FI_LT:
case FI_EQ: SAME(i); ARG_ANY(1);
case FI_LT: COMPARE(i==-1); ARG_ANY(2);
case FI_LTE: COMPARE(i!=1); i = val_compare(v1, v2);
if (i==CMP_ERROR)
runtime( "Can't compare values of incompatible types" );
res.type = T_BOOL;
res.val.i = (i == -1);
break;
case FI_LTE:
ARG_ANY(1);
ARG_ANY(2);
i = val_compare(v1, v2);
if (i==CMP_ERROR)
runtime( "Can't compare values of incompatible types" );
res.type = T_BOOL;
res.val.i = (i != 1);
break;
case FI_NOT: case FI_NOT:
ARG(1,T_BOOL); ARG(1,T_BOOL);