summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2013-02-09 14:42:33 -0800
committerPaul Eggert <eggert@cs.ucla.edu>2013-02-09 14:42:33 -0800
commiteff1c1900f47ec5dfb6d435325b366362d09d2db (patch)
tree9db491fe10a82b95f493b8ae6cdfc3d56103b2fa
parent4dde2087c47f0ef2a97c3b39d89b94b8a47baf37 (diff)
downloademacs-eff1c1900f47ec5dfb6d435325b366362d09d2db.tar.gz
Minor hashing refactoring.
* fns.c (SXHASH_REDUCE): Move to lisp.h. (sxhash_float): Return EMACS_UINT, for consistency with the other hash functions. * lisp.h (INTMASK): Now a macro, since SXHASH_REDUCE is now a non-static inline function and therefore can't use static vars. (SXHASH_REDUCE): Move here from fns.c, and make it inline. * profiler.c (hashfn_profiler): Use SXHASH_REDUCE, to be consistent with the other hash functions.
-rw-r--r--src/ChangeLog12
-rw-r--r--src/fns.c6
-rw-r--r--src/lisp.h10
-rw-r--r--src/profiler.c2
4 files changed, 23 insertions, 7 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index cfe59c2ec88..05d69382855 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,15 @@
+2013-02-09 Paul Eggert <eggert@cs.ucla.edu>
+
+ Minor hashing refactoring.
+ * fns.c (SXHASH_REDUCE): Move to lisp.h.
+ (sxhash_float): Return EMACS_UINT, for consistency with the other
+ hash functions.
+ * lisp.h (INTMASK): Now a macro, since SXHASH_REDUCE is now a
+ non-static inline function and therefore can't use static vars.
+ (SXHASH_REDUCE): Move here from fns.c, and make it inline.
+ * profiler.c (hashfn_profiler): Use SXHASH_REDUCE, to be consistent
+ with the other hash functions.
+
2013-02-09 Eli Zaretskii <eliz@gnu.org>
* callproc.c (Fcall_process_region) [WINDOWSNT]: Make sure the
diff --git a/src/fns.c b/src/fns.c
index ecd1a31335a..527976593da 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -4045,10 +4045,6 @@ sweep_weak_hash_tables (void)
#define SXHASH_MAX_LEN 7
-/* Hash X, returning a value that fits into a Lisp integer. */
-#define SXHASH_REDUCE(X) \
- ((((X) ^ (X) >> (BITS_PER_EMACS_INT - FIXNUM_BITS))) & INTMASK)
-
/* Return a hash for string PTR which has length LEN. The hash value
can be any EMACS_UINT value. */
@@ -4081,7 +4077,7 @@ sxhash_string (char const *ptr, ptrdiff_t len)
/* Return a hash for the floating point value VAL. */
-static EMACS_INT
+static EMACS_UINT
sxhash_float (double val)
{
EMACS_UINT hash = 0;
diff --git a/src/lisp.h b/src/lisp.h
index c15e83bd51c..14db66c6793 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -227,7 +227,7 @@ enum enum_USE_LSB_TAG { USE_LSB_TAG = 0 };
/* Lisp integers use 2 tags, to give them one extra bit, thus
extending their range from, e.g., -2^28..2^28-1 to -2^29..2^29-1. */
-static EMACS_INT const INTMASK = EMACS_INT_MAX >> (INTTYPEBITS - 1);
+#define INTMASK (EMACS_INT_MAX >> (INTTYPEBITS - 1))
#define case_Lisp_Int case Lisp_Int0: case Lisp_Int1
#define LISP_INT_TAG_P(x) (((x) & ~Lisp_Int1) == 0)
@@ -1304,6 +1304,14 @@ sxhash_combine (EMACS_UINT x, EMACS_UINT y)
return (x << 4) + (x >> (BITS_PER_EMACS_INT - 4)) + y;
}
+/* Hash X, returning a value that fits into a fixnum. */
+
+LISP_INLINE EMACS_UINT
+SXHASH_REDUCE (EMACS_UINT x)
+{
+ return (x ^ x >> (BITS_PER_EMACS_INT - FIXNUM_BITS)) & INTMASK;
+}
+
/* These structures are used for various misc types. */
struct Lisp_Misc_Any /* Supertype of all Misc types. */
diff --git a/src/profiler.c b/src/profiler.c
index f6503cf182e..85d9c1ca88a 100644
--- a/src/profiler.c
+++ b/src/profiler.c
@@ -560,7 +560,7 @@ hashfn_profiler (struct hash_table_test *ht, Lisp_Object bt)
? XHASH (XCDR (XCDR (f))) : XHASH (f));
hash = sxhash_combine (hash, hash1);
}
- return (hash & INTMASK);
+ return SXHASH_REDUCE (hash);
}
else
return XHASH (bt);