Filter: Fixed bugs in FI_CALL and FI_SWITCH

This commit is contained in:
Maria Matejka 2019-02-18 14:57:15 +01:00
parent d348a916f5
commit 32793ab685
3 changed files with 21 additions and 18 deletions

View file

@ -50,7 +50,6 @@ CF_DECLS
struct channel_config *cc; struct channel_config *cc;
struct f_inst *x; struct f_inst *x;
struct f_inst *xp[2]; struct f_inst *xp[2];
struct { struct f_inst *inst; uint count; } xc;
enum filter_return fret; enum filter_return fret;
enum ec_subtype ecs; enum ec_subtype ecs;
struct f_dynamic_attr fda; struct f_dynamic_attr fda;

View file

@ -446,8 +446,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
%nonassoc THEN %nonassoc THEN
%nonassoc ELSE %nonassoc ELSE
%type <xc> function_params declsn %type <xp> cmds_int function_body declsn function_params
%type <xp> cmds_int function_body
%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 <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 <fda> dynamic_attr
%type <fsa> static_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; } decls: /* EMPTY */ { $$ = NULL; }
| one_decl ';' decls { | one_decl ';' decls {
$$ = $1; $$ = $1;
@ -569,12 +568,12 @@ decls: /* EMPTY */ { $$ = NULL; }
} }
; ;
/* Declarations that have no ';' at the end. Beware; these are reversed. */ /* Declarations that have no ';' at the end. */
declsn: one_decl { $$.inst = $1; $$.count = 1; } declsn: one_decl { $$[0] = $$[1] = $1; }
| one_decl ';' declsn { | one_decl ';' declsn {
$1->next = $3.inst; $3[1]->next = $1;
$$.count = $3.count + 1; $$[1] = $3[1] = $1;
$$.inst = $1; $$[0] = $3[0];
} }
; ;
@ -608,8 +607,8 @@ where_filter:
; ;
function_params: function_params:
'(' declsn ')' { $$ = $2; } '(' declsn ')' { $$[0] = $2[0]; $$[1] = $2[1]; }
| '(' ')' { $$.inst = NULL; $$.count = 0; } | '(' ')' { $$[0] = $$[1] = NULL; }
; ;
function_body: function_body:
@ -629,8 +628,8 @@ function_def:
uint count = 0; uint count = 0;
/* Argument setters */ /* Argument setters */
if ($4.inst) if ($4[0])
catlist[count++] = $4.inst; catlist[count++] = $4[0];
/* Local var clearers */ /* Local var clearers */
if ($5[0]) if ($5[0])
@ -644,7 +643,11 @@ function_def:
catlist[count++] = $5[1]; catlist[count++] = $5[1];
struct f_line *fl = f_postfixify_concat(catlist, count); 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; $2->function = fl;
cf_pop_scope(); cf_pop_scope();

View file

@ -790,17 +790,18 @@
INST(FI_SWITCH, 1, 0) { INST(FI_SWITCH, 1, 0) {
ARG_ANY(1); ARG_ANY(1);
TREE; TREE;
if (!tree) { const struct f_tree *t = find_tree(tree, &v1);
if (!t) {
v1.type = T_VOID; v1.type = T_VOID;
tree = find_tree(tree, &v1); t = find_tree(tree, &v1);
if (!tree) { if (!t) {
debug( "No else statement?\n"); debug( "No else statement?\n");
break; break;
} }
} }
/* It is actually possible to have t->data NULL */ /* It is actually possible to have t->data NULL */
LINEX(tree->data); LINEX(t->data);
} }
INST(FI_IP_MASK, 2, 1) { /* IP.MASK(val) */ INST(FI_IP_MASK, 2, 1) { /* IP.MASK(val) */