diff --git a/conf/cf-lex.l b/conf/cf-lex.l index 09f3db8d..0aa9273f 100644 --- a/conf/cf-lex.l +++ b/conf/cf-lex.l @@ -742,6 +742,7 @@ cf_push_scope(struct symbol *sym) conf_this_scope = s; s->active = 1; s->name = sym; + s->slots = 0; } /** diff --git a/conf/conf.h b/conf/conf.h index d88d9a44..708a1034 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -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 */ }; diff --git a/filter/config.Y b/filter/config.Y index 3898748c..72866bb0 100644 --- a/filter/config.Y +++ b/filter/config.Y @@ -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 filter where_filter %type filter_body function_body %type lvalue -%type type function_params +%type type function_params declsn decls %type ec_kind %type break_command %type 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;