Filter: Fixed bugs in FI_CALL and FI_SWITCH
This commit is contained in:
parent
d348a916f5
commit
32793ab685
3 changed files with 21 additions and 18 deletions
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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) */
|
||||||
|
|
Loading…
Reference in a new issue