]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Conf/Filters: Moved argument count to conf scope
authorMaria Matejka <mq@jmq.cz>
Tue, 25 Jun 2019 14:18:06 +0000 (16:18 +0200)
committerMaria Matejka <mq@jmq.cz>
Tue, 25 Jun 2019 14:18:06 +0000 (16:18 +0200)
conf/cf-lex.l
conf/conf.h
filter/config.Y

index 09f3db8df358292f8938b98db902e5ad6329287a..0aa9273f36a816fd70f8f82ea6f57825a9bed3d2 100644 (file)
@@ -742,6 +742,7 @@ cf_push_scope(struct symbol *sym)
   conf_this_scope = s;
   s->active = 1;
   s->name = sym;
+  s->slots = 0;
 }
 
 /**
index d88d9a44ee2c522c82e52366d53c1c7136fd5fe3..708a10340e1ebc0714da049908c9c3d564bb4754 100644 (file)
@@ -126,6 +126,7 @@ struct symbol {
 struct sym_scope {
   struct sym_scope *next;              /* Next on scope stack */
   struct symbol *name;                 /* Name of this scope */
+  uint slots;                          /* Variable slots */
   int active;                          /* Currently entered */
 };
 
index 3898748cb6e2593ccc2cb0cd63a4c90af5d96e9e..72866bb0b6c41dd7752a9b47c6f3f9f02642f456 100644 (file)
@@ -15,8 +15,6 @@ CF_HDR
 
 CF_DEFINES
 
-static uint decls_count;
-
 static inline u32 pair(u32 a, u32 b) { return (a << 16) | b; }
 static inline u32 pair_a(u32 p) { return p >> 16; }
 static inline u32 pair_b(u32 p) { return p & 0xFFFF; }
@@ -455,7 +453,7 @@ CF_KEYWORDS(FUNCTION, PRINT, PRINTN, UNSET, RETURN,
 %type <f> filter where_filter
 %type <fl> filter_body function_body
 %type <flv> lvalue
-%type <i> type function_params
+%type <i> type function_params declsn decls
 %type <ecs> ec_kind
 %type <fret> break_command 
 %type <i32> cnum
@@ -557,22 +555,24 @@ type:
 
 /* Declarations with ';' at the end */
 decls:
-   /* EMPTY */
- | declsn ';'
+   /* EMPTY */ { $$ = 0; }
+ | declsn ';' { $$ = $1; }
  ;
 
 /* Declarations that have no ';' at the end. */
 declsn:
    type CF_SYM_VOID {
-     cf_define_symbol($2, SYM_VARIABLE | $1, offset, decls_count++);
+     cf_define_symbol($2, SYM_VARIABLE | $1, offset, $2->scope->slots++);
+     $$ = $2->scope->slots;
    }
  | declsn ';' type CF_SYM_VOID {
-     if (decls_count >= 0xff) cf_error("Too many declarations, at most 255 allowed");
-     cf_define_symbol($4, SYM_VARIABLE | $3, offset, decls_count++);
+     if ($4->scope->slots >= 0xff) cf_error("Too many declarations, at most 255 allowed");
+     cf_define_symbol($4, SYM_VARIABLE | $3, offset, $4->scope->slots++);
+     $$ = $4->scope->slots;
    }
  ;
 
-filter_body: { decls_count = 0; } function_body { $$ = $2; } ;
+filter_body: function_body ;
 
 filter:
    CF_SYM_KNOWN {
@@ -594,14 +594,14 @@ where_filter:
  ;
 
 function_params:
-   '(' declsn ')' { $$ = decls_count; }
+   '(' declsn ')' { $$ = $2; }
  | '(' ')' { $$ = 0; }
  ;
 
 function_body:
    decls '{' cmds '}' {
      $$ = f_linearize($3);
-     $$->vars = decls_count;
+     $$->vars = $1;
    }
  ;
 
@@ -610,7 +610,6 @@ function_def:
    FUNCTION CF_SYM_VOID { DBG( "Beginning of function %s\n", $2->name );
      $2 = cf_define_symbol($2, SYM_FUNCTION, function, NULL);
      cf_push_scope($2);
-     decls_count = 0;
    } function_params function_body {
      $5->vars -= $4;
      $5->args = $4;