aboutsummaryrefslogtreecommitdiffstats
path: root/src/image.c
diff options
context:
space:
mode:
authorPaul Eggert2011-05-30 23:05:00 -0700
committerPaul Eggert2011-05-30 23:05:00 -0700
commit0de4bb688da4961269edab53dc0e0d5a30c01a44 (patch)
tree10e3c4d22f03496bf5b8fc4a41ee04cfcc52e33d /src/image.c
parentb9627cfb1d5b5b0914525a19cd9edb06f91a1665 (diff)
downloademacs-0de4bb688da4961269edab53dc0e0d5a30c01a44.tar.gz
emacs-0de4bb688da4961269edab53dc0e0d5a30c01a44.zip
Remove arbitrary limit of 2**31 entries in hash tables.
* category.c (hash_get_category_set): Use 'EMACS_UINT' and 'EMACS_INT' for hashes and hash indexes, instead of 'unsigned' and 'int'. * ccl.c (ccl_driver): Likewise. * charset.c (Fdefine_charset_internal): Likewise. * charset.h (struct charset.hash_index): Likewise. * composite.c (get_composition_id, gstring_lookup_cache): (composition_gstring_put_cache): Likewise. * composite.h (struct composition.hash_index): Likewise. * dispextern.h (struct image.hash): Likewise. * fns.c (next_almost_prime, larger_vector, cmpfn_eql): (cmpfn_equal, cmpfn_user_defined, hashfn_eq, hashfn_eql): (hashfn_equal, hashfn_user_defined, make_hash_table): (maybe_resize_hash_table, hash_lookup, hash_put): (hash_remove_from_table, hash_clear, sweep_weak_table, SXHASH_COMBINE): (sxhash_string, sxhash_list, sxhash_vector, sxhash_bool_vector): (Fsxhash, Fgethash, Fputhash, Fmaphash): Likewise. * image.c (make_image, search_image_cache, lookup_image): (xpm_put_color_table_h): Likewise. * lisp.h (struct Lisp_Hash_Table): Likewise, for 'count', 'cmpfn', and 'hashfn' members. * minibuf.c (Ftry_completion, Fall_completions, Ftest_completion): Likewise. * print.c (print): Likewise. * alloc.c (allocate_vectorlike): Check for overflow in vector size calculations. * ccl.c (ccl_driver): Check for overflow when converting EMACS_INT to int. * fns.c, image.c: Remove unnecessary static decls that would otherwise need to be updated by these changes. * fns.c (make_hash_table, maybe_resize_hash_table): Check for integer overflow with large hash tables. (make_hash_table, maybe_resize_hash_table, Fmake_hash_table): Prefer the faster XFLOAT_DATA to XFLOATINT where either will do. (SXHASH_REDUCE): New macro. (sxhash_string, sxhash_list, sxhash_vector, sxhash_bool_vector): Use it instead of discarding useful hash info with large hash values. (sxhash_float): New function. (sxhash): Use it. No more need for "& INTMASK" due to above changes. * lisp.h (FIXNUM_BITS): New macro, useful for SXHASH_REDUCE etc. (MOST_NEGATIVE_FIXNUM, MOST_POSITIVE_FIXNUM, INTMASK): Rewrite to use FIXNUM_BITS, as this simplifies things. (next_almost_prime, larger_vector, sxhash, hash_lookup, hash_put): Adjust signatures to match updated version of code. (consing_since_gc): Now EMACS_INT, since a single hash table can use more than INT_MAX bytes.
Diffstat (limited to 'src/image.c')
-rw-r--r--src/image.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/src/image.c b/src/image.c
index 0f269f46492..26542bf27e7 100644
--- a/src/image.c
+++ b/src/image.c
@@ -982,7 +982,6 @@ or omitted means use the selected frame. */)
982 Image type independent image structures 982 Image type independent image structures
983 ***********************************************************************/ 983 ***********************************************************************/
984 984
985static struct image *make_image (Lisp_Object spec, unsigned hash);
986static void free_image (struct frame *f, struct image *img); 985static void free_image (struct frame *f, struct image *img);
987static int check_image_size (struct frame *f, int width, int height); 986static int check_image_size (struct frame *f, int width, int height);
988 987
@@ -991,7 +990,7 @@ static int check_image_size (struct frame *f, int width, int height);
991 SPEC. SPEC has a hash value of HASH. */ 990 SPEC. SPEC has a hash value of HASH. */
992 991
993static struct image * 992static struct image *
994make_image (Lisp_Object spec, unsigned int hash) 993make_image (Lisp_Object spec, EMACS_UINT hash)
995{ 994{
996 struct image *img = (struct image *) xmalloc (sizeof *img); 995 struct image *img = (struct image *) xmalloc (sizeof *img);
997 Lisp_Object file = image_spec_value (spec, QCfile, NULL); 996 Lisp_Object file = image_spec_value (spec, QCfile, NULL);
@@ -1388,7 +1387,6 @@ x_alloc_image_color (struct frame *f, struct image *img, Lisp_Object color_name,
1388 Image Cache 1387 Image Cache
1389 ***********************************************************************/ 1388 ***********************************************************************/
1390 1389
1391static struct image *search_image_cache (struct frame *, Lisp_Object, unsigned);
1392static void cache_image (struct frame *f, struct image *img); 1390static void cache_image (struct frame *f, struct image *img);
1393static void postprocess_image (struct frame *, struct image *); 1391static void postprocess_image (struct frame *, struct image *);
1394 1392
@@ -1414,7 +1412,7 @@ make_image_cache (void)
1414/* Find an image matching SPEC in the cache, and return it. If no 1412/* Find an image matching SPEC in the cache, and return it. If no
1415 image is found, return NULL. */ 1413 image is found, return NULL. */
1416static struct image * 1414static struct image *
1417search_image_cache (struct frame *f, Lisp_Object spec, unsigned int hash) 1415search_image_cache (struct frame *f, Lisp_Object spec, EMACS_UINT hash)
1418{ 1416{
1419 struct image *img; 1417 struct image *img;
1420 struct image_cache *c = FRAME_IMAGE_CACHE (f); 1418 struct image_cache *c = FRAME_IMAGE_CACHE (f);
@@ -1714,7 +1712,7 @@ int
1714lookup_image (struct frame *f, Lisp_Object spec) 1712lookup_image (struct frame *f, Lisp_Object spec)
1715{ 1713{
1716 struct image *img; 1714 struct image *img;
1717 unsigned hash; 1715 EMACS_UINT hash;
1718 EMACS_TIME now; 1716 EMACS_TIME now;
1719 1717
1720 /* F must be a window-system frame, and SPEC must be a valid image 1718 /* F must be a window-system frame, and SPEC must be a valid image
@@ -3751,7 +3749,7 @@ xpm_put_color_table_h (Lisp_Object color_table,
3751 Lisp_Object color) 3749 Lisp_Object color)
3752{ 3750{
3753 struct Lisp_Hash_Table *table = XHASH_TABLE (color_table); 3751 struct Lisp_Hash_Table *table = XHASH_TABLE (color_table);
3754 unsigned hash_code; 3752 EMACS_UINT hash_code;
3755 Lisp_Object chars = make_unibyte_string (chars_start, chars_len); 3753 Lisp_Object chars = make_unibyte_string (chars_start, chars_len);
3756 3754
3757 hash_lookup (table, chars, &hash_code); 3755 hash_lookup (table, chars, &hash_code);