Work around a bug in GnuTLS 3.7.11 and earlier: when built
statically, its mistakenly exports symbols hash_lookup and
hash_string, which collide with Emacs symbols of the same name,
preventing temacs from linking statically. Problem reported by
Greg A. Woods (Bug#77476).
Because GnuTLS never uses hash_lookup or hash_string this issue
ordinarily doesn’t seem to prevent temacs from linking to GnuTLS
on GNU/Linux, as it’s linked dynamically and the dynamic linker
never needs to resolve references to either symbol. However, I
suppose a clash or bug could occur even with dynamic linking if
Emacs later loads a module that uses either symbol.
Although GnuTLS should be fixed, Emacs should link statically to
current and older GnuTLS versions in the meantime, and it should
avoid potential problems with dynamic linking. Renaming the two
clashing names is an easy way to do this. For consistency with
the new name for hash_lookup, also rename hash_lookup_with_hash
and hash_lookup_get_hash.
* src/fns.c (hash_find_with_hash): Rename from hash_lookup_with_hash.
(hash_find): Rename from hash_lookup.
(hash_find_get_hash): Rename from hash_lookup_get_hash.
(hash_char_array): Rename from hash_string.
All uses changed.
(cherry picked from commit
c8eed90eb4d0583dc3463edfad176b9d3f98d11f)
}
else
{
- ptrdiff_t i = hash_lookup (h, v1);
+ ptrdiff_t i = hash_find (h, v1);
if (i >= 0)
{
op = XFIXNUM (HASH_VALUE (h, i));
make_hash_table (&hashtest_equal, DEFAULT_HASH_SIZE, Weak_None));
struct Lisp_Hash_Table *h = XHASH_TABLE (XCHAR_TABLE (table)->extras[1]);
hash_hash_t hash;
- ptrdiff_t i = hash_lookup_get_hash (h, category_set, &hash);
+ ptrdiff_t i = hash_find_get_hash (h, category_set, &hash);
if (i >= 0)
return HASH_KEY (h, i);
hash_put (h, category_set, Qnil, hash);
eop = (FIXNUM_OVERFLOW_P (reg[RRR])
? -1
- : hash_lookup (h, make_fixnum (reg[RRR])));
+ : hash_find (h, make_fixnum (reg[RRR])));
if (eop >= 0)
{
Lisp_Object opl;
eop = (FIXNUM_OVERFLOW_P (i)
? -1
- : hash_lookup (h, make_fixnum (i)));
+ : hash_find (h, make_fixnum (i)));
if (eop >= 0)
{
Lisp_Object opl;
hash_hash_t hash_code;
ptrdiff_t hash_index
- = hash_lookup_get_hash (hash_table, args[charset_arg_name],
- &hash_code);
+ = hash_find_get_hash (hash_table, args[charset_arg_name], &hash_code);
if (hash_index >= 0)
{
new_definition_p = false;
/* Return an index to Vcharset_hash_table of the charset whose symbol
is SYMBOL. */
#define CHARSET_SYMBOL_HASH_INDEX(symbol) \
- hash_lookup (XHASH_TABLE (Vcharset_hash_table), symbol)
+ hash_find (XHASH_TABLE (Vcharset_hash_table), symbol)
/* Return the attribute vector of CHARSET. */
#define CHARSET_ATTRIBUTES(charset) (charset)->attributes
/* Return the ID of CODING_SYSTEM_SYMBOL. */
#define CODING_SYSTEM_ID(coding_system_symbol) \
- hash_lookup (XHASH_TABLE (Vcoding_system_hash_table), \
+ hash_find (XHASH_TABLE (Vcoding_system_hash_table), \
coding_system_symbol)
/* Return true if CODING_SYSTEM_SYMBOL is a coding system. */
goto invalid_composition;
hash_hash_t hash_code;
- hash_index = hash_lookup_get_hash (hash_table, key, &hash_code);
+ hash_index = hash_find_get_hash (hash_table, key, &hash_code);
if (hash_index >= 0)
{
/* We have already registered the same composition. Change PROP
module_global_reference_p (emacs_value v, ptrdiff_t *n)
{
struct Lisp_Hash_Table *h = XHASH_TABLE (Vmodule_refs_hash);
- /* Note that we can't use `hash_lookup' because V might be a local
+ /* Note that we can't use `hash_find' because V might be a local
reference that's identical to some global reference. */
DOHASH (h, k, val)
if (&XMODULE_GLOBAL_REFERENCE (val)->value == v)
struct Lisp_Hash_Table *h = XHASH_TABLE (Vmodule_refs_hash);
Lisp_Object new_obj = value_to_lisp (value);
hash_hash_t hashcode;
- ptrdiff_t i = hash_lookup_get_hash (h, new_obj, &hashcode);
+ ptrdiff_t i = hash_find_get_hash (h, new_obj, &hashcode);
/* Note: This approach requires the garbage collector to never move
objects. */
MODULE_FUNCTION_BEGIN ();
struct Lisp_Hash_Table *h = XHASH_TABLE (Vmodule_refs_hash);
Lisp_Object obj = value_to_lisp (global_value);
- ptrdiff_t i = hash_lookup (h, obj);
+ ptrdiff_t i = hash_find (h, obj);
if (module_assertions)
{
return internal_equal (o1, o2, EQUAL_NO_QUIT, 0, Qnil);
}
-static ptrdiff_t hash_lookup_with_hash (struct Lisp_Hash_Table *h,
- Lisp_Object key, hash_hash_t hash);
+static ptrdiff_t hash_find_with_hash (struct Lisp_Hash_Table *h,
+ Lisp_Object key, hash_hash_t hash);
/* Return true if O1 and O2 are equal. EQUAL_KIND specifies what kind
{
struct Lisp_Hash_Table *h = XHASH_TABLE (*ht);
hash_hash_t hash = hash_from_key (h, o1);
- ptrdiff_t i = hash_lookup_with_hash (h, o1, hash);
+ ptrdiff_t i = hash_find_with_hash (h, o1, hash);
if (i >= 0)
{ /* `o1' was seen already. */
Lisp_Object o2s = HASH_VALUE (h, i);
/* Look up KEY with hash HASH in table H.
Return entry index or -1 if none. */
static ptrdiff_t
-hash_lookup_with_hash (struct Lisp_Hash_Table *h,
- Lisp_Object key, hash_hash_t hash)
+hash_find_with_hash (struct Lisp_Hash_Table *h,
+ Lisp_Object key, hash_hash_t hash)
{
ptrdiff_t start_of_bucket = hash_index_index (h, hash);
for (ptrdiff_t i = HASH_INDEX (h, start_of_bucket);
/* Look up KEY in table H. Return entry index or -1 if none. */
ptrdiff_t
-hash_lookup (struct Lisp_Hash_Table *h, Lisp_Object key)
+hash_find (struct Lisp_Hash_Table *h, Lisp_Object key)
{
- return hash_lookup_with_hash (h, key, hash_from_key (h, key));
+ return hash_find_with_hash (h, key, hash_from_key (h, key));
}
/* Look up KEY in hash table H. Return its hash value in *PHASH.
Value is the index of the entry in H matching KEY, or -1 if not found. */
ptrdiff_t
-hash_lookup_get_hash (struct Lisp_Hash_Table *h, Lisp_Object key,
- hash_hash_t *phash)
+hash_find_get_hash (struct Lisp_Hash_Table *h, Lisp_Object key,
+ hash_hash_t *phash)
{
EMACS_UINT hash = hash_from_key (h, key);
*phash = hash;
- return hash_lookup_with_hash (h, key, hash);
+ return hash_find_with_hash (h, key, hash);
}
static void
can be any EMACS_UINT value. */
EMACS_UINT
-hash_string (char const *ptr, ptrdiff_t len)
+hash_char_array (char const *ptr, ptrdiff_t len)
{
char const *p = ptr;
char const *end = ptr + len;
return XHASH (obj);
case Lisp_String:
- return hash_string (SSDATA (obj), SBYTES (obj));
+ return hash_char_array (SSDATA (obj), SBYTES (obj));
case Lisp_Vectorlike:
{
(Lisp_Object key, Lisp_Object table, Lisp_Object dflt)
{
struct Lisp_Hash_Table *h = check_hash_table (table);
- ptrdiff_t i = hash_lookup (h, key);
+ ptrdiff_t i = hash_find (h, key);
return i >= 0 ? HASH_VALUE (h, i) : dflt;
}
check_mutable_hash_table (table, h);
EMACS_UINT hash = hash_from_key (h, key);
- ptrdiff_t i = hash_lookup_with_hash (h, key, hash);
+ ptrdiff_t i = hash_find_with_hash (h, key, hash);
if (i >= 0)
set_hash_value_slot (h, i, value);
else
static int
xpm_color_bucket (char *color_name)
{
- EMACS_UINT hash = hash_string (color_name, strlen (color_name));
+ EMACS_UINT hash = hash_char_array (color_name, strlen (color_name));
return hash % XPM_COLOR_CACHE_BUCKETS;
}
Lisp_Object chars = make_unibyte_string (chars_start, chars_len);
hash_hash_t hash_code;
- hash_lookup_get_hash (table, chars, &hash_code);
+ hash_find_get_hash (table, chars, &hash_code);
hash_put (table, chars, color, hash_code);
}
{
struct Lisp_Hash_Table *table = XHASH_TABLE (color_table);
ptrdiff_t i =
- hash_lookup (table, make_unibyte_string (chars_start, chars_len));
+ hash_find (table, make_unibyte_string (chars_start, chars_len));
return i >= 0 ? HASH_VALUE (table, i) : Qnil;
}
hash_hash_t hash;
Lisp_Object key = parser->object_workspace[i];
Lisp_Object value = parser->object_workspace[i + 1];
- ptrdiff_t i = hash_lookup_get_hash (h, key, &hash);
+ ptrdiff_t i = hash_find_get_hash (h, key, &hash);
if (i < 0)
hash_put (h, key, value, hash);
else
extern bool sweep_weak_table (struct Lisp_Hash_Table *, bool);
extern void hexbuf_digest (char *, void const *, int);
extern char *extract_data_from_object (Lisp_Object, ptrdiff_t *, ptrdiff_t *);
-EMACS_UINT hash_string (char const *, ptrdiff_t);
+EMACS_UINT hash_char_array (char const *, ptrdiff_t);
EMACS_UINT sxhash (Lisp_Object);
Lisp_Object make_hash_table (const struct hash_table_test *, EMACS_INT,
hash_table_weakness_t);
Lisp_Object hash_table_weakness_symbol (hash_table_weakness_t weak);
-ptrdiff_t hash_lookup (struct Lisp_Hash_Table *, Lisp_Object);
-ptrdiff_t hash_lookup_get_hash (struct Lisp_Hash_Table *h, Lisp_Object key,
- hash_hash_t *phash);
+ptrdiff_t hash_find (struct Lisp_Hash_Table *, Lisp_Object);
+ptrdiff_t hash_find_get_hash (struct Lisp_Hash_Table *h, Lisp_Object key,
+ hash_hash_t *phash);
ptrdiff_t hash_put (struct Lisp_Hash_Table *, Lisp_Object, Lisp_Object,
hash_hash_t);
void hash_remove_from_table (struct Lisp_Hash_Table *, Lisp_Object);
= XHASH_TABLE (read_objects_map);
Lisp_Object number = make_fixnum (n);
hash_hash_t hash;
- ptrdiff_t i = hash_lookup_get_hash (h, number, &hash);
+ ptrdiff_t i = hash_find_get_hash (h, number, &hash);
if (i >= 0)
/* Not normal, but input could be malformed. */
set_hash_value_slot (h, i, placeholder);
/* #N# -- reference to numbered object */
struct Lisp_Hash_Table *h
= XHASH_TABLE (read_objects_map);
- ptrdiff_t i = hash_lookup (h, make_fixnum (n));
+ ptrdiff_t i = hash_find (h, make_fixnum (n));
if (i < 0)
INVALID_SYNTAX_WITH_BUFFER ();
obj = HASH_VALUE (h, i);
struct Lisp_Hash_Table *h2
= XHASH_TABLE (read_objects_completed);
hash_hash_t hash;
- ptrdiff_t i = hash_lookup_get_hash (h2, placeholder, &hash);
+ ptrdiff_t i = hash_find_get_hash (h2, placeholder, &hash);
eassert (i < 0);
hash_put (h2, placeholder, Qnil, hash);
obj = placeholder;
struct Lisp_Hash_Table *h2
= XHASH_TABLE (read_objects_completed);
hash_hash_t hash;
- ptrdiff_t i = hash_lookup_get_hash (h2, obj, &hash);
+ ptrdiff_t i = hash_find_get_hash (h2, obj, &hash);
eassert (i < 0);
hash_put (h2, obj, Qnil, hash);
}
/* ...and #n# will use the real value from now on. */
struct Lisp_Hash_Table *h = XHASH_TABLE (read_objects_map);
hash_hash_t hash;
- ptrdiff_t i = hash_lookup_get_hash (h, e->u.numbered.number,
- &hash);
+ ptrdiff_t i = hash_find_get_hash (h, e->u.numbered.number,
+ &hash);
eassert (i >= 0);
set_hash_value_slot (h, i, obj);
}
by #n=, which means that we can find it as a value in
COMPLETED. */
if (EQ (subst->completed, Qt)
- || hash_lookup (XHASH_TABLE (subst->completed), subtree) >= 0)
+ || hash_find (XHASH_TABLE (subst->completed), subtree) >= 0)
subst->seen = Fcons (subtree, subst->seen);
/* Recurse according to subtree's type.
static ptrdiff_t
obarray_index (struct Lisp_Obarray *oa, const char *str, ptrdiff_t size_byte)
{
- EMACS_UINT hash = hash_string (str, size_byte);
+ EMACS_UINT hash = hash_char_array (str, size_byte);
return knuth_hash (reduce_emacs_uint_to_hash_hash (hash), oa->size_bits);
}
if (HASH_TABLE_P (macfont_family_cache))
{
struct Lisp_Hash_Table *h = XHASH_TABLE (macfont_family_cache);
- ptrdiff_t i = hash_lookup (h, symbol);
+ ptrdiff_t i = hash_find (h, symbol);
if (i >= 0)
{
h = XHASH_TABLE (macfont_family_cache);
hash_hash_t hash;
- i = hash_lookup_get_hash (h, symbol, &hash);
+ i = hash_find_get_hash (h, symbol, &hash);
value = string ? make_mint_ptr ((void *) CFRetain (string)) : Qnil;
if (i >= 0)
{
else if (HASH_TABLE_P (collection))
{
struct Lisp_Hash_Table *h = XHASH_TABLE (collection);
- ptrdiff_t i = hash_lookup (h, string);
+ ptrdiff_t i = hash_find (h, string);
if (i >= 0)
{
tem = HASH_KEY (h, i);