mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
Filter refactoring: Expanded the short instructions with common code.
This will make the further changes more straightforward.
This commit is contained in:
parent
a8740d6c09
commit
c577493908
@ -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);
|
||||||
|
Loading…
Reference in New Issue
Block a user