base: use uintptr_t for hash type

Use uintptr_t for hash type; this is consistent with CoreFoundation, which uses
32-bit integers on 32-bit platforms for the hash code, and 64-bit integers on
64-bit platforms. (libheimbase is modelled on CoreFoundation.)

Previously we used unsigned long, which would have the same behavior on
LP32/LP64 systems, but not on Windows (where unsigned long is 32-bits on 64-bit
platforms).
This commit is contained in:
Luke Howard
2022-01-06 17:21:06 +11:00
parent 6b788c2378
commit 97cca6f921
8 changed files with 14 additions and 14 deletions

View File

@@ -61,7 +61,7 @@ data_cmp(void *a, void *b)
return memcmp(osa->data, osb->data, osa->length); return memcmp(osa->data, osb->data, osa->length);
} }
static unsigned long static uintptr_t
data_hash(void *ptr) data_hash(void *ptr)
{ {
heim_octet_string *os = ptr; heim_octet_string *os = ptr;

View File

@@ -149,7 +149,7 @@ heim_dict_get_type_id(void)
static struct hashentry * static struct hashentry *
_search(heim_dict_t dict, heim_object_t ptr) _search(heim_dict_t dict, heim_object_t ptr)
{ {
unsigned long v = heim_get_hash(ptr); uintptr_t v = heim_get_hash(ptr);
struct hashentry *p; struct hashentry *p;
for (p = dict->tab[v % dict->size]; p != NULL; p = p->next) for (p = dict->tab[v % dict->size]; p != NULL; p = p->next)
@@ -219,7 +219,7 @@ heim_dict_set_value(heim_dict_t dict, heim_object_t key, heim_object_t value)
heim_release(h->value); heim_release(h->value);
h->value = heim_retain(value); h->value = heim_retain(value);
} else { } else {
unsigned long v; uintptr_t v;
h = malloc(sizeof(*h)); h = malloc(sizeof(*h));
if (h == NULL) if (h == NULL)

View File

@@ -58,7 +58,7 @@ error_cmp(void *a, void *b)
return heim_cmp(ap->msg, bp->msg); return heim_cmp(ap->msg, bp->msg);
} }
static unsigned long static uintptr_t
error_hash(void *ptr) error_hash(void *ptr)
{ {
struct heim_error *p = ptr; struct heim_error *p = ptr;

View File

@@ -210,13 +210,13 @@ heim_get_tid(heim_object_t ptr)
* @return a hash value * @return a hash value
*/ */
unsigned long uintptr_t
heim_get_hash(heim_object_t ptr) heim_get_hash(heim_object_t ptr)
{ {
heim_type_t isa = _heim_get_isa(ptr); heim_type_t isa = _heim_get_isa(ptr);
if (isa->hash) if (isa->hash)
return isa->hash(ptr); return isa->hash(ptr);
return (unsigned long)ptr; return (uintptr_t)ptr;
} }
/** /**
@@ -609,10 +609,10 @@ autorel_cmp(void *a, void *b)
return (a == b); return (a == b);
} }
static unsigned long static uintptr_t
autorel_hash(void *ptr) autorel_hash(void *ptr)
{ {
return (unsigned long)ptr; return (uintptr_t)ptr;
} }

View File

@@ -184,7 +184,7 @@ heim_get_tid(heim_object_t object);
int int
heim_cmp(heim_object_t a, heim_object_t b); heim_cmp(heim_object_t a, heim_object_t b);
unsigned long uintptr_t
heim_get_hash(heim_object_t ptr); heim_get_hash(heim_object_t ptr);
void void

View File

@@ -42,7 +42,7 @@
typedef void (*heim_type_init)(void *); typedef void (*heim_type_init)(void *);
typedef heim_object_t (*heim_type_copy)(void *); typedef heim_object_t (*heim_type_copy)(void *);
typedef int (*heim_type_cmp)(void *, void *); typedef int (*heim_type_cmp)(void *, void *);
typedef unsigned long (*heim_type_hash)(void *); typedef uintptr_t (*heim_type_hash)(void *);
typedef heim_string_t (*heim_type_description)(void *); typedef heim_string_t (*heim_type_description)(void *);
typedef struct heim_type_data *heim_type_t; typedef struct heim_type_data *heim_type_t;

View File

@@ -58,12 +58,12 @@ number_cmp(void *a, void *b)
return na - nb; return na - nb;
} }
static unsigned long static uintptr_t
number_hash(void *ptr) number_hash(void *ptr)
{ {
if (heim_base_is_tagged_object(ptr)) if (heim_base_is_tagged_object(ptr))
return heim_base_tagged_object_value(ptr); return heim_base_tagged_object_value(ptr);
return (unsigned long)*(int *)ptr; return (uintptr_t)*(int64_t *)ptr;
} }
struct heim_type_data _heim_number_object = { struct heim_type_data _heim_number_object = {

View File

@@ -73,11 +73,11 @@ string_cmp(void *a, void *b)
return strcmp(a, b); return strcmp(a, b);
} }
static unsigned long static uintptr_t
string_hash(void *ptr) string_hash(void *ptr)
{ {
const char *s = ptr; const char *s = ptr;
unsigned long n; uintptr_t n;
for (n = 0; *s; ++s) for (n = 0; *s; ++s)
n += *s; n += *s;