`---------------------------------*/
static symbol_t *
-symbol_new (const char *tag, location_t location)
+symbol_new (struniq_t tag, location_t location)
{
symbol_t *res = XMALLOC (symbol_t, 1);
- res->tag = xstrdup (tag);
+ struniq_assert (tag);
+ res->tag = tag;
res->location = location;
res->type_name = NULL;
`------------------------------------------------------------------*/
void
-symbol_type_set (symbol_t *symbol, char *type_name, location_t location)
+symbol_type_set (symbol_t *symbol, struniq_t type_name, location_t location)
{
if (type_name)
{
if (symbol->type_name)
complain_at (location,
_("type redeclaration for %s"), symbol->tag);
+ struniq_assert (type_name);
symbol->type_name = type_name;
}
}
symbol_user_token_number_set (symbol_t *symbol,
int user_token_number, location_t location)
{
- assert (symbol->class == token_sym);
+ if (symbol->class != token_sym)
+ abort ();
if (symbol->user_token_number != USER_NUMBER_UNDEFINED
&& symbol->user_token_number != user_token_number)
static void
symbol_free (symbol_t *this)
{
- free (this->tag);
free (this);
}
/* symbol and symval combined are only one symbol */
nsyms--;
ntokens--;
- assert (ntokens == symbol->number || ntokens == symval->number);
+ if (ntokens != symbol->number && ntokens != symval->number)
+ abort ();
symbol->number = symval->number =
(symval->number < symbol->number) ? symval->number : symbol->number;
}
this->number = this->alias->number = 0;
else
{
- assert (this->alias->number != NUMBER_UNDEFINED);
+ if (this->alias->number == NUMBER_UNDEFINED)
+ abort ();
this->number = this->alias->number;
}
}
}
else /* this->class == token_sym */
{
- assert (this->number != NUMBER_UNDEFINED);
+ if (this->number == NUMBER_UNDEFINED)
+ abort ();
}
symbols[this->number] = this;
static struct hash_table *symbol_table = NULL;
static bool
-hash_compare_symbol_t (const symbol_t *m1, const symbol_t *m2)
+hash_compare_symbol (const symbol_t *m1, const symbol_t *m2)
{
- return strcmp (m1->tag, m2->tag) == 0;
+ /* Since tags are unique, we can compare the pointers themselves. */
+ return STRUNIQ_EQ (m1->tag, m2->tag);
}
static unsigned int
-hash_symbol_t (const symbol_t *m, unsigned int tablesize)
+hash_symbol (const symbol_t *m, unsigned int tablesize)
{
- return hash_string (m->tag, tablesize);
+ /* Since tags are unique, we can hash the pointer itself. */
+ return ((size_t) m->tag) % tablesize;
}
{
symbol_table = hash_initialize (HT_INITIAL_CAPACITY,
NULL,
- (Hash_hasher) hash_symbol_t,
- (Hash_comparator) hash_compare_symbol_t,
+ (Hash_hasher) hash_symbol,
+ (Hash_comparator) hash_compare_symbol,
(Hash_data_freer) symbol_free);
}
symbol_t *entry;
/* Keep the symbol in a printable form. */
- key = quotearg_style (escape_quoting_style, key);
+ key = struniq_new (quotearg_style (escape_quoting_style, key));
*(char const **) &probe.tag = key;
entry = hash_lookup (symbol_table, &probe);