diff options
| author | Paul Eggert | 2011-05-30 23:05:00 -0700 |
|---|---|---|
| committer | Paul Eggert | 2011-05-30 23:05:00 -0700 |
| commit | 0de4bb688da4961269edab53dc0e0d5a30c01a44 (patch) | |
| tree | 10e3c4d22f03496bf5b8fc4a41ee04cfcc52e33d /src/image.c | |
| parent | b9627cfb1d5b5b0914525a19cd9edb06f91a1665 (diff) | |
| download | emacs-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.c | 10 |
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 | ||
| 985 | static struct image *make_image (Lisp_Object spec, unsigned hash); | ||
| 986 | static void free_image (struct frame *f, struct image *img); | 985 | static void free_image (struct frame *f, struct image *img); |
| 987 | static int check_image_size (struct frame *f, int width, int height); | 986 | static 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 | ||
| 993 | static struct image * | 992 | static struct image * |
| 994 | make_image (Lisp_Object spec, unsigned int hash) | 993 | make_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 | ||
| 1391 | static struct image *search_image_cache (struct frame *, Lisp_Object, unsigned); | ||
| 1392 | static void cache_image (struct frame *f, struct image *img); | 1390 | static void cache_image (struct frame *f, struct image *img); |
| 1393 | static void postprocess_image (struct frame *, struct image *); | 1391 | static 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. */ |
| 1416 | static struct image * | 1414 | static struct image * |
| 1417 | search_image_cache (struct frame *f, Lisp_Object spec, unsigned int hash) | 1415 | search_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 | |||
| 1714 | lookup_image (struct frame *f, Lisp_Object spec) | 1712 | lookup_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); |