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