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;