Filter: Removing the third argument hack

Just to make the code a bit more clean and easier to maintain.
This commit is contained in:
Jan Maria Matejka 2018-04-30 13:29:05 +02:00
parent cff9e937fd
commit 478f9babed
3 changed files with 11 additions and 25 deletions

View file

@ -304,12 +304,10 @@ f_generate_lc(struct f_inst *t1, struct f_inst *t2, struct f_inst *t3)
} }
else else
{ {
rv = cfg_allocz(sizeof(struct f_inst3)); rv = f_new_inst(FI_LC_CONSTRUCT);
rv->lineno = ifs->lino;
rv->fi_code = FI_LC_CONSTRUCT;
rv->a1.p = t1; rv->a1.p = t1;
rv->a2.p = t2; rv->a2.p = t2;
INST3(rv).p = t3; rv->a3.p = t3;
} }
return rv; return rv;

View file

@ -601,6 +601,8 @@ static struct tbf rl_runtime_err = TBF_DEFAULT_LOG_LIMITS;
#define TWOARGS_C TWOARGS \ #define TWOARGS_C TWOARGS \
if (v1.type != v2.type) \ if (v1.type != v2.type) \
runtime( "Can't operate with values of incompatible types" ); runtime( "Can't operate with values of incompatible types" );
#define THREEARGS TWOARGS \
ARG(v3, a3.p)
#define ACCESS_RTE \ #define ACCESS_RTE \
do { if (!f_rte) runtime("No route to access"); } while (0) do { if (!f_rte) runtime("No route to access"); } while (0)
@ -628,7 +630,7 @@ static struct f_val
interpret(struct f_inst *what) interpret(struct f_inst *what)
{ {
struct symbol *sym; 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; unsigned u1, u2;
int i; int i;
u32 as; u32 as;
@ -749,12 +751,7 @@ interpret(struct f_inst *what)
case FI_LC_CONSTRUCT: case FI_LC_CONSTRUCT:
{ {
TWOARGS; THREEARGS;
/* Third argument hack */
struct f_val v3 = interpret(INST3(what).p);
if (v3.type & T_RETURN)
return v3;
if ((v1.type != T_INT) || (v2.type != T_INT) || (v3.type != T_INT)) 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" ); 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_TYPE: ONEARG; break;
case FI_LC_CONSTRUCT: case FI_LC_CONSTRUCT:
TWOARGS; THREEARGS;
if (!i_same(INST3(f1).p, INST3(f2).p))
return 0;
break; break;
case FI_SET: case FI_SET:

View file

@ -93,6 +93,10 @@ struct f_inst { /* Instruction */
uint i; uint i;
void *p; void *p;
} a2; /* The second argument */ } a2; /* The second argument */
union {
int i;
void *p;
} a3; /* The third argument */
int lineno; int lineno;
}; };
@ -105,17 +109,6 @@ struct f_inst_roa_check {
struct rtable_config *rtc; 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 { struct f_prefix {
net_addr net; net_addr net;
u8 lo, hi; u8 lo, hi;