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:
parent
fc4398b4e1
commit
e4ce88cc50
@ -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); }
|
||||||
|
Loading…
Reference in New Issue
Block a user