Add function to determine the scope where a variable is declared

This commit is contained in:
Ian Romanick 2010-03-19 15:32:57 -07:00
parent 8bde4cec6b
commit 95517faf69
2 changed files with 33 additions and 0 deletions

View file

@ -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)

View file

@ -37,6 +37,9 @@ extern void _mesa_symbol_table_pop_scope(struct _mesa_symbol_table *table);
extern int _mesa_symbol_table_add_symbol(struct _mesa_symbol_table *symtab,
int name_space, const char *name, void *declaration);
extern int _mesa_symbol_table_symbol_scope(struct _mesa_symbol_table *table,
int name_space, const char *name);
extern void *_mesa_symbol_table_find_symbol(
struct _mesa_symbol_table *symtab, int name_space, const char *name);