diff options
author | Ian Romanick <ian.d.romanick@intel.com> | 2010-03-19 15:32:57 -0700 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2010-03-19 15:32:57 -0700 |
commit | 95517faf6931765408c697e3d60e4469616ad1d3 (patch) | |
tree | f777e480a140eacad03257ad93522cd71c485732 /symbol_table.c | |
parent | 8bde4cec6b189564b1f2d58514bd7e7a4b40f714 (diff) |
Add function to determine the scope where a variable is declared
Diffstat (limited to 'symbol_table.c')
-rw-r--r-- | symbol_table.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/symbol_table.c b/symbol_table.c index 4e043d1733..5d748f45c7 100644 --- a/symbol_table.c +++ b/symbol_table.c @@ -269,6 +269,36 @@ _mesa_symbol_table_iterator_next(struct _mesa_symbol_table_iterator *iter) } +/** + * Determine the scope "distance" of a symbol from the current scope + * + * \return + * A non-negative number for the number of scopes between the current scope + * and the scope where a symbol was defined. A value of zero means the current + * scope. A negative number if the symbol does not exist. + */ +int +_mesa_symbol_table_symbol_scope(struct _mesa_symbol_table *table, + int name_space, const char *name) +{ + struct symbol_header *const hdr = find_symbol(table, name); + struct symbol *sym; + + if (hdr != NULL) { + for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) { + assert(sym->hdr == hdr); + + if ((name_space == -1) || (sym->name_space == name_space)) { + assert(sym->depth <= table->depth); + return sym->depth - table->depth; + } + } + } + + return -1; +} + + void * _mesa_symbol_table_find_symbol(struct _mesa_symbol_table *table, int name_space, const char *name) |