]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
parser: compact type/typeof set rules
authorFlorian Westphal <fw@strlen.de>
Tue, 27 Feb 2024 14:53:19 +0000 (15:53 +0100)
committerFlorian Westphal <fw@strlen.de>
Thu, 29 Feb 2024 23:32:14 +0000 (00:32 +0100)
Set/maps keys can be declared either by 'type' or 'typeof' keyword.

Compact this to use a common block for both cases.

The datatype_set call is redundant, remove it:
at this point $3 == $1->key, so this is a no-op.

Signed-off-by: Florian Westphal <fw@strlen.de>
src/parser_bison.y

index 2b4968280042a0c0322e23700335363a1066a1ca..cba37c686f66ca9c99ab35031011e583f6b55492 100644 (file)
@@ -812,8 +812,8 @@ int nft_lex(void *, void *, void *);
 
 %type <expr>                   symbol_expr verdict_expr integer_expr variable_expr chain_expr policy_expr
 %destructor { expr_free($$); } symbol_expr verdict_expr integer_expr variable_expr chain_expr policy_expr
-%type <expr>                   primary_expr shift_expr and_expr typeof_expr typeof_data_expr typeof_verdict_expr
-%destructor { expr_free($$); } primary_expr shift_expr and_expr typeof_expr typeof_data_expr typeof_verdict_expr
+%type <expr>                   primary_expr shift_expr and_expr typeof_expr typeof_data_expr typeof_key_expr typeof_verdict_expr
+%destructor { expr_free($$); } primary_expr shift_expr and_expr typeof_expr typeof_data_expr typeof_key_expr typeof_verdict_expr
 %type <expr>                   exclusive_or_expr inclusive_or_expr
 %destructor { expr_free($$); } exclusive_or_expr inclusive_or_expr
 %type <expr>                   basic_expr
@@ -2182,27 +2182,21 @@ set_block_alloc         :       /* empty */
                        }
                        ;
 
+typeof_key_expr                :       TYPEOF  typeof_expr { $$ = $2; }
+                       |       TYPE    data_type_expr close_scope_type { $$ = $2; }
+                       ;
+
 set_block              :       /* empty */     { $$ = $<set>-1; }
                        |       set_block       common_block
                        |       set_block       stmt_separator
-                       |       set_block       TYPE            data_type_expr  stmt_separator  close_scope_type
+                       |       set_block       typeof_key_expr stmt_separator
                        {
                                if (already_set($1->key, &@2, state)) {
-                                       expr_free($3);
+                                       expr_free($2);
                                        YYERROR;
                                }
 
-                               $1->key = $3;
-                               $$ = $1;
-                       }
-                       |       set_block       TYPEOF          typeof_expr     stmt_separator
-                       {
-                               if (already_set($1->key, &@2, state)) {
-                                       expr_free($3);
-                                       YYERROR;
-                               }
-                               $1->key = $3;
-                               datatype_set($1->key, $3->dtype);
+                               $1->key = $2;
                                $$ = $1;
                        }
                        |       set_block       FLAGS           set_flag_list   stmt_separator