1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright © 2008 Intel Corporation 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the next 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * paragraph) shall be included in all copies or substantial portions of the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software. 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * DEALINGS IN THE SOFTWARE. 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "symbol_table.h" 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "hash_table.h" 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct symbol { 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Link to the next symbol in the table with the same name 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The linked list of symbols with the same name is ordered by scope 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * from inner-most to outer-most. 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *next_with_same_name; 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Link to the next symbol in the table with the same scope 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The linked list of symbols with the same scope is unordered. Symbols 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in this list my have unique names. 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *next_with_same_scope; 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Header information for the list of symbols with the same name. 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol_header *hdr; 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Name space of the symbol 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Name space are arbitrary user assigned integers. No two symbols can 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * exist in the same name space at the same scope level. 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int name_space; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Scope depth where this symbol was defined. */ 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned depth; 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Arbitrary user supplied data. 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *data; 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct symbol_header { 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Linkage in list of all headers in a given symbol table. */ 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol_header *next; 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Symbol name. */ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *name; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Linked list of symbols with the same name. */ 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *symbols; 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Element of the scope stack. 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct scope_level { 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Link to next (inner) scope level. */ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct scope_level *next; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Linked list of symbols with the same scope. */ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *symbols; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct _mesa_symbol_table { 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Hash table containing all symbols in the symbol table. */ 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct hash_table *ht; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Top of scope stack. */ 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct scope_level *current_scope; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** List of all symbol headers in the table. */ 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol_header *hdr; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** Current scope depth. */ 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned depth; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct _mesa_symbol_table_iterator { 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Name space of symbols returned by this iterator. 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int name_space; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /** 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Currently iterated symbol 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The next call to \c _mesa_symbol_table_iterator_get will return this 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * value. It will also update this value to the value that should be 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * returned by the next call. 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *curr; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcheck_symbol_table(struct _mesa_symbol_table *table) 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 1 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct scope_level *scope; 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (scope = table->current_scope; scope != NULL; scope = scope->next) { 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *sym; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (sym = scope->symbols 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; sym != NULL 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; sym = sym->next_with_same_name) { 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct symbol_header *const hdr = sym->hdr; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *sym2; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (sym2 = hdr->symbols 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; sym2 != NULL 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; sym2 = sym2->next_with_same_name) { 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sym2->hdr == hdr); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_symbol_table_pop_scope(struct _mesa_symbol_table *table) 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct scope_level *const scope = table->current_scope; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *sym = scope->symbols; 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table->current_scope = scope->next; 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table->depth--; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(scope); 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (sym != NULL) { 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *const next = sym->next_with_same_scope; 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol_header *const hdr = sym->hdr; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(hdr->symbols == sym); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdr->symbols = sym->next_with_same_name; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(sym); 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym = next; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_symbol_table(table); 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_symbol_table_push_scope(struct _mesa_symbol_table *table) 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct scope_level *const scope = calloc(1, sizeof(*scope)); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org scope->next = table->current_scope; 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table->current_scope = scope; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table->depth++; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct symbol_header * 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfind_symbol(struct _mesa_symbol_table *table, const char *name) 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (struct symbol_header *) hash_table_find(table->ht, name); 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct _mesa_symbol_table_iterator * 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_symbol_table_iterator_ctor(struct _mesa_symbol_table *table, 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int name_space, const char *name) 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_symbol_table_iterator *iter = calloc(1, sizeof(*iter)); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol_header *const hdr = find_symbol(table, name); 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter->name_space = name_space; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hdr != NULL) { 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *sym; 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) { 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sym->hdr == hdr); 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((name_space == -1) || (sym->name_space == name_space)) { 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter->curr = sym; 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return iter; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_symbol_table_iterator_dtor(struct _mesa_symbol_table_iterator *iter) 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(iter); 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid * 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_symbol_table_iterator_get(struct _mesa_symbol_table_iterator *iter) 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (iter->curr == NULL) ? NULL : iter->curr->data; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_symbol_table_iterator_next(struct _mesa_symbol_table_iterator *iter) 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol_header *hdr; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (iter->curr == NULL) { 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdr = iter->curr->hdr; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter->curr = iter->curr->next_with_same_name; 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (iter->curr != NULL) { 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(iter->curr->hdr == hdr); 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void)hdr; 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((iter->name_space == -1) 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || (iter->curr->name_space == iter->name_space)) { 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org iter->curr = iter->curr->next_with_same_name; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Determine the scope "distance" of a symbol from the current scope 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A non-negative number for the number of scopes between the current scope 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and the scope where a symbol was defined. A value of zero means the current 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * scope. A negative number if the symbol does not exist. 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_symbol_table_symbol_scope(struct _mesa_symbol_table *table, 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int name_space, const char *name) 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol_header *const hdr = find_symbol(table, name); 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *sym; 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hdr != NULL) { 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) { 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sym->hdr == hdr); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((name_space == -1) || (sym->name_space == name_space)) { 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sym->depth <= table->depth); 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return sym->depth - table->depth; 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid * 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_symbol_table_find_symbol(struct _mesa_symbol_table *table, 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int name_space, const char *name) 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol_header *const hdr = find_symbol(table, name); 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hdr != NULL) { 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *sym; 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) { 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sym->hdr == hdr); 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((name_space == -1) || (sym->name_space == name_space)) { 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return sym->data; 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_symbol_table_add_symbol(struct _mesa_symbol_table *table, 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int name_space, const char *name, 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *declaration) 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol_header *hdr; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *sym; 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_symbol_table(table); 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdr = find_symbol(table, name); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_symbol_table(table); 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hdr == NULL) { 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdr = calloc(1, sizeof(*hdr)); 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdr->name = strdup(name); 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_table_insert(table->ht, hdr, hdr->name); 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdr->next = table->hdr; 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table->hdr = hdr; 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_symbol_table(table); 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If the symbol already exists in this namespace at this scope, it cannot 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be added to the table. 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (sym = hdr->symbols 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; (sym != NULL) && (sym->name_space != name_space) 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; sym = sym->next_with_same_name) { 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* empty */ 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sym && (sym->depth == table->depth)) 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym = calloc(1, sizeof(*sym)); 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->next_with_same_name = hdr->symbols; 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->next_with_same_scope = table->current_scope->symbols; 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->hdr = hdr; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->name_space = name_space; 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->data = declaration; 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->depth = table->depth; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sym->hdr == hdr); 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdr->symbols = sym; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table->current_scope->symbols = sym; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_symbol_table(table); 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgint 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_symbol_table_add_global_symbol(struct _mesa_symbol_table *table, 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int name_space, const char *name, 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *declaration) 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol_header *hdr; 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *sym; 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol *curr; 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct scope_level *top_scope; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_symbol_table(table); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdr = find_symbol(table, name); 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_symbol_table(table); 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hdr == NULL) { 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdr = calloc(1, sizeof(*hdr)); 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdr->name = strdup(name); 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_table_insert(table->ht, hdr, hdr->name); 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdr->next = table->hdr; 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table->hdr = hdr; 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_symbol_table(table); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If the symbol already exists in this namespace at this scope, it cannot 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be added to the table. 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (sym = hdr->symbols 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; (sym != NULL) && (sym->name_space != name_space) 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; sym = sym->next_with_same_name) { 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* empty */ 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (sym && sym->depth == 0) 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Find the top-level scope */ 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (top_scope = table->current_scope 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; top_scope->next != NULL 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; top_scope = top_scope->next) { 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* empty */ 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym = calloc(1, sizeof(*sym)); 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->next_with_same_scope = top_scope->symbols; 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->hdr = hdr; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->name_space = name_space; 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sym->data = declaration; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(sym->hdr == hdr); 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Since next_with_same_name is ordered by scope, we need to append the 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * new symbol to the _end_ of the list. 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (hdr->symbols == NULL) { 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hdr->symbols = sym; 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (curr = hdr->symbols 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; curr->next_with_same_name != NULL 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; curr = curr->next_with_same_name) { 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* empty */ 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org curr->next_with_same_name = sym; 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org top_scope->symbols = sym; 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_symbol_table(table); 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct _mesa_symbol_table * 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_symbol_table_ctor(void) 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct _mesa_symbol_table *table = calloc(1, sizeof(*table)); 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (table != NULL) { 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table->ht = hash_table_ctor(32, hash_table_string_hash, 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_table_string_compare); 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_symbol_table_push_scope(table); 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return table; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_symbol_table_dtor(struct _mesa_symbol_table *table) 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol_header *hdr; 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct symbol_header *next; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org while (table->current_scope != NULL) { 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_symbol_table_pop_scope(table); 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (hdr = table->hdr; hdr != NULL; hdr = next) { 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org next = hdr->next; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(hdr->name); 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(hdr); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org hash_table_dtor(table->ht); 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(table); 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 490