+2015-01-11 Doug Evans <xdje42@gmail.com>
+
+ * symtab.c (eq_symbol_entry): Use SYMBOL_SEARCH_NAME and
+ symbol_matches_domain for symbol comparisons.
+
2015-01-11 Doug Evans <xdje42@gmail.com>
* symtab.c (symbol_cache_mark_found): Improve function comment.
}
else
{
- slot_name = SYMBOL_LINKAGE_NAME (slot->value.found);
+ slot_name = SYMBOL_SEARCH_NAME (slot->value.found);
slot_domain = SYMBOL_DOMAIN (slot->value.found);
}
/* NULL names match. */
if (slot_name == NULL && name == NULL)
- ;
- else if (slot_name != NULL && name != NULL)
{
- if (strcmp (slot_name, name) != 0)
+ /* But there's no point in calling symbol_matches_domain in the
+ SYMBOL_SLOT_FOUND case. */
+ if (slot_domain != domain)
return 0;
}
+ else if (slot_name != NULL && name != NULL)
+ {
+ /* It's important that we use the same comparison that was done the
+ first time through. If the slot records a found symbol, then this
+ means using strcmp_iw on SYMBOL_SEARCH_NAME. See dictionary.c.
+ It also means using symbol_matches_domain for found symbols.
+ See block.c.
+
+ If the slot records a not-found symbol, then require a precise match.
+ We could still be lax with whitespace like strcmp_iw though. */
+
+ if (slot->state == SYMBOL_SLOT_NOT_FOUND)
+ {
+ if (strcmp (slot_name, name) != 0)
+ return 0;
+ if (slot_domain != domain)
+ return 0;
+ }
+ else
+ {
+ struct symbol *sym = slot->value.found;
+
+ if (strcmp_iw (slot_name, name) != 0)
+ return 0;
+ if (!symbol_matches_domain (SYMBOL_LANGUAGE (sym),
+ slot_domain, domain))
+ return 0;
+ }
+ }
else
{
/* Only one name is NULL. */
return 0;
}
- if (slot_domain != domain)
- return 0;
-
return 1;
}