summaryrefslogtreecommitdiff
path: root/symbol_table.c
diff options
context:
space:
mode:
authorIan Romanick <ian.d.romanick@intel.com>2010-03-19 15:32:57 -0700
committerIan Romanick <ian.d.romanick@intel.com>2010-03-19 15:32:57 -0700
commit95517faf6931765408c697e3d60e4469616ad1d3 (patch)
treef777e480a140eacad03257ad93522cd71c485732 /symbol_table.c
parent8bde4cec6b189564b1f2d58514bd7e7a4b40f714 (diff)
Add function to determine the scope where a variable is declared
Diffstat (limited to 'symbol_table.c')
-rw-r--r--symbol_table.c30
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)