Merge branch 'mesa_7_7_branch'
[mesa.git] / src / mesa / shader / symbol_table.c
index 71ce1287f54ef22e5c6357eab071a0676260e754..1f6d9b844d622d8c641c53e878be5f9c0d5a445a 100644 (file)
  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  * DEALINGS IN THE SOFTWARE.
  */
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <errno.h>
-#include <assert.h>
 
+#include "main/imports.h"
 #include "symbol_table.h"
 #include "hash_table.h"
 
@@ -73,6 +69,9 @@ struct symbol {
 /**
  */
 struct symbol_header {
+    /** Linkage in list of all headers in a given symbol table. */
+    struct symbol_header *next;
+
     /** Symbol name. */
     const char *name;
 
@@ -102,6 +101,9 @@ struct _mesa_symbol_table {
 
     /** Top of scope stack. */
     struct scope_level *current_scope;
+
+    /** List of all symbol headers in the table. */
+    struct symbol_header *hdr;
 };
 
 
@@ -287,10 +289,12 @@ _mesa_symbol_table_add_symbol(struct _mesa_symbol_table *table,
                               int name_space, const char *name,
                               void *declaration)
 {
+    struct symbol_header *hdr;
+    struct symbol *sym;
+
     check_symbol_table(table);
 
-    struct symbol_header *hdr = find_symbol(table, name);
-    struct symbol *sym;
+    hdr = find_symbol(table, name);
 
     check_symbol_table(table);
 
@@ -299,6 +303,8 @@ _mesa_symbol_table_add_symbol(struct _mesa_symbol_table *table,
         hdr->name = name;
 
         hash_table_insert(table->ht, hdr, name);
+       hdr->next = table->hdr;
+       table->hdr = hdr;
     }
 
     check_symbol_table(table);
@@ -339,10 +345,18 @@ _mesa_symbol_table_ctor(void)
 void
 _mesa_symbol_table_dtor(struct _mesa_symbol_table *table)
 {
+   struct symbol_header *hdr;
+   struct symbol_header *next;
+
    while (table->current_scope != NULL) {
       _mesa_symbol_table_pop_scope(table);
    }
 
+   for (hdr = table->hdr; hdr != NULL; hdr = next) {
+       next = hdr->next;
+       _mesa_free(hdr);
+   }
+
    hash_table_dtor(table->ht);
    free(table);
 }