1770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
2770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Copyright © 2008 Intel Corporation
3770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
4770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
5770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * copy of this software and associated documentation files (the "Software"),
6770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to deal in the Software without restriction, including without limitation
7770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
9770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software is furnished to do so, subject to the following conditions:
10770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
11770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * The above copyright notice and this permission notice (including the next
12770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * paragraph) shall be included in all copies or substantial portions of the
13770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software.
14770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
15770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * DEALINGS IN THE SOFTWARE.
22770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
23770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
245e3b2baae74e6cde494b2fe5c6b32e3e8ef0ce87Brian Paul#include "main/imports.h"
25770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "symbol_table.h"
26770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "hash_table.h"
27770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
28770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct symbol {
29770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /**
30770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * Link to the next symbol in the table with the same name
31770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     *
32770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * The linked list of symbols with the same name is ordered by scope
33770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * from inner-most to outer-most.
34770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     */
35770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct symbol *next_with_same_name;
36770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
37770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
38770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /**
39770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * Link to the next symbol in the table with the same scope
40770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     *
41770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * The linked list of symbols with the same scope is unordered.  Symbols
42770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * in this list my have unique names.
43770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     */
44770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct symbol *next_with_same_scope;
45770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
46770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
47770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /**
48770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * Header information for the list of symbols with the same name.
49770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     */
50770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct symbol_header *hdr;
51770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
52770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
53770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /**
54770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * Name space of the symbol
55770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     *
56770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * Name space are arbitrary user assigned integers.  No two symbols can
57770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * exist in the same name space at the same scope level.
58770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     */
59770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    int name_space;
60770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
6184341f4b2014810b2964230384fe76338be1d78eIan Romanick    /** Scope depth where this symbol was defined. */
6284341f4b2014810b2964230384fe76338be1d78eIan Romanick    unsigned depth;
6384341f4b2014810b2964230384fe76338be1d78eIan Romanick
64770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /**
65770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * Arbitrary user supplied data.
66770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     */
67770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    void *data;
68770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick};
69770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
70770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
71770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/**
72770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
73770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct symbol_header {
740f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick    /** Linkage in list of all headers in a given symbol table. */
750f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick    struct symbol_header *next;
760f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick
77770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /** Symbol name. */
78955ceef47f2bb8b5005abf11d4a8580c71f19e1bIan Romanick    char *name;
79770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
80770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /** Linked list of symbols with the same name. */
81770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct symbol *symbols;
82770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick};
83770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
84770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
85770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/**
86770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Element of the scope stack.
87770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
88770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct scope_level {
89770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /** Link to next (inner) scope level. */
90770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct scope_level *next;
91770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
92770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /** Linked list of symbols with the same scope. */
93770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct symbol *symbols;
94770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick};
95770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
96770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
97770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/**
98770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
99770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct _mesa_symbol_table {
101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /** Hash table containing all symbols in the symbol table. */
102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct hash_table *ht;
103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /** Top of scope stack. */
105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct scope_level *current_scope;
1060f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick
1070f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick    /** List of all symbol headers in the table. */
1080f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick    struct symbol_header *hdr;
10984341f4b2014810b2964230384fe76338be1d78eIan Romanick
11084341f4b2014810b2964230384fe76338be1d78eIan Romanick    /** Current scope depth. */
11184341f4b2014810b2964230384fe76338be1d78eIan Romanick    unsigned depth;
112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick};
113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct _mesa_symbol_table_iterator {
116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /**
117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * Name space of symbols returned by this iterator.
118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     */
119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    int name_space;
120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    /**
123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * Currently iterated symbol
124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     *
125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * The next call to \c _mesa_symbol_table_iterator_get will return this
126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * value.  It will also update this value to the value that should be
127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     * returned by the next call.
128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick     */
129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct symbol *curr;
130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick};
131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void
134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickcheck_symbol_table(struct _mesa_symbol_table *table)
135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#if 1
137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct scope_level *scope;
138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    for (scope = table->current_scope; scope != NULL; scope = scope->next) {
140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        struct symbol *sym;
141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        for (sym = scope->symbols
143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick             ; sym != NULL
144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick             ; sym = sym->next_with_same_name) {
145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            const struct symbol_header *const hdr = sym->hdr;
146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            struct symbol *sym2;
147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            for (sym2 = hdr->symbols
149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                 ; sym2 != NULL
150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                 ; sym2 = sym2->next_with_same_name) {
151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                assert(sym2->hdr == hdr);
152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            }
153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        }
154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    }
155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid
159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_pop_scope(struct _mesa_symbol_table *table)
160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct scope_level *const scope = table->current_scope;
162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct symbol *sym = scope->symbols;
163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    table->current_scope = scope->next;
16584341f4b2014810b2964230384fe76338be1d78eIan Romanick    table->depth--;
166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    free(scope);
168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    while (sym != NULL) {
170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        struct symbol *const next = sym->next_with_same_scope;
171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        struct symbol_header *const hdr = sym->hdr;
172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        assert(hdr->symbols == sym);
174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        hdr->symbols = sym->next_with_same_name;
176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        free(sym);
178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        sym = next;
180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    }
181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    check_symbol_table(table);
183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid
187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_push_scope(struct _mesa_symbol_table *table)
188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct scope_level *const scope = calloc(1, sizeof(*scope));
190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    scope->next = table->current_scope;
192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    table->current_scope = scope;
19384341f4b2014810b2964230384fe76338be1d78eIan Romanick    table->depth++;
194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic struct symbol_header *
198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickfind_symbol(struct _mesa_symbol_table *table, const char *name)
199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    return (struct symbol_header *) hash_table_find(table->ht, name);
201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct _mesa_symbol_table_iterator *
205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_iterator_ctor(struct _mesa_symbol_table *table,
206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                                 int name_space, const char *name)
207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct _mesa_symbol_table_iterator *iter = calloc(1, sizeof(*iter));
209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct symbol_header *const hdr = find_symbol(table, name);
210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    iter->name_space = name_space;
212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    if (hdr != NULL) {
214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        struct symbol *sym;
215770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) {
217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            assert(sym->hdr == hdr);
218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            if ((name_space == -1) || (sym->name_space == name_space)) {
220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                iter->curr = sym;
221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                break;
222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            }
223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        }
224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    }
225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    return iter;
227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid
231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_iterator_dtor(struct _mesa_symbol_table_iterator *iter)
232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    free(iter);
234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
237770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid *
238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_iterator_get(struct _mesa_symbol_table_iterator *iter)
239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    return (iter->curr == NULL) ? NULL : iter->curr->data;
241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint
245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_iterator_next(struct _mesa_symbol_table_iterator *iter)
246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct symbol_header *hdr;
248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
249770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    if (iter->curr == NULL) {
250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        return 0;
251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    }
252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    hdr = iter->curr->hdr;
254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    iter->curr = iter->curr->next_with_same_name;
255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    while (iter->curr != NULL) {
257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        assert(iter->curr->hdr == hdr);
258230cc36611346ad61610d6c19404e777878d7501Jakob Bornecrantz        (void)hdr;
259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        if ((iter->name_space == -1)
261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            || (iter->curr->name_space == iter->name_space)) {
262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            return 1;
263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        }
264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        iter->curr = iter->curr->next_with_same_name;
266770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    }
267770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    return 0;
269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
27284341f4b2014810b2964230384fe76338be1d78eIan Romanick/**
27384341f4b2014810b2964230384fe76338be1d78eIan Romanick * Determine the scope "distance" of a symbol from the current scope
27484341f4b2014810b2964230384fe76338be1d78eIan Romanick *
27584341f4b2014810b2964230384fe76338be1d78eIan Romanick * \return
27684341f4b2014810b2964230384fe76338be1d78eIan Romanick * A non-negative number for the number of scopes between the current scope
27784341f4b2014810b2964230384fe76338be1d78eIan Romanick * and the scope where a symbol was defined.  A value of zero means the current
27884341f4b2014810b2964230384fe76338be1d78eIan Romanick * scope.  A negative number if the symbol does not exist.
27984341f4b2014810b2964230384fe76338be1d78eIan Romanick */
28084341f4b2014810b2964230384fe76338be1d78eIan Romanickint
28184341f4b2014810b2964230384fe76338be1d78eIan Romanick_mesa_symbol_table_symbol_scope(struct _mesa_symbol_table *table,
28284341f4b2014810b2964230384fe76338be1d78eIan Romanick				int name_space, const char *name)
28384341f4b2014810b2964230384fe76338be1d78eIan Romanick{
28484341f4b2014810b2964230384fe76338be1d78eIan Romanick    struct symbol_header *const hdr = find_symbol(table, name);
28584341f4b2014810b2964230384fe76338be1d78eIan Romanick    struct symbol *sym;
28684341f4b2014810b2964230384fe76338be1d78eIan Romanick
28784341f4b2014810b2964230384fe76338be1d78eIan Romanick    if (hdr != NULL) {
28884341f4b2014810b2964230384fe76338be1d78eIan Romanick       for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) {
28984341f4b2014810b2964230384fe76338be1d78eIan Romanick	  assert(sym->hdr == hdr);
29084341f4b2014810b2964230384fe76338be1d78eIan Romanick
29184341f4b2014810b2964230384fe76338be1d78eIan Romanick	  if ((name_space == -1) || (sym->name_space == name_space)) {
29284341f4b2014810b2964230384fe76338be1d78eIan Romanick	     assert(sym->depth <= table->depth);
29384341f4b2014810b2964230384fe76338be1d78eIan Romanick	     return sym->depth - table->depth;
29484341f4b2014810b2964230384fe76338be1d78eIan Romanick	  }
29584341f4b2014810b2964230384fe76338be1d78eIan Romanick       }
29684341f4b2014810b2964230384fe76338be1d78eIan Romanick    }
29784341f4b2014810b2964230384fe76338be1d78eIan Romanick
29884341f4b2014810b2964230384fe76338be1d78eIan Romanick    return -1;
29984341f4b2014810b2964230384fe76338be1d78eIan Romanick}
30084341f4b2014810b2964230384fe76338be1d78eIan Romanick
30184341f4b2014810b2964230384fe76338be1d78eIan Romanick
302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid *
303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_find_symbol(struct _mesa_symbol_table *table,
304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                               int name_space, const char *name)
305770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct symbol_header *const hdr = find_symbol(table, name);
307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    if (hdr != NULL) {
309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        struct symbol *sym;
310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
311770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        for (sym = hdr->symbols; sym != NULL; sym = sym->next_with_same_name) {
313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            assert(sym->hdr == hdr);
314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            if ((name_space == -1) || (sym->name_space == name_space)) {
316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                return sym->data;
317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick            }
318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        }
319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    }
320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    return NULL;
322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint
326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_add_symbol(struct _mesa_symbol_table *table,
327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                              int name_space, const char *name,
328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                              void *declaration)
329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
3300dd08a9e15192dec7fd97febdbb39ce25a08a525Vinson Lee    struct symbol_header *hdr;
3310dd08a9e15192dec7fd97febdbb39ce25a08a525Vinson Lee    struct symbol *sym;
3320dd08a9e15192dec7fd97febdbb39ce25a08a525Vinson Lee
333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    check_symbol_table(table);
334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
3350dd08a9e15192dec7fd97febdbb39ce25a08a525Vinson Lee    hdr = find_symbol(table, name);
336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    check_symbol_table(table);
338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    if (hdr == NULL) {
340a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke       hdr = calloc(1, sizeof(*hdr));
341a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke       hdr->name = strdup(name);
342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
343a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke       hash_table_insert(table->ht, hdr, hdr->name);
344a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke       hdr->next = table->hdr;
345a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke       table->hdr = hdr;
346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    }
347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    check_symbol_table(table);
349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
35084341f4b2014810b2964230384fe76338be1d78eIan Romanick    /* If the symbol already exists in this namespace at this scope, it cannot
35184341f4b2014810b2964230384fe76338be1d78eIan Romanick     * be added to the table.
35284341f4b2014810b2964230384fe76338be1d78eIan Romanick     */
35384341f4b2014810b2964230384fe76338be1d78eIan Romanick    for (sym = hdr->symbols
35484341f4b2014810b2964230384fe76338be1d78eIan Romanick	 ; (sym != NULL) && (sym->name_space != name_space)
35584341f4b2014810b2964230384fe76338be1d78eIan Romanick	 ; sym = sym->next_with_same_name) {
35684341f4b2014810b2964230384fe76338be1d78eIan Romanick       /* empty */
35784341f4b2014810b2964230384fe76338be1d78eIan Romanick    }
35884341f4b2014810b2964230384fe76338be1d78eIan Romanick
35984341f4b2014810b2964230384fe76338be1d78eIan Romanick    if (sym && (sym->depth == table->depth))
36084341f4b2014810b2964230384fe76338be1d78eIan Romanick       return -1;
36184341f4b2014810b2964230384fe76338be1d78eIan Romanick
362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    sym = calloc(1, sizeof(*sym));
363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    sym->next_with_same_name = hdr->symbols;
364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    sym->next_with_same_scope = table->current_scope->symbols;
365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    sym->hdr = hdr;
366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    sym->name_space = name_space;
367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    sym->data = declaration;
36884341f4b2014810b2964230384fe76338be1d78eIan Romanick    sym->depth = table->depth;
369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    assert(sym->hdr == hdr);
371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    hdr->symbols = sym;
373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    table->current_scope->symbols = sym;
374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    check_symbol_table(table);
376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    return 0;
377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
380a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunkeint
381a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke_mesa_symbol_table_add_global_symbol(struct _mesa_symbol_table *table,
382a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke				     int name_space, const char *name,
383a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke				     void *declaration)
384a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke{
385a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    struct symbol_header *hdr;
386a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    struct symbol *sym;
387a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    struct symbol *curr;
388a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    struct scope_level *top_scope;
389a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
390a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    check_symbol_table(table);
391a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
392a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    hdr = find_symbol(table, name);
393a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
394a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    check_symbol_table(table);
395a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
396a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    if (hdr == NULL) {
397a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke        hdr = calloc(1, sizeof(*hdr));
398a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke        hdr->name = strdup(name);
399a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
400a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke        hash_table_insert(table->ht, hdr, hdr->name);
401a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke        hdr->next = table->hdr;
402a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke        table->hdr = hdr;
403a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    }
404a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
405a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    check_symbol_table(table);
406a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
407a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    /* If the symbol already exists in this namespace at this scope, it cannot
408a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke     * be added to the table.
409a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke     */
410a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    for (sym = hdr->symbols
411a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke	 ; (sym != NULL) && (sym->name_space != name_space)
412a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke	 ; sym = sym->next_with_same_name) {
413a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke       /* empty */
414a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    }
415a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
416a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    if (sym && sym->depth == 0)
417a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke       return -1;
418a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
419a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    /* Find the top-level scope */
420a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    for (top_scope = table->current_scope
421a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke	 ; top_scope->next != NULL
422a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke	 ; top_scope = top_scope->next) {
423a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke       /* empty */
424a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    }
425a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
426a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    sym = calloc(1, sizeof(*sym));
427a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    sym->next_with_same_scope = top_scope->symbols;
428a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    sym->hdr = hdr;
429a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    sym->name_space = name_space;
430a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    sym->data = declaration;
431a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
432a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    assert(sym->hdr == hdr);
433a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
434a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    /* Since next_with_same_name is ordered by scope, we need to append the
435a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke     * new symbol to the _end_ of the list.
436a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke     */
437a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    if (hdr->symbols == NULL) {
438a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke       hdr->symbols = sym;
439a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    } else {
440a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke       for (curr = hdr->symbols
441a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke	    ; curr->next_with_same_name != NULL
442a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke	    ; curr = curr->next_with_same_name) {
443a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke	  /* empty */
444a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke       }
445a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke       curr->next_with_same_name = sym;
446a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    }
447a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    top_scope->symbols = sym;
448a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
449a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    check_symbol_table(table);
450a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke    return 0;
451a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke}
452a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
453a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
454a8f52647b045b5400ebcfc58ba235599a6e9ad87Kenneth Graunke
455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct _mesa_symbol_table *
456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_symbol_table_ctor(void)
457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct _mesa_symbol_table *table = calloc(1, sizeof(*table));
459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
460946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick    if (table != NULL) {
461946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick       table->ht = hash_table_ctor(32, hash_table_string_hash,
462946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick				   hash_table_string_compare);
463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
464946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick       _mesa_symbol_table_push_scope(table);
465946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick    }
466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
467770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    return table;
468770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
469946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick
470946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick
471946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanickvoid
472946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick_mesa_symbol_table_dtor(struct _mesa_symbol_table *table)
473946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick{
4740f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick   struct symbol_header *hdr;
4750f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick   struct symbol_header *next;
4760f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick
477946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick   while (table->current_scope != NULL) {
478946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick      _mesa_symbol_table_pop_scope(table);
479946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick   }
480946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick
4810f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick   for (hdr = table->hdr; hdr != NULL; hdr = next) {
4820f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick       next = hdr->next;
483955ceef47f2bb8b5005abf11d4a8580c71f19e1bIan Romanick       free(hdr->name);
48432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg       free(hdr);
4850f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick   }
4860f255d195651f104a0c0bed84039b656d94ac4ccIan Romanick
487946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick   hash_table_dtor(table->ht);
488946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick   free(table);
489946ea82bff530ac7aa8f5ebe56704fde62e14e86Ian Romanick}
490