0
0
mirror of https://gitlab.nic.cz/labs/bird.git synced 2024-12-23 02:01:55 +00:00

Filter: Move argument list reversal from function_call to var_list

List of arguments for function calls is constructed in reverse and then
reverted. This was done in function_call grammar rule. Do the reverse
directly in var_list grammar rule. This fixes reverse order of arguments
in method calls.
This commit is contained in:
Ondrej Zajicek 2023-07-12 20:01:03 +02:00
parent fc4398b4e1
commit e4ce88cc50

View File

@ -374,7 +374,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
%nonassoc ELSE %nonassoc ELSE
%type <xp> cmds_int cmd_prep %type <xp> cmds_int cmd_prep
%type <x> term term_bs cmd cmd_var cmds cmds_scoped constant constructor var var_list function_call symbol_value bgp_path_expr bgp_path bgp_path_tail term_dot_method method_name_cont %type <x> term term_bs cmd cmd_var cmds cmds_scoped constant constructor var var_list var_list_r function_call symbol_value bgp_path_expr bgp_path bgp_path_tail term_dot_method method_name_cont
%type <fda> dynamic_attr %type <fda> dynamic_attr
%type <fsa> static_attr %type <fsa> static_attr
%type <f> filter where_filter %type <f> filter where_filter
@ -807,10 +807,27 @@ constructor:
; ;
/* This generates the function_call variable list backwards. */ /* This generates the function_call variable list backwards */
var_list: /* EMPTY */ { $$ = NULL; } var_list_r:
/* EMPTY */ { $$ = NULL; }
| term { $$ = $1; } | term { $$ = $1; }
| var_list ',' term { $$ = $3; $$->next = $1; } | var_list_r ',' term { $$ = $3; $$->next = $1; }
;
var_list: var_list_r
{
$$ = NULL;
/* Revert the var_list_r */
while ($1) {
struct f_inst *tmp = $1;
$1 = $1->next;
tmp->next = $$;
$$ = tmp;
}
}
;
function_call: function_call:
symbol_known '(' var_list ')' symbol_known '(' var_list ')'
@ -818,17 +835,7 @@ function_call:
if ($1->class != SYM_FUNCTION) if ($1->class != SYM_FUNCTION)
cf_error("You can't call something which is not a function. Really."); cf_error("You can't call something which is not a function. Really.");
/* Revert the var_list */ $$ = f_new_inst(FI_CALL, $3, $1);
struct f_inst *args = NULL;
while ($3) {
struct f_inst *tmp = $3;
$3 = $3->next;
tmp->next = args;
args = tmp;
}
$$ = f_new_inst(FI_CALL, args, $1);
} }
; ;
@ -1020,13 +1027,13 @@ cmd:
| UNSET '(' dynamic_attr ')' ';' { | UNSET '(' dynamic_attr ')' ';' {
$$ = f_new_inst(FI_EA_UNSET, $3); $$ = f_new_inst(FI_EA_UNSET, $3);
} }
| break_command var_list ';' { | break_command var_list_r ';' {
$$ = f_print($2, !!$2, $1); $$ = f_print($2, !!$2, $1);
} }
| PRINT var_list ';' { | PRINT var_list_r ';' {
$$ = f_print($2, 1, F_NOP); $$ = f_print($2, 1, F_NOP);
} }
| PRINTN var_list ';' { | PRINTN var_list_r ';' {
$$ = f_print($2, 0, F_NOP); $$ = f_print($2, 0, F_NOP);
} }
| function_call ';' { $$ = f_new_inst(FI_DROP_RESULT, $1); } | function_call ';' { $$ = f_new_inst(FI_DROP_RESULT, $1); }