mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 01:31:55 +00:00
Filter: Fixed bugs in FI_CALL and FI_SWITCH
This commit is contained in:
parent
d348a916f5
commit
32793ab685
@ -50,7 +50,6 @@ CF_DECLS
|
||||
struct channel_config *cc;
|
||||
struct f_inst *x;
|
||||
struct f_inst *xp[2];
|
||||
struct { struct f_inst *inst; uint count; } xc;
|
||||
enum filter_return fret;
|
||||
enum ec_subtype ecs;
|
||||
struct f_dynamic_attr fda;
|
||||
|
@ -446,8 +446,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
|
||||
%nonassoc THEN
|
||||
%nonassoc ELSE
|
||||
|
||||
%type <xc> function_params declsn
|
||||
%type <xp> cmds_int function_body
|
||||
%type <xp> cmds_int function_body declsn function_params
|
||||
%type <x> term block cmd cmds constant constructor print_one print_list var_list var_listn function_call symbol_value bgp_path_expr bgp_path bgp_path_tail one_decl decls
|
||||
%type <fda> dynamic_attr
|
||||
%type <fsa> static_attr
|
||||
@ -561,7 +560,7 @@ one_decl:
|
||||
}
|
||||
;
|
||||
|
||||
/* Decls with ';' at the end */
|
||||
/* Decls with ';' at the end. Beware; these are reversed. */
|
||||
decls: /* EMPTY */ { $$ = NULL; }
|
||||
| one_decl ';' decls {
|
||||
$$ = $1;
|
||||
@ -569,12 +568,12 @@ decls: /* EMPTY */ { $$ = NULL; }
|
||||
}
|
||||
;
|
||||
|
||||
/* Declarations that have no ';' at the end. Beware; these are reversed. */
|
||||
declsn: one_decl { $$.inst = $1; $$.count = 1; }
|
||||
/* Declarations that have no ';' at the end. */
|
||||
declsn: one_decl { $$[0] = $$[1] = $1; }
|
||||
| one_decl ';' declsn {
|
||||
$1->next = $3.inst;
|
||||
$$.count = $3.count + 1;
|
||||
$$.inst = $1;
|
||||
$3[1]->next = $1;
|
||||
$$[1] = $3[1] = $1;
|
||||
$$[0] = $3[0];
|
||||
}
|
||||
;
|
||||
|
||||
@ -608,8 +607,8 @@ where_filter:
|
||||
;
|
||||
|
||||
function_params:
|
||||
'(' declsn ')' { $$ = $2; }
|
||||
| '(' ')' { $$.inst = NULL; $$.count = 0; }
|
||||
'(' declsn ')' { $$[0] = $2[0]; $$[1] = $2[1]; }
|
||||
| '(' ')' { $$[0] = $$[1] = NULL; }
|
||||
;
|
||||
|
||||
function_body:
|
||||
@ -629,8 +628,8 @@ function_def:
|
||||
uint count = 0;
|
||||
|
||||
/* Argument setters */
|
||||
if ($4.inst)
|
||||
catlist[count++] = $4.inst;
|
||||
if ($4[0])
|
||||
catlist[count++] = $4[0];
|
||||
|
||||
/* Local var clearers */
|
||||
if ($5[0])
|
||||
@ -644,7 +643,11 @@ function_def:
|
||||
catlist[count++] = $5[1];
|
||||
|
||||
struct f_line *fl = f_postfixify_concat(catlist, count);
|
||||
fl->args = $4.count;
|
||||
|
||||
fl->args = 0;
|
||||
for (const struct f_inst *arg = $4[0]; arg; arg = arg->next)
|
||||
fl->args++;
|
||||
|
||||
$2->function = fl;
|
||||
|
||||
cf_pop_scope();
|
||||
|
@ -790,17 +790,18 @@
|
||||
INST(FI_SWITCH, 1, 0) {
|
||||
ARG_ANY(1);
|
||||
TREE;
|
||||
if (!tree) {
|
||||
const struct f_tree *t = find_tree(tree, &v1);
|
||||
if (!t) {
|
||||
v1.type = T_VOID;
|
||||
tree = find_tree(tree, &v1);
|
||||
if (!tree) {
|
||||
t = find_tree(tree, &v1);
|
||||
if (!t) {
|
||||
debug( "No else statement?\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
/* It is actually possible to have t->data NULL */
|
||||
|
||||
LINEX(tree->data);
|
||||
LINEX(t->data);
|
||||
}
|
||||
|
||||
INST(FI_IP_MASK, 2, 1) { /* IP.MASK(val) */
|
||||
|
Loading…
Reference in New Issue
Block a user