aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@penguin.transmeta.com>2003-03-31 16:25:51 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-07 20:59:57 -0700
commit91234dcb89f1d8883a79dd1edb9b520d9fff5571 (patch)
tree358f6cbf4032b698f18651274358ff7c8c13151e /scope.c
parentMake labels be symbols in their own namespace (NS_LABEL). (diff)
downloadsparse-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.c42
1 files changed, 34 insertions, 8 deletions
diff --git a/scope.c b/scope.c
index c13fe5e..2e562f5 100644
--- a/scope.c
+++ b/scope.c
@@ -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(&current_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);
+}