summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--filter/config.Y6
-rw-r--r--filter/filter.c15
-rw-r--r--filter/filter.h15
3 files changed, 11 insertions, 25 deletions
diff --git a/filter/config.Y b/filter/config.Y
index e01e02ef..cf499b66 100644
--- a/filter/config.Y
+++ b/filter/config.Y
@@ -304,12 +304,10 @@ f_generate_lc(struct f_inst *t1, struct f_inst *t2, struct f_inst *t3)
}
else
{
- rv = cfg_allocz(sizeof(struct f_inst3));
- rv->lineno = ifs->lino;
- rv->fi_code = FI_LC_CONSTRUCT;
+ rv = f_new_inst(FI_LC_CONSTRUCT);
rv->a1.p = t1;
rv->a2.p = t2;
- INST3(rv).p = t3;
+ rv->a3.p = t3;
}
return rv;
diff --git a/filter/filter.c b/filter/filter.c
index 3d7b5c9f..7117da48 100644
--- a/filter/filter.c
+++ b/filter/filter.c
@@ -601,6 +601,8 @@ static struct tbf rl_runtime_err = TBF_DEFAULT_LOG_LIMITS;
#define TWOARGS_C TWOARGS \
if (v1.type != v2.type) \
runtime( "Can't operate with values of incompatible types" );
+#define THREEARGS TWOARGS \
+ ARG(v3, a3.p)
#define ACCESS_RTE \
do { if (!f_rte) runtime("No route to access"); } while (0)
@@ -628,7 +630,7 @@ static struct f_val
interpret(struct f_inst *what)
{
struct symbol *sym;
- struct f_val v1, v2, res = { .type = T_VOID }, *vp;
+ struct f_val v1, v2, v3, res = { .type = T_VOID }, *vp;
unsigned u1, u2;
int i;
u32 as;
@@ -749,12 +751,7 @@ interpret(struct f_inst *what)
case FI_LC_CONSTRUCT:
{
- TWOARGS;
-
- /* Third argument hack */
- struct f_val v3 = interpret(INST3(what).p);
- if (v3.type & T_RETURN)
- return v3;
+ THREEARGS;
if ((v1.type != T_INT) || (v2.type != T_INT) || (v3.type != T_INT))
runtime( "Can't operate with value of non-integer type in LC constructor" );
@@ -1664,9 +1661,7 @@ i_same(struct f_inst *f1, struct f_inst *f2)
case FI_TYPE: ONEARG; break;
case FI_LC_CONSTRUCT:
- TWOARGS;
- if (!i_same(INST3(f1).p, INST3(f2).p))
- return 0;
+ THREEARGS;
break;
case FI_SET:
diff --git a/filter/filter.h b/filter/filter.h
index 694bdfd7..1e5fc8ff 100644
--- a/filter/filter.h
+++ b/filter/filter.h
@@ -93,6 +93,10 @@ struct f_inst { /* Instruction */
uint i;
void *p;
} a2; /* The second argument */
+ union {
+ int i;
+ void *p;
+ } a3; /* The third argument */
int lineno;
};
@@ -105,17 +109,6 @@ struct f_inst_roa_check {
struct rtable_config *rtc;
};
-struct f_inst3 {
- struct f_inst i;
- union {
- int i;
- void *p;
- } a3;
-};
-
-#define INST3(x) (((struct f_inst3 *) x)->a3)
-
-
struct f_prefix {
net_addr net;
u8 lo, hi;