Filter: macro for recursive interpretation of instructions
This commit is contained in:
parent
0ec6b5ecd3
commit
c3becfe193
1 changed files with 9 additions and 8 deletions
|
@ -590,16 +590,18 @@ static struct tbf rl_runtime_err = TBF_DEFAULT_LOG_LIMITS;
|
||||||
return res; \
|
return res; \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
#define ARG_ANY(n) \
|
#define ARG_ANY(n) INTERPRET(v##n, what->a##n.p)
|
||||||
v##n = interpret(what->a##n.p); \
|
|
||||||
if (v##n.type & T_RETURN) \
|
|
||||||
return v##n;
|
|
||||||
|
|
||||||
#define ARG(n,t) ARG_ANY(n) \
|
#define ARG(n,t) ARG_ANY(n) \
|
||||||
if (v##n.type != t) \
|
if (v##n.type != t) \
|
||||||
runtime("Argument %d of instruction %s must be of type %02x, got %02x", \
|
runtime("Argument %d of instruction %s must be of type %02x, got %02x", \
|
||||||
n, f_instruction_name(what->fi_code), t, v##n.type);
|
n, f_instruction_name(what->fi_code), t, v##n.type);
|
||||||
|
|
||||||
|
#define INTERPRET(val, what_) \
|
||||||
|
val = interpret(what_); \
|
||||||
|
if (val.type & T_RETURN) \
|
||||||
|
return val;
|
||||||
|
|
||||||
#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)
|
||||||
|
|
||||||
|
@ -747,7 +749,8 @@ interpret(struct f_inst *what)
|
||||||
while (tt) {
|
while (tt) {
|
||||||
*vv = lp_alloc(f_pool, sizeof(struct f_path_mask));
|
*vv = lp_alloc(f_pool, sizeof(struct f_path_mask));
|
||||||
if (tt->kind == PM_ASN_EXPR) {
|
if (tt->kind == PM_ASN_EXPR) {
|
||||||
struct f_val res = interpret((struct f_inst *) tt->val);
|
struct f_val res;
|
||||||
|
INTERPRET(res, (struct f_inst *) tt->val);
|
||||||
(*vv)->kind = PM_ASN;
|
(*vv)->kind = PM_ASN;
|
||||||
if (res.type != T_INT) {
|
if (res.type != T_INT) {
|
||||||
runtime( "Error resolving path mask template: value not an integer" );
|
runtime( "Error resolving path mask template: value not an integer" );
|
||||||
|
@ -1312,9 +1315,7 @@ interpret(struct f_inst *what)
|
||||||
}
|
}
|
||||||
/* It is actually possible to have t->data NULL */
|
/* It is actually possible to have t->data NULL */
|
||||||
|
|
||||||
res = interpret(t->data);
|
INTERPRET(res, t->data);
|
||||||
if (res.type & T_RETURN)
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case FI_IP_MASK: /* IP.MASK(val) */
|
case FI_IP_MASK: /* IP.MASK(val) */
|
||||||
|
|
Loading…
Reference in a new issue