symbol_table: Add support for adding a symbol at top-level/global scope.

This commit is contained in:
Kenneth Graunke
2010-12-06 10:42:27 -08:00
parent 6fae1e4c4d
commit a8f52647b0
2 changed files with 84 additions and 5 deletions

View File

@@ -376,6 +376,81 @@ _mesa_symbol_table_add_symbol(struct _mesa_symbol_table *table,
} }
int
_mesa_symbol_table_add_global_symbol(struct _mesa_symbol_table *table,
int name_space, const char *name,
void *declaration)
{
struct symbol_header *hdr;
struct symbol *sym;
struct symbol *curr;
struct scope_level *top_scope;
check_symbol_table(table);
hdr = find_symbol(table, name);
check_symbol_table(table);
if (hdr == NULL) {
hdr = calloc(1, sizeof(*hdr));
hdr->name = strdup(name);
hash_table_insert(table->ht, hdr, hdr->name);
hdr->next = table->hdr;
table->hdr = hdr;
}
check_symbol_table(table);
/* If the symbol already exists in this namespace at this scope, it cannot
* be added to the table.
*/
for (sym = hdr->symbols
; (sym != NULL) && (sym->name_space != name_space)
; sym = sym->next_with_same_name) {
/* empty */
}
if (sym && sym->depth == 0)
return -1;
/* Find the top-level scope */
for (top_scope = table->current_scope
; top_scope->next != NULL
; top_scope = top_scope->next) {
/* empty */
}
sym = calloc(1, sizeof(*sym));
sym->next_with_same_scope = top_scope->symbols;
sym->hdr = hdr;
sym->name_space = name_space;
sym->data = declaration;
assert(sym->hdr == hdr);
/* Since next_with_same_name is ordered by scope, we need to append the
* new symbol to the _end_ of the list.
*/
if (hdr->symbols == NULL) {
hdr->symbols = sym;
} else {
for (curr = hdr->symbols
; curr->next_with_same_name != NULL
; curr = curr->next_with_same_name) {
/* empty */
}
curr->next_with_same_name = sym;
}
top_scope->symbols = sym;
check_symbol_table(table);
return 0;
}
struct _mesa_symbol_table * struct _mesa_symbol_table *
_mesa_symbol_table_ctor(void) _mesa_symbol_table_ctor(void)
{ {

View File

@@ -33,6 +33,10 @@ extern void _mesa_symbol_table_pop_scope(struct _mesa_symbol_table *table);
extern int _mesa_symbol_table_add_symbol(struct _mesa_symbol_table *symtab, extern int _mesa_symbol_table_add_symbol(struct _mesa_symbol_table *symtab,
int name_space, const char *name, void *declaration); int name_space, const char *name, void *declaration);
extern int _mesa_symbol_table_add_global_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, extern int _mesa_symbol_table_symbol_scope(struct _mesa_symbol_table *table,
int name_space, const char *name); int name_space, const char *name);