comparison src/specifier.c @ 5191:71ee43b8a74d

Add #'equalp as a hash test by default; add #'define-hash-table-test, GNU API tests/ChangeLog addition: 2010-04-05 Aidan Kehoe <kehoea@parhasard.net> * automated/hash-table-tests.el: Test the new built-in #'equalp hash table test. Test #'define-hash-table-test. * automated/lisp-tests.el: When asserting that two objects are #'equalp, also assert that their #'equalp-hash is identical. man/ChangeLog addition: 2010-04-03 Aidan Kehoe <kehoea@parhasard.net> * lispref/hash-tables.texi (Introduction to Hash Tables): Document that we now support #'equalp as a hash table test by default, and mention #'define-hash-table-test. (Working With Hash Tables): Document #'define-hash-table-test. src/ChangeLog addition: 2010-04-05 Aidan Kehoe <kehoea@parhasard.net> * elhash.h: * elhash.c (struct Hash_Table_Test, lisp_object_eql_equal) (lisp_object_eql_hash, lisp_object_equal_equal) (lisp_object_equal_hash, lisp_object_equalp_hash) (lisp_object_equalp_equal, lisp_object_general_hash) (lisp_object_general_equal, Feq_hash, Feql_hash, Fequal_hash) (Fequalp_hash, define_hash_table_test, Fdefine_hash_table_test) (init_elhash_once_early, mark_hash_table_tests, string_equalp_hash): * glyphs.c (vars_of_glyphs): Add a new hash table test in C, #'equalp. Make it possible to specify new hash table tests with functions define_hash_table_test, #'define-hash-table-test. Use define_hash_table_test() in glyphs.c. Expose the hash functions (besides that used for #'equal) to Lisp, for people writing functions to be used with #'define-hash-table-test. Call define_hash_table_test() very early in temacs, to create the built-in hash table tests. * ui-gtk.c (emacs_gtk_boxed_hash): * specifier.h (struct specifier_methods): * specifier.c (specifier_hash): * rangetab.c (range_table_entry_hash, range_table_hash): * number.c (bignum_hash, ratio_hash, bigfloat_hash): * marker.c (marker_hash): * lrecord.h (struct lrecord_implementation): * keymap.c (keymap_hash): * gui.c (gui_item_id_hash, gui_item_hash): * glyphs.c (image_instance_hash, glyph_hash): * glyphs-x.c (x_image_instance_hash): * glyphs-msw.c (mswindows_image_instance_hash): * glyphs-gtk.c (gtk_image_instance_hash): * frame-msw.c (mswindows_set_title_from_ibyte): * fontcolor.c (color_instance_hash, font_instance_hash): * fontcolor-x.c (x_color_instance_hash): * fontcolor-tty.c (tty_color_instance_hash): * fontcolor-msw.c (mswindows_color_instance_hash): * fontcolor-gtk.c (gtk_color_instance_hash): * fns.c (bit_vector_hash): * floatfns.c (float_hash): * faces.c (face_hash): * extents.c (extent_hash): * events.c (event_hash): * data.c (weak_list_hash, weak_box_hash): * chartab.c (char_table_entry_hash, char_table_hash): * bytecode.c (compiled_function_hash): * alloc.c (vector_hash): Change the various object hash methods to take a new EQUALP parameter, hashing appropriately for #'equalp if it is true.
author Aidan Kehoe <kehoea@parhasard.net>
date Mon, 05 Apr 2010 13:03:35 +0100
parents 14fda1dbdb26
children bc3ede8f29a8
comparison
equal deleted inserted replaced
5190:1c1d8843de5e 5191:71ee43b8a74d
346 Vinhibit_quit = old_inhibit_quit; 346 Vinhibit_quit = old_inhibit_quit;
347 return retval; 347 return retval;
348 } 348 }
349 349
350 static Hashcode 350 static Hashcode
351 specifier_hash (Lisp_Object obj, int depth) 351 specifier_hash (Lisp_Object obj, int depth, Boolint equalp)
352 { 352 {
353 Lisp_Specifier *s = XSPECIFIER (obj); 353 Lisp_Specifier *s = XSPECIFIER (obj);
354 354
355 /* specifier hashing is a bit problematic because there are so 355 /* specifier hashing is a bit problematic because there are so
356 many places where data can be stored. We pick what are perhaps 356 many places where data can be stored. We pick what are perhaps
357 the most likely places where interesting stuff will be. */ 357 the most likely places where interesting stuff will be. */
358 return HASH5 ((HAS_SPECMETH_P (s, hash) ? 358 return HASH5 ((HAS_SPECMETH_P (s, hash) ?
359 SPECMETH (s, hash, (obj, depth)) : 0), 359 SPECMETH (s, hash, (obj, depth, equalp)) : 0),
360 (Hashcode) s->methods, 360 (Hashcode) s->methods,
361 internal_hash (s->global_specs, depth + 1), 361 internal_hash (s->global_specs, depth + 1, equalp),
362 internal_hash (s->frame_specs, depth + 1), 362 internal_hash (s->frame_specs, depth + 1, equalp),
363 internal_hash (s->buffer_specs, depth + 1)); 363 internal_hash (s->buffer_specs, depth + 1, equalp));
364 } 364 }
365 365
366 inline static Bytecount 366 inline static Bytecount
367 aligned_sizeof_specifier (Bytecount specifier_type_specific_size) 367 aligned_sizeof_specifier (Bytecount specifier_type_specific_size)
368 { 368 {
3910 3910
3911 Vunlock_ghost_specifiers = Qnil; 3911 Vunlock_ghost_specifiers = Qnil;
3912 staticpro (&Vunlock_ghost_specifiers); 3912 staticpro (&Vunlock_ghost_specifiers);
3913 3913
3914 Vcharset_tag_lists = 3914 Vcharset_tag_lists =
3915 make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, HASH_TABLE_EQ); 3915 make_lisp_hash_table (50, HASH_TABLE_NON_WEAK, Qeq);
3916 staticpro (&Vcharset_tag_lists); 3916 staticpro (&Vcharset_tag_lists);
3917 } 3917 }