diff options
author | Linus Torvalds <torvalds@penguin.transmeta.com> | 2003-03-31 16:25:51 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-07 20:59:57 -0700 |
commit | 91234dcb89f1d8883a79dd1edb9b520d9fff5571 (patch) | |
tree | 358f6cbf4032b698f18651274358ff7c8c13151e /scope.c | |
parent | Make labels be symbols in their own namespace (NS_LABEL). (diff) | |
download | sparse-91234dcb89f1d8883a79dd1edb9b520d9fff5571.tar.gz sparse-91234dcb89f1d8883a79dd1edb9b520d9fff5571.tar.bz2 sparse-91234dcb89f1d8883a79dd1edb9b520d9fff5571.zip |
Separate scopes for blocks and functions. Function scopes
are a proper superset of block scopes: function scopes
are created by a new function, block scopes by compound
statements and statement expressions.
Make labels use function scope.
Diffstat (limited to 'scope.c')
-rw-r--r-- | scope.c | 42 |
1 files changed, 34 insertions, 8 deletions
@@ -14,19 +14,34 @@ static struct scope base_scope = { .next = &base_scope }, - *current_scope = &base_scope; + *block_scope = &base_scope, + *function_scope = &base_scope; void bind_scope(struct symbol *sym) { - add_symbol(¤t_scope->symbols, sym); + struct scope *scope = block_scope; + if (sym->namespace == NS_LABEL) + scope = function_scope; + add_symbol(&scope->symbols, sym); } -void start_symbol_scope(void) +static void start_scope(struct scope **s) { struct scope *scope = __alloc_bytes(sizeof(*scope)); memset(scope, 0, sizeof(*scope)); - scope->next = current_scope; - current_scope = scope; + scope->next = *s; + *s = scope; +} + +void start_symbol_scope(void) +{ + start_scope(&block_scope); +} + +void start_function_scope(void) +{ + start_scope(&function_scope); + start_scope(&block_scope); } static void remove_symbol_scope(struct symbol *sym, void *data, int flags) @@ -38,12 +53,23 @@ static void remove_symbol_scope(struct symbol *sym, void *data, int flags) *ptr = sym->next_id; } -void end_symbol_scope(void) +static void end_scope(struct scope **s) { - struct scope *scope = current_scope; + struct scope *scope = *s; struct symbol_list *symbols = scope->symbols; - current_scope = scope->next; + *s = scope->next; scope->symbols = NULL; symbol_iterate(symbols, remove_symbol_scope, NULL); } + +void end_symbol_scope(void) +{ + end_scope(&block_scope); +} + +void end_function_scope(void) +{ + end_scope(&block_scope); + end_scope(&function_scope); +} |