Mercurial > hg > xemacs-beta
annotate src/syntax.h @ 2720:6fa9919a9a0b
[xemacs-hg @ 2005-04-08 23:10:01 by crestani]
ChangeLog addition:
2005-04-01 Marcus Crestani <crestani@xemacs.org>
The new allocator.
New configure flag: `MC_ALLOC':
* configure.ac (XE_COMPLEX_ARG_ENABLE): Add `--enable-mc-alloc' as
a new configure flag.
* configure.in (AC_INIT_PARSE_ARGS): Add `--mc-alloc' as a new
configure flag.
* configure.usage: Add description for `mc-alloc'.
DUMP_IN_EXEC:
* Makefile.in.in: Condition the installation of a separate dump
file on !DUMP_ON_EXEC.
* configure.ac (XE_COMPLEX_ARG_ENABLE): Add
`--enable-dump-in-exec' as a new configure flag.
* configure.ac: DUMP_IN_EXEC is define as default for PDUMP but
not default for MC_ALLOC.
* configure.in (AC_INIT_PARSE_ARGS): Add `--dump-in-exec' as a
new configure flag.
* configure.in: DUMP_IN_EXEC is define as default for PDUMP but
not default for MC_ALLOC.
* configure.usage: Add description for `dump-in-exec'.
lib-src/ChangeLog addition:
2005-04-01 Marcus Crestani <crestani@xemacs.org>
The new allocator.
DUMP_IN_EXEC:
* Makefile.in.in: Only compile insert-data-in-exec if
DUMP_IN_EXEC is defined.
lisp/ChangeLog addition:
2005-04-01 Marcus Crestani <crestani@xemacs.org>
The new allocator.
MEMORY_USAGE_STATS
* diagnose.el: Add new lisp function to pretty print statistics
about the new allocator.
* diagnose.el (show-mc-alloc-memory-usage): New.
modules/ChangeLog addition:
2005-04-01 Marcus Crestani <crestani@xemacs.org>
The new allocator.
Remove Lcrecords:
* postgresql/postgresql.c (allocate_pgconn): Allocate with new
allocator.
* postgresql/postgresql.c (allocate_pgresult): Allocate PGresult
with new allocator.
* postgresql/postgresql.h (struct Lisp_PGconn): Add
lrecord_header.
* postgresql/postgresql.h (struct Lisp_PGresult): Add
lrecord_header.
* ldap/eldap.c (allocate_ldap): Allocate with new allocator.
* ldap/eldap.h (struct Lisp_LDAP): Add lrecord_header.
nt/ChangeLog addition:
2005-04-01 Marcus Crestani <crestani@xemacs.org>
The new allocator.
New configure flag: `MC_ALLOC':
* config.inc.samp: Add new flag `MC_ALLOC'.
* xemacs.mak: Add flag and configuration output for `MC_ALLOC'.
New files:
* xemacs.dsp: Add source files mc-alloc.c and mc-alloc.h.
* xemacs.mak: Add new object file mc-alloc.obj to dependencies.
src/ChangeLog addition:
2005-04-01 Marcus Crestani <crestani@xemacs.org>
The new allocator.
New configure flag: `MC_ALLOC':
* config.h.in: Add new flag `MC_ALLOC'.
New files:
* Makefile.in.in: Add new object file mc-alloc.o.
* depend: Add new files to dependencies.
* mc-alloc.c: New.
* mc-alloc.h: New.
Running the new allocator from XEmacs:
* alloc.c (deadbeef_memory): Moved to mc-alloc.c.
* emacs.c (main_1): Initialize the new allocator and add
syms_of_mc_alloc.
* symsinit.h: Add syms_of_mc_alloc.
New lrecord allocation and free functions:
* alloc.c (alloc_lrecord): New. Allocates an lrecord, includes
type checking and initializing of the lrecord_header.
* alloc.c (noseeum_alloc_lrecord): Same as above, but increments
the NOSEEUM cons counter.
* alloc.c (free_lrecord): New. Calls the finalizer and frees the
lrecord.
* lrecord.h: Add lrecord allocation prototypes and comments.
Remove old lrecord FROB block allocation:
* alloc.c (allocate_lisp_storage): Former function to expand
heap. Not needed anymore, remove.
* alloc.c: Completely remove `Fixed-size type macros'
* alloc.c (release_breathing_space): Remove.
* alloc.c (memory_full): Remove release_breathing_space.
* alloc.c (refill_memory_reserve): Remove.
* alloc.c (TYPE_ALLOC_SIZE): Remove.
* alloc.c (DECLARE_FIXED_TYPE_ALLOC): Remove.
* alloc.c (ALLOCATE_FIXED_TYPE_FROM_BLOCK): Remove.
* alloc.c (ALLOCATE_FIXED_TYPE_1): Remove.
* alloc.c (ALLOCATE_FIXED_TYPE): Remove.
* alloc.c (NOSEEUM_ALLOCATE_FIXED_TYPE): Remove.
* alloc.c (struct Lisp_Free): Remove.
* alloc.c (LRECORD_FREE_P): Remove.
* alloc.c (MARK_LRECORD_AS_FREE): Remove.
* alloc.c (MARK_LRECORD_AS_NOT_FREE): Remove.
* alloc.c (PUT_FIXED_TYPE_ON_FREE_LIST): Remove.
* alloc.c (FREE_FIXED_TYPE): Remove.
* alloc.c (FREE_FIXED_TYPE_WHEN_NOT_IN_GC): Remove.
Allocate old lrecords with new allocator:
* alloc.c: DECLARE_FIXED_TYPE_ALLOC removed for all lrecords
defined in alloc.c.
* alloc.c (Fcons): Allocate with new allocator.
* alloc.c (noseeum_cons): Allocate with new allocator.
* alloc.c (make_float): Allocate with new allocator.
* alloc.c (make_bignum): Allocate with new allocator.
* alloc.c (make_bignum_bg): Allocate with new allocator.
* alloc.c (make_ratio): Allocate with new allocator.
* alloc.c (make_ratio_bg): Allocate with new allocator.
* alloc.c (make_ratio_rt): Allocate with new allocator.
* alloc.c (make_bigfloat): Allocate with new allocator.
* alloc.c (make_bigfloat_bf): Allocate with new allocator.
* alloc.c (make_compiled_function): Allocate with new allocator.
* alloc.c (Fmake_symbol): Allocate with new allocator.
* alloc.c (allocate_extent): Allocate with new allocator.
* alloc.c (allocate_event): Allocate with new allocator.
* alloc.c (make_key_data): Allocate with new allocator.
* alloc.c (make_button_data): Allocate with new allocator.
* alloc.c (make_motion_data): Allocate with new allocator.
* alloc.c (make_process_data): Allocate with new allocator.
* alloc.c (make_timeout_data): Allocate with new allocator.
* alloc.c (make_magic_data): Allocate with new allocator.
* alloc.c (make_magic_eval_data): Allocate with new allocator.
* alloc.c (make_eval_data): Allocate with new allocator.
* alloc.c (make_misc_user_data): Allocate with new allocator.
* alloc.c (Fmake_marker): Allocate with new allocator.
* alloc.c (noseeum_make_marker): Allocate with new allocator.
* alloc.c (make_uninit_string): Allocate with new allocator.
* alloc.c (resize_string): Allocate with new allocator.
* alloc.c (make_string_nocopy): Allocate with new allocator.
Garbage Collection:
* alloc.c (GC_CHECK_NOT_FREE): Remove obsolete assertions.
* alloc.c (SWEEP_FIXED_TYPE_BLOCK): Remove.
* alloc.c (SWEEP_FIXED_TYPE_BLOCK_1): Remove.
* alloc.c (sweep_conses): Remove.
* alloc.c (free_cons): Use new allocator to free.
* alloc.c (sweep_compiled_functions): Remove.
* alloc.c (sweep_floats): Remove.
* alloc.c (sweep_bignums): Remove.
* alloc.c (sweep_ratios): Remove.
* alloc.c (sweep_bigfloats): Remove.
* alloc.c (sweep_symbols): Remove.
* alloc.c (sweep_extents): Remove.
* alloc.c (sweep_events): Remove.
* alloc.c (sweep_key_data): Remove.
* alloc.c (free_key_data): Use new allocator to free.
* alloc.c (sweep_button_data): Remove.
* alloc.c (free_button_data): Use new allocator to free.
* alloc.c (sweep_motion_data): Remove.
* alloc.c (free_motion_data): Use new allocator to free.
* alloc.c (sweep_process_data): Remove.
* alloc.c (free_process_data): Use new allocator to free.
* alloc.c (sweep_timeout_data): Remove.
* alloc.c (free_timeout_data): Use new allocator to free.
* alloc.c (sweep_magic_data): Remove.
* alloc.c (free_magic_data): Use new allocator to free.
* alloc.c (sweep_magic_eval_data): Remove.
* alloc.c (free_magic_eval_data): Use new allocator to free.
* alloc.c (sweep_eval_data): Remove.
* alloc.c (free_eval_data): Use new allocator to free.
* alloc.c (sweep_misc_user_data): Remove.
* alloc.c (free_misc_user_data): Use new allocator to free.
* alloc.c (sweep_markers): Remove.
* alloc.c (free_marker): Use new allocator to free.
* alloc.c (garbage_collect_1): Remove release_breathing_space.
* alloc.c (gc_sweep): Remove all the old lcrecord and lrecord
related stuff. Sweeping now works like this: compact string
chars, finalize, sweep.
* alloc.c (common_init_alloc_early): Remove old lrecord
initializations, remove breathing_space.
* emacs.c (Fdump_emacs): Remove release_breathing_space.
* lisp.h: Remove prototype for release_breathing_space.
* lisp.h: Adjust the special cons mark makros.
Lrecord Finalizer:
* alloc.c: Add finalizer to lrecord definition.
* alloc.c (finalize_string): Add finalizer for string.
* bytecode.c: Add finalizer to lrecord definition.
* bytecode.c (finalize_compiled_function): Add finalizer for
compiled function.
* marker.c: Add finalizer to lrecord definition.
* marker.c (finalize_marker): Add finalizer for marker.
These changes build the interface to mc-alloc:
* lrecord.h (MC_ALLOC_CALL_FINALIZER): Tell mc-alloc how to
finalize lrecords.
* lrecord.h (MC_ALLOC_CALL_FINALIZER_FOR_DISKSAVE): Tell
mc-alloc how to finalize for disksave.
Unify lrecords and lcrecords:
* lisp.h (struct Lisp_String): Adjust string union hack to
new lrecord header.
* lrecord.h: Adjust comments.
* lrecord.h (struct lrecord_header): The new lrecord header
includes type, lisp-readonly, free, and uid.
* lrecord.h (set_lheader_implementation): Adjust to new
lrecord_header.
* lrecord.h (struct lrecord_implementation): The field basic_p
for indication of an old lrecord is not needed anymore, remove.
* lrecord.h (MAKE_LRECORD_IMPLEMENTATION): Remove basic_p.
* lrecord.h (MAKE_EXTERNAL_LRECORD_IMPLEMENTATION): Remove
basic_p.
* lrecord.h (copy_sized_lrecord): Remove distinction between
old lrecords and lcrecords.
* lrecord.h (copy_lrecord): Remove distinction between old
lrecords and lcrecords.
* lrecord.h (zero_sized_lrecord): Remove distinction between
old lrecords and lcrecords.
* lrecord.h (zero_lrecord): Remove distinction between old
lrecords and lcrecords.
Remove lcrecords and lcrecord lists:
* alloc.c (basic_alloc_lcrecord): Not needed anymore, remove.
* alloc.c (very_old_free_lcrecord): Not needed anymore, remove.
* alloc.c (copy_lisp_object): No more distinction between
lrecords and lcrecords.
* alloc.c (all_lcrecords): Not needed anymore, remove.
* alloc.c (make_vector_internal): Allocate as lrecord.
* alloc.c (make_bit_vector_internal): Allocate as lrecord.
* alloc.c: Completely remove `lcrecord lists'.
* alloc.c (free_description): Remove.
* alloc.c (lcrecord_list_description): Remove.
* alloc.c (mark_lcrecord_list): Remove.
* alloc.c (make_lcrecord_list): Remove.
* alloc.c (alloc_managed_lcrecord): Remove.
* alloc.c (free_managed_lcrecord): Remove.
* alloc.c (alloc_automanaged_lcrecord): Remove.
* alloc.c (free_lcrecord): Remove.
* alloc.c (lcrecord_stats): Remove.
* alloc.c (tick_lcrecord_stats): Remove.
* alloc.c (disksave_object_finalization_1): Add call to
mc_finalize_for_disksave. Remove the lcrecord way to visit all
objects.
* alloc.c (kkcc_marking): Remove XD_FLAG_FREE_LISP_OBJECT
* alloc.c (sweep_lcrecords_1): Remove.
* alloc.c (common_init_alloc_early): Remove everything related
to lcrecords, remove old lrecord initializations,
* alloc.c (init_lcrecord_lists): Not needed anymore, remove.
* alloc.c (reinit_alloc_early): Remove everything related to
lcrecords.
* alloc.c (init_alloc_once_early): Remove everything related to
lcrecords.
* buffer.c (allocate_buffer): Allocate as lrecord.
* buffer.c (nuke_all_buffer_slots): Use lrecord functions.
* buffer.c (common_init_complex_vars_of_buffer): Allocate as
lrecord.
* buffer.h (struct buffer): Add lrecord_header.
* casetab.c (allocate_case_table): Allocate as lrecord.
* casetab.h (struct Lisp_Case_Table): Add lrecord_header.
* charset.h (struct Lisp_Charset): Add lrecord_header.
* chartab.c (fill_char_table): Use lrecord functions.
* chartab.c (Fmake_char_table): Allocate as lrecord.
* chartab.c (make_char_table_entry): Allocate as lrecord.
* chartab.c (copy_char_table_entry): Allocate as lrecord.
* chartab.c (Fcopy_char_table): Allocate as lrecord.
* chartab.c (put_char_table): Use lrecord functions.
* chartab.h (struct Lisp_Char_Table_Entry): Add lrecord_header.
* chartab.h (struct Lisp_Char_Table): Add lrecord_header.
* console-impl.h (struct console): Add lrecord_header.
* console-msw-impl.h (struct Lisp_Devmode): Add lrecord_header.
* console-msw-impl.h (struct mswindows_dialog_id): Add
lrecord_header.
* console.c (allocate_console): Allocate as lrecord.
* console.c (nuke_all_console_slots): Use lrecord functions.
* console.c (common_init_complex_vars_of_console): Allocate as
lrecord.
* data.c (make_weak_list): Allocate as lrecord.
* data.c (make_weak_box): Allocate as lrecord.
* data.c (make_ephemeron): Allocate as lrecord.
* database.c (struct Lisp_Database): Add lrecord_header.
* database.c (allocate_database): Allocate as lrecord.
* device-impl.h (struct device): Add lrecord_header.
* device-msw.c (allocate_devmode): Allocate as lrecord.
* device.c (nuke_all_device_slots): Use lrecord functions.
* device.c (allocate_device): Allocate as lrecord.
* dialog-msw.c (handle_question_dialog_box): Allocate as lrecord.
* elhash.c (struct Lisp_Hash_Table): Add lrecord_header.
* elhash.c (make_general_lisp_hash_table): Allocate as lrecord.
* elhash.c (Fcopy_hash_table): Allocate as lrecord.
* event-stream.c: Lcrecord lists Vcommand_builder_free_list and
Vtimeout_free_list are no longer needed. Remove.
* event-stream.c (allocate_command_builder): Allocate as lrecord.
* event-stream.c (free_command_builder): Use lrecord functions.
* event-stream.c (event_stream_generate_wakeup): Allocate as
lrecord.
* event-stream.c (event_stream_resignal_wakeup): Use lrecord
functions.
* event-stream.c (event_stream_disable_wakeup): Use lrecord
functions.
* event-stream.c (reinit_vars_of_event_stream): Lcrecord lists
remove.
* events.h (struct Lisp_Timeout): Add lrecord_header.
* events.h (struct command_builder): Add lrecord_header.
* extents-impl.h (struct extent_auxiliary): Add lrecord_header.
* extents-impl.h (struct extent_info): Add lrecord_header.
* extents.c (allocate_extent_auxiliary): Allocate as lrecord.
* extents.c (allocate_extent_info): Allocate as lrecord.
* extents.c (copy_extent): Allocate as lrecord.
* faces.c (allocate_face): Allocate as lrecord.
* faces.h (struct Lisp_Face): Add lrecord_header.
* file-coding.c (allocate_coding_system): Allocate as lrecord.
* file-coding.c (Fcopy_coding_system): Allocate as lrecord.
* file-coding.h (struct Lisp_Coding_System): Add lrecord_header.
* fns.c (Ffillarray): Allocate as lrecord.
* frame-impl.h (struct frame): Add lrecord_header.
* frame.c (nuke_all_frame_slots): Use lrecord functions.
* frame.c (allocate_frame_core): Allocate as lrecord.
* glyphs.c (allocate_image_instance): Allocate as lrecord.
* glyphs.c (Fcolorize_image_instance): Allocate as lrecord.
* glyphs.c (allocate_glyph): Allocate as lrecord.
* glyphs.h (struct Lisp_Image_Instance): Add lrecord_header.
* glyphs.h (struct Lisp_Glyph): Add lrecord_header.
* gui.c (allocate_gui_item): Allocate as lrecord.
* gui.h (struct Lisp_Gui_Item): Add lrecord_header.
* keymap.c (struct Lisp_Keymap): Add lrecord_header.
* keymap.c (make_keymap): Allocate as lrecord.
* lisp.h (struct Lisp_Vector): Add lrecord_header.
* lisp.h (struct Lisp_Bit_Vector): Add lrecord_header.
* lisp.h (struct weak_box): Add lrecord_header.
* lisp.h (struct ephemeron): Add lrecord_header.
* lisp.h (struct weak_list): Add lrecord_header.
* lrecord.h (struct lcrecord_header): Not used, remove.
* lrecord.h (struct free_lcrecord_header): Not used, remove.
* lrecord.h (struct lcrecord_list): Not needed anymore, remove.
* lrecord.h (lcrecord_list): Not needed anymore, remove.
* lrecord.h: (enum data_description_entry_flags): Remove
XD_FLAG_FREE_LISP_OBJECT.
* lstream.c: Lrecord list Vlstream_free_list remove.
* lstream.c (Lstream_new): Allocate as lrecord.
* lstream.c (Lstream_delete): Use lrecod functions.
* lstream.c (reinit_vars_of_lstream): Vlstream_free_list
initialization remove.
* lstream.h (struct lstream): Add lrecord_header.
* emacs.c (main_1): Remove lstream initialization.
* mule-charset.c (make_charset): Allocate as lrecord.
* objects-impl.h (struct Lisp_Color_Instance): Add
lrecord_header.
* objects-impl.h (struct Lisp_Font_Instance): Add lrecord_header.
* objects.c (Fmake_color_instance): Allocate as lrecord.
* objects.c (Fmake_font_instance): Allocate as lrecord.
* objects.c (reinit_vars_of_objects): Allocate as lrecord.
* opaque.c: Lcreord list Vopaque_ptr_list remove.
* opaque.c (make_opaque): Allocate as lrecord.
* opaque.c (make_opaque_ptr): Allocate as lrecord.
* opaque.c (free_opaque_ptr): Use lrecord functions.
* opaque.c (reinit_opaque_early):
* opaque.c (init_opaque_once_early): Vopaque_ptr_list
initialization remove.
* opaque.h (Lisp_Opaque): Add lrecord_header.
* opaque.h (Lisp_Opaque_Ptr): Add lrecord_header.
* emacs.c (main_1): Remove opaque variable initialization.
* print.c (default_object_printer): Use new lrecord_header.
* print.c (print_internal): Use new lrecord_header.
* print.c (debug_p4): Use new lrecord_header.
* process.c (make_process_internal): Allocate as lrecord.
* procimpl.h (struct Lisp_Process): Add lrecord_header.
* rangetab.c (Fmake_range_table): Allocate as lrecord.
* rangetab.c (Fcopy_range_table): Allocate as lrecord.
* rangetab.h (struct Lisp_Range_Table): Add lrecord_header.
* scrollbar.c (create_scrollbar_instance): Allocate as lrecord.
* scrollbar.h (struct scrollbar_instance): Add lrecord_header.
* specifier.c (make_specifier_internal): Allocate as lrecord.
* specifier.h (struct Lisp_Specifier): Add lrecord_header.
* symbols.c:
* symbols.c (Fmake_variable_buffer_local): Allocate as lrecord.
* symbols.c (Fdontusethis_set_symbol_value_handler): Allocate
as lrecord.
* symbols.c (Fdefvaralias): Allocate as lrecord.
* symeval.h (struct symbol_value_magic): Add lrecord_header.
* toolbar.c (update_toolbar_button): Allocate as lrecord.
* toolbar.h (struct toolbar_button): Add lrecord_header.
* tooltalk.c (struct Lisp_Tooltalk_Message): Add lrecord_header.
* tooltalk.c (make_tooltalk_message): Allocate as lrecord.
* tooltalk.c (struct Lisp_Tooltalk_Pattern): Add lrecord_header.
* tooltalk.c (make_tooltalk_pattern): Allocate as lrecord.
* ui-gtk.c (allocate_ffi_data): Allocate as lrecord.
* ui-gtk.c (allocate_emacs_gtk_object_data): Allocate as lrecord.
* ui-gtk.c (allocate_emacs_gtk_boxed_data): Allocate as lrecord.
* ui-gtk.h (structs): Add lrecord_header.
* window-impl.h (struct window): Add lrecord_header.
* window-impl.h (struct window_mirror): Add lrecord_header.
* window.c (allocate_window): Allocate as lrecord.
* window.c (new_window_mirror): Allocate as lrecord.
* window.c (make_dummy_parent): Allocate as lrecord.
MEMORY_USAGE_STATS
* alloc.c (fixed_type_block_overhead): Not used anymore, remove.
* buffer.c (compute_buffer_usage): Get storage size from new
allocator.
* marker.c (compute_buffer_marker_usage): Get storage size from
new allocator.
* mule-charset.c (compute_charset_usage): Get storage size from
new allocator.
* scrollbar-gtk.c (gtk_compute_scrollbar_instance_usage): Get
storage size from new allocator.
* scrollbar-msw.c (mswindows_compute_scrollbar_instance_usage):
Get storage size from new allocator.
* scrollbar-x.c (x_compute_scrollbar_instance_usage): Get
storage size from new allocator.
* scrollbar.c (compute_scrollbar_instance_usage): Get storage
size from new allocator.
* unicode.c (compute_from_unicode_table_size_1): Get storage
size from new allocator.
* unicode.c (compute_to_unicode_table_size_1): Get storage size
from new allocator.
* window.c (compute_window_mirror_usage): Get storage size from
new allocator.
* window.c (compute_window_usage): Get storage size from new
allocator.
MC_ALLOC_TYPE_STATS:
* alloc.c (alloc_lrecord): Bump lrecord count.
* alloc.c (noseeum_alloc_lrecord): Bump lrecord count.
* alloc.c (struct lrecord_stats): Storage for counts.
* alloc.c (init_lrecord_stats): Zero statistics.
* alloc.c (inc_lrecord_stats): Increase the statistic.
* alloc.c (dec_lrecord_stats): Decrease the statistic.
* alloc.c (gc_plist_hack): Used to print the information.
* alloc.c (Fgarbage_collect): Return the collected information.
* mc-alloc.c (remove_cell): Decrease lrecord count.
* mc-alloc.h: Set flag MC_ALLOC_TYPE_STATS.
* emacs.c (main_1): Init lrecord statistics.
* lrecord.h: Add prototypes for *_lrecord_stats.
Strings:
* alloc.c (Fmake_string): Initialize ascii_begin to zero.
* alloc.c (gc_count_num_short_string_in_use): Remove.
* alloc.c (gc_count_string_total_size): Remove.
* alloc.c (gc_count_short_string_total_size): Remove.
* alloc.c (debug_string_purity): Remove.
* alloc.c (debug_string_purity_print): Remove.
* alloc.c (sweep_strings): Remove.
Remove static C-readonly Lisp objects:
* alloc.c (c_readonly): Not needed anymore, remove.
* alloc.c (GC_CHECK_LHEADER_INVARIANTS): Remove some obsolete
lheader invariants assertions.
* buffer.c (DEFVAR_BUFFER_LOCAL_1): Allocate dynamically.
* console.c (DEFVAR_CONSOLE_LOCAL_1): Allocate dynamically.
* gpmevent.c: Indirection via MC_ALLOC_Freceive_gpm_event.
* gpmevent.c (Fgpm_enable): Allocate dynamically.
* gpmevent.c (syms_of_gpmevent): Allocate dynamically.
* lisp.h (C_READONLY): Not needed anymore, remove.
* lisp.h (DEFUN): Allocate dynamically.
* lrecord.h (C_READONLY_RECORD_HEADER_P): Not needed anymore,
remove.
* lrecord.h (SET_C_READONLY_RECORD_HEADER): Not needed anymore,
remove.
* symbols.c (guts_of_unbound_marker):
* symeval.h (defsubr): Allocate dynamically.
* symeval.h (DEFSUBR_MACRO): Allocate dynamically.
* symeval.h (DEFVAR_ SYMVAL_FWD): Allocate dynamically.
* tests.c (TESTS_DEFSUBR): Allocate dynamically.
Definition of mcpro:
* lisp.h: Add mcpro prototypes.
* alloc.c (common_init_alloc_early): Add initialization for
mcpros.
* alloc.c (mcpro_description_1): New.
* alloc.c (mcpro_description): New.
* alloc.c (mcpros_description_1): New.
* alloc.c (mcpros_description): New.
* alloc.c (mcpro_one_name_description_1): New.
* alloc.c (mcpro_one_name_description): New.
* alloc.c (mcpro_names_description_1): New.
* alloc.c (mcpro_names_description): New.
* alloc.c (mcpros): New.
* alloc.c (mcpro_names): New.
* alloc.c (mcpro_1): New.
* alloc.c (mc_pro): New.
* alloc.c (garbage_collect_1): Add mcpros to root set.
Usage of mcpro:
* alloc.c (make_string_nocopy): Add string to root set.
* symbols.c (init_symbols_once_early): Add Qunbound to root set.
Changes to the Portable Dumper:
* alloc.c (FREE_OR_REALLOC_BEGIN): Since dumped objects can be
freed with the new allocator, remove assertion for !DUMPEDP.
* dumper.c: Adjust comments, increase PDUMP_HASHSIZE.
* dumper.c (pdump_make_hash): Shift address only 2 bytes, to
avoid collisions.
* dumper.c (pdump_objects_unmark): No more mark bits within
the object, remove.
* dumper.c (mc_addr_elt): New. Element data structure for mc
hash table.
* dumper.c (pdump_mc_hash): New hash table: `lookup table'.
* dumper.c (pdump_get_mc_addr): New. Lookup for hash table.
* dumper.c (pdump_get_indirect_mc_addr): New. Lookup for
convertibles.
* dumper.c (pdump_put_mc_addr): New. Putter for hash table.
* dumper.c (pdump_dump_mc_data): New. Writes the table for
relocation at load time to the dump file.
* dumper.c (pdump_scan_lisp_objects_by_alignment): New.
Visits all dumped Lisp objects.
* dumper.c (pdump_scan_non_lisp_objects_by_alignment): New.
Visits all other dumped objects.
* dumper.c (pdump_reloc_one_mc): New. Updates all pointers
of an object by using the hash table pdump_mc_hash.
* dumper.c (pdump_reloc_one): Replaced by pdump_reloc_one_mc.
* dumper.c (pdump): Change the structure of the dump file, add
the mc post dump relocation table to dump file.
* dumper.c (pdump_load_finish): Hand all dumped objects to the
new allocator and use the mc post dump relocation table for
relocating the dumped objects at dump file load time, free not
longer used data structures.
* dumper.c (pdump_load): Free the dump file.
* dumper.h: Remove pdump_objects_unmark.
* lrecord.h (DUMPEDP): Dumped objects can be freed, remove.
DUMP_IN_EXEC:
* Makefile.in.in: Linking for and with dump in executable only if
DUMP_IN_EXEC is defined.
* config.h.in: Add new flag `DUMP_IN_EXEC'
* emacs.c: Condition dump-data.h on DUMP_IN_EXEC.
* emacs.c (main_1): Flag `-si' only works if dump image is
written into executable.
Miscellanious
* lrecord.h (enum lrecord_type): Added numbers to all types,
very handy for debugging.
* xemacs.def.in.in: Add mc-alloc functions to make them visible
to the modules.
| author | crestani |
|---|---|
| date | Fri, 08 Apr 2005 23:11:35 +0000 |
| parents | 70921960b980 |
| children | 141c2920ea48 |
| rev | line source |
|---|---|
| 428 | 1 /* Declarations having to do with XEmacs syntax tables. |
| 2 Copyright (C) 1985, 1992, 1993 Free Software Foundation, Inc. | |
| 1296 | 3 Copyright (C) 2002, 2003 Ben Wing. |
| 428 | 4 |
| 5 This file is part of XEmacs. | |
| 6 | |
| 7 XEmacs is free software; you can redistribute it and/or modify it | |
| 8 under the terms of the GNU General Public License as published by the | |
| 9 Free Software Foundation; either version 2, or (at your option) any | |
| 10 later version. | |
| 11 | |
| 12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
| 13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| 14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| 15 for more details. | |
| 16 | |
| 17 You should have received a copy of the GNU General Public License | |
| 18 along with XEmacs; see the file COPYING. If not, write to | |
| 19 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
| 20 Boston, MA 02111-1307, USA. */ | |
| 21 | |
| 22 /* Synched up with: FSF 19.28. */ | |
| 23 | |
| 440 | 24 #ifndef INCLUDED_syntax_h_ |
| 25 #define INCLUDED_syntax_h_ | |
| 428 | 26 |
| 27 #include "chartab.h" | |
| 28 | |
| 29 /* A syntax table is a type of char table. | |
| 30 | |
| 31 The low 7 bits of the integer is a code, as follows. The 8th bit is | |
| 32 used as the prefix bit flag (see below). | |
| 33 | |
| 34 The values in a syntax table are either integers or conses of | |
| 35 integers and chars. The lowest 7 bits of the integer are the syntax | |
| 36 class. If this is Sinherit, then the actual syntax value needs to | |
| 37 be retrieved from the standard syntax table. | |
| 38 | |
| 39 Since the logic involved in finding the actual integer isn't very | |
| 40 complex, you'd think the time required to retrieve it is not a | |
| 41 factor. If you thought that, however, you'd be wrong, due to the | |
| 42 high number of times (many per character) that the syntax value is | |
| 43 accessed in functions such as scan_lists(). To speed this up, | |
| 44 we maintain a mirror syntax table that contains the actual | |
| 45 integers. We can do this successfully because syntax tables are | |
| 46 now an abstract type, where we control all access. | |
| 47 */ | |
| 48 | |
| 49 enum syntaxcode | |
| 50 { | |
| 51 Swhitespace, /* whitespace character */ | |
| 52 Spunct, /* random punctuation character */ | |
| 53 Sword, /* word constituent */ | |
| 54 Ssymbol, /* symbol constituent but not word constituent */ | |
| 55 Sopen, /* a beginning delimiter */ | |
| 56 Sclose, /* an ending delimiter */ | |
| 57 Squote, /* a prefix character like Lisp ' */ | |
| 58 Sstring, /* a string-grouping character like Lisp " */ | |
| 59 Smath, /* delimiters like $ in TeX. */ | |
| 60 Sescape, /* a character that begins a C-style escape */ | |
| 61 Scharquote, /* a character that quotes the following character */ | |
| 62 Scomment, /* a comment-starting character */ | |
| 63 Sendcomment, /* a comment-ending character */ | |
| 64 Sinherit, /* use the standard syntax table for this character */ | |
| 460 | 65 Scomment_fence, /* Starts/ends comment which is delimited on the |
| 66 other side by a char with the same syntaxcode. */ | |
| 67 Sstring_fence, /* Starts/ends string which is delimited on the | |
| 68 other side by a char with the same syntaxcode. */ | |
| 428 | 69 Smax /* Upper bound on codes that are meaningful */ |
| 70 }; | |
| 71 | |
| 72 enum syntaxcode charset_syntax (struct buffer *buf, Lisp_Object charset, | |
| 73 int *multi_p_out); | |
| 74 | |
| 1296 | 75 void update_syntax_table (Lisp_Object table); |
| 76 | |
| 77 DECLARE_INLINE_HEADER ( | |
| 78 void | |
| 79 update_mirror_syntax_if_dirty (Lisp_Object table) | |
| 80 ) | |
| 81 { | |
| 82 if (XCHAR_TABLE (table)->dirty) | |
| 83 update_syntax_table (table); | |
| 84 } | |
| 85 | |
| 428 | 86 /* Return the syntax code for a particular character and mirror table. */ |
| 87 | |
| 1296 | 88 DECLARE_INLINE_HEADER ( |
| 1315 | 89 int |
| 1296 | 90 SYNTAX_CODE (Lisp_Object table, Ichar c) |
| 91 ) | |
| 92 { | |
| 93 type_checking_assert (XCHAR_TABLE (table)->mirror_table_p); | |
| 94 update_mirror_syntax_if_dirty (table); | |
| 1315 | 95 return XINT (get_char_table_1 (c, table)); |
| 1296 | 96 } |
| 97 | |
| 98 #ifdef NOT_WORTH_THE_EFFORT | |
| 99 | |
| 100 /* Same but skip the dirty check. */ | |
| 101 | |
| 102 DECLARE_INLINE_HEADER ( | |
| 1315 | 103 int |
| 1296 | 104 SYNTAX_CODE_1 (Lisp_Object table, Ichar c) |
| 105 ) | |
| 106 { | |
| 107 type_checking_assert (XCHAR_TABLE (table)->mirror_table_p); | |
| 108 return (enum syntaxcode) XINT (get_char_table_1 (c, table)); | |
| 109 } | |
| 110 | |
| 111 #endif /* NOT_WORTH_THE_EFFORT */ | |
| 428 | 112 |
| 113 #define SYNTAX_FROM_CODE(code) ((enum syntaxcode) ((code) & 0177)) | |
| 826 | 114 |
| 428 | 115 #define SYNTAX(table, c) SYNTAX_FROM_CODE (SYNTAX_CODE (table, c)) |
| 116 | |
| 826 | 117 DECLARE_INLINE_HEADER ( |
| 118 int | |
| 867 | 119 WORD_SYNTAX_P (Lisp_Object table, Ichar c) |
| 826 | 120 ) |
| 428 | 121 { |
| 122 return SYNTAX (table, c) == Sword; | |
| 123 } | |
| 124 | |
| 125 /* OK, here's a graphic diagram of the format of the syntax values: | |
| 126 | |
| 127 Bit number: | |
| 128 | |
| 129 [ 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 ] | |
| 130 [ 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 ] | |
| 131 | |
| 132 <-----> <-----> <-------------> <-------------> ^ <-----------> | |
| 133 ELisp unused |comment bits | unused | syntax code | |
| 134 tag | | | | | | | | | | |
| 135 stuff | | | | | | | | | | |
| 136 | | | | | | | | | | |
| 137 | | | | | | | | `--> prefix flag | |
| 138 | | | | | | | | | |
| 139 | | | | | | | `--> comment end style B, second char | |
| 140 | | | | | | `----> comment end style A, second char | |
| 141 | | | | | `------> comment end style B, first char | |
| 142 | | | | `--------> comment end style A, first char | |
| 143 | | | `----------> comment start style B, second char | |
| 144 | | `------------> comment start style A, second char | |
| 145 | `--------------> comment start style B, first char | |
| 146 `----------------> comment start style A, first char | |
| 147 | |
| 148 In a 64-bit integer, there would be 32 more unused bits between | |
| 149 the tag and the comment bits. | |
| 150 | |
| 151 Clearly, such a scheme will not work for Mule, because the matching | |
| 152 paren could be any character and as such requires 19 bits, which | |
| 153 we don't got. | |
| 154 | |
| 155 Remember that under Mule we use char tables instead of vectors. | |
| 156 So what we do is use another char table for the matching paren | |
| 157 and store a pointer to it in the first char table. (This frees | |
| 158 code from having to worry about passing two tables around.) | |
| 159 */ | |
| 160 | |
| 161 | |
| 162 /* The prefix flag bit for backward-prefix-chars is now put into bit 7. */ | |
| 163 | |
| 164 #define SYNTAX_PREFIX(table, c) \ | |
| 165 ((SYNTAX_CODE (table, c) >> 7) & 1) | |
| 166 | |
| 167 /* Bits 23-16 are used to implement up to two comment styles | |
| 168 in a single buffer. They have the following meanings: | |
| 169 | |
| 170 1. first of a one or two character comment-start sequence of style a. | |
| 171 2. first of a one or two character comment-start sequence of style b. | |
| 172 3. second of a two-character comment-start sequence of style a. | |
| 173 4. second of a two-character comment-start sequence of style b. | |
| 174 5. first of a one or two character comment-end sequence of style a. | |
| 175 6. first of a one or two character comment-end sequence of style b. | |
| 176 7. second of a two-character comment-end sequence of style a. | |
| 177 8. second of a two-character comment-end sequence of style b. | |
| 178 */ | |
| 179 | |
| 180 #define SYNTAX_COMMENT_BITS(table, c) \ | |
| 181 ((SYNTAX_CODE (table, c) >> 16) &0xff) | |
| 182 | |
| 183 #define SYNTAX_FIRST_OF_START_A 0x80 | |
| 184 #define SYNTAX_FIRST_OF_START_B 0x40 | |
| 185 #define SYNTAX_SECOND_OF_START_A 0x20 | |
| 186 #define SYNTAX_SECOND_OF_START_B 0x10 | |
| 187 #define SYNTAX_FIRST_OF_END_A 0x08 | |
| 188 #define SYNTAX_FIRST_OF_END_B 0x04 | |
| 189 #define SYNTAX_SECOND_OF_END_A 0x02 | |
| 190 #define SYNTAX_SECOND_OF_END_B 0x01 | |
| 191 | |
| 192 #define SYNTAX_COMMENT_STYLE_A 0xaa | |
| 193 #define SYNTAX_COMMENT_STYLE_B 0x55 | |
| 194 #define SYNTAX_FIRST_CHAR_START 0xc0 | |
| 195 #define SYNTAX_FIRST_CHAR_END 0x0c | |
| 196 #define SYNTAX_FIRST_CHAR 0xcc | |
| 197 #define SYNTAX_SECOND_CHAR_START 0x30 | |
| 198 #define SYNTAX_SECOND_CHAR_END 0x03 | |
| 199 #define SYNTAX_SECOND_CHAR 0x33 | |
| 200 | |
| 826 | 201 #if 0 |
| 202 | |
| 203 /* #### Entirely unused. Should they be deleted? */ | |
| 428 | 204 |
| 442 | 205 /* #### These are now more or less equivalent to |
| 206 SYNTAX_COMMENT_MATCH_START ...*/ | |
| 207 /* a and b must be first and second start chars for a common type */ | |
| 208 #define SYNTAX_START_P(table, a, b) \ | |
| 209 (((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_START) >> 2) \ | |
| 210 & (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_START)) | |
| 211 | |
| 212 /* ... and SYNTAX_COMMENT_MATCH_END */ | |
| 213 /* a and b must be first and second end chars for a common type */ | |
| 214 #define SYNTAX_END_P(table, a, b) \ | |
| 215 (((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_END) >> 2) \ | |
| 216 & (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_END)) | |
| 428 | 217 |
| 218 #define SYNTAX_STYLES_MATCH_START_P(table, a, b, mask) \ | |
| 219 ((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_START & (mask)) \ | |
| 220 && (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_START & (mask))) | |
| 221 | |
| 222 #define SYNTAX_STYLES_MATCH_END_P(table, a, b, mask) \ | |
| 223 ((SYNTAX_COMMENT_BITS (table, a) & SYNTAX_FIRST_CHAR_END & (mask)) \ | |
| 224 && (SYNTAX_COMMENT_BITS (table, b) & SYNTAX_SECOND_CHAR_END & (mask))) | |
| 225 | |
| 226 #define SYNTAX_STYLES_MATCH_1CHAR_P(table, a, mask) \ | |
| 227 ((SYNTAX_COMMENT_BITS (table, a) & (mask))) | |
| 228 | |
| 229 #define STYLE_FOUND_P(table, a, b, startp, style) \ | |
| 230 ((SYNTAX_COMMENT_BITS (table, a) & \ | |
| 231 ((startp) ? SYNTAX_FIRST_CHAR_START : \ | |
| 232 SYNTAX_FIRST_CHAR_END) & (style)) \ | |
| 233 && (SYNTAX_COMMENT_BITS (table, b) & \ | |
| 234 ((startp) ? SYNTAX_SECOND_CHAR_START : \ | |
| 235 SYNTAX_SECOND_CHAR_END) & (style))) | |
| 236 | |
| 237 #define SYNTAX_COMMENT_MASK_START(table, a, b) \ | |
| 238 ((STYLE_FOUND_P (table, a, b, 1, SYNTAX_COMMENT_STYLE_A) \ | |
| 239 ? SYNTAX_COMMENT_STYLE_A \ | |
| 240 : (STYLE_FOUND_P (table, a, b, 1, SYNTAX_COMMENT_STYLE_B) \ | |
| 241 ? SYNTAX_COMMENT_STYLE_B \ | |
| 242 : 0))) | |
| 243 | |
| 244 #define SYNTAX_COMMENT_MASK_END(table, a, b) \ | |
| 245 ((STYLE_FOUND_P (table, a, b, 0, SYNTAX_COMMENT_STYLE_A) \ | |
| 246 ? SYNTAX_COMMENT_STYLE_A \ | |
| 247 : (STYLE_FOUND_P (table, a, b, 0, SYNTAX_COMMENT_STYLE_B) \ | |
| 248 ? SYNTAX_COMMENT_STYLE_B \ | |
| 249 : 0))) | |
| 250 | |
| 251 #define STYLE_FOUND_1CHAR_P(table, a, style) \ | |
| 252 ((SYNTAX_COMMENT_BITS (table, a) & (style))) | |
| 253 | |
| 254 #define SYNTAX_COMMENT_1CHAR_MASK(table, a) \ | |
| 255 ((STYLE_FOUND_1CHAR_P (table, a, SYNTAX_COMMENT_STYLE_A) \ | |
| 256 ? SYNTAX_COMMENT_STYLE_A \ | |
| 257 : (STYLE_FOUND_1CHAR_P (table, a, SYNTAX_COMMENT_STYLE_B) \ | |
| 258 ? SYNTAX_COMMENT_STYLE_B \ | |
| 259 : 0))) | |
| 260 | |
| 826 | 261 #endif /* 0 */ |
| 428 | 262 |
| 263 /* This array, indexed by a character, contains the syntax code which | |
| 264 that character signifies (as a char). | |
| 265 For example, (enum syntaxcode) syntax_spec_code['w'] is Sword. */ | |
| 266 | |
| 442 | 267 extern const unsigned char syntax_spec_code[0400]; |
| 428 | 268 |
| 269 /* Indexed by syntax code, give the letter that describes it. */ | |
| 270 | |
| 442 | 271 extern const unsigned char syntax_code_spec[]; |
| 428 | 272 |
| 665 | 273 Lisp_Object scan_lists (struct buffer *buf, Charbpos from, int count, |
| 428 | 274 int depth, int sexpflag, int no_error); |
| 665 | 275 int char_quoted (struct buffer *buf, Charbpos pos); |
| 428 | 276 |
| 277 /* NOTE: This does not refer to the mirror table, but to the | |
| 278 syntax table itself. */ | |
| 867 | 279 Lisp_Object syntax_match (Lisp_Object table, Ichar ch); |
| 428 | 280 |
| 281 extern int no_quit_in_re_search; | |
| 826 | 282 |
| 283 | |
| 284 /****************************** syntax caches ********************************/ | |
| 460 | 285 |
| 286 extern int lookup_syntax_properties; | |
| 287 | |
| 826 | 288 /* Now that the `syntax-table' property exists, and can override the syntax |
| 289 table or directly specify the syntax, we cache the last place we | |
| 290 retrieved the syntax-table property. This is because, when moving | |
| 291 linearly through text (e.g. in the regex routines or the scanning | |
| 292 routines in syntax.c), we only need to recalculate at the next place the | |
| 293 syntax-table property changes (i.e. not every position), and when we do | |
| 294 need to recalculate, we can update the info from the previous info | |
| 295 faster than if we did the whole calculation from scratch. */ | |
| 460 | 296 struct syntax_cache |
| 297 { | |
| 826 | 298 int use_code; /* Whether to use syntax_code or |
| 1296 | 299 syntax_table. This is set |
| 300 depending on whether the | |
| 826 | 301 syntax-table property is a |
| 302 syntax table or a syntax | |
| 303 code. */ | |
| 304 int no_syntax_table_prop; /* If non-zero, there was no | |
| 305 `syntax-table' property on the | |
| 306 current range, and so we're | |
| 307 using the buffer's syntax table. | |
| 308 This is important to note because | |
| 309 sometimes the buffer's syntax | |
| 310 table can be changed. */ | |
| 460 | 311 Lisp_Object object; /* The buffer or string the current |
| 826 | 312 syntax cache applies to, or |
| 313 Qnil for a string of text not | |
| 314 coming from a buffer or string. */ | |
| 315 struct buffer *buffer; /* The buffer that supplies the | |
| 316 syntax tables, or 0 for the | |
| 317 standard syntax table. If | |
| 318 OBJECT is a buffer, this will | |
| 319 always be the same buffer. */ | |
| 460 | 320 int syntax_code; /* Syntax code of current char. */ |
| 1296 | 321 Lisp_Object syntax_table; /* Syntax table for current pos. */ |
| 322 Lisp_Object mirror_table; /* Mirror table for this table. */ | |
| 826 | 323 Lisp_Object start, end; /* Markers to keep track of the |
| 324 known region in a buffer. | |
| 325 Formerly we used an internal | |
| 326 extent, but it seems that having | |
| 327 an extent over the entire buffer | |
| 328 causes serious slowdowns in | |
| 329 extent operations! Yuck! */ | |
| 330 Charxpos next_change; /* Position of the next extent | |
| 460 | 331 change. */ |
| 826 | 332 Charxpos prev_change; /* Position of the previous extent |
| 333 change. */ | |
| 460 | 334 }; |
| 826 | 335 |
| 1296 | 336 extern const struct sized_memory_description syntax_cache_description; |
| 337 | |
| 826 | 338 /* Note that the external interface to the syntax-cache uses charpos's, but |
| 339 intnernally we use bytepos's, for speed. */ | |
| 460 | 340 |
| 826 | 341 void update_syntax_cache (struct syntax_cache *cache, Charxpos pos, int count); |
| 342 struct syntax_cache *setup_syntax_cache (struct syntax_cache *cache, | |
| 343 Lisp_Object object, | |
| 344 struct buffer *buffer, | |
| 345 Charxpos from, int count); | |
| 346 struct syntax_cache *setup_buffer_syntax_cache (struct buffer *buffer, | |
| 347 Charxpos from, int count); | |
| 460 | 348 |
| 349 /* Make syntax cache state good for CHARPOS, assuming it is | |
| 350 currently good for a position before CHARPOS. */ | |
| 826 | 351 DECLARE_INLINE_HEADER ( |
| 352 void | |
| 353 UPDATE_SYNTAX_CACHE_FORWARD (struct syntax_cache *cache, Charxpos pos) | |
| 354 ) | |
| 355 { | |
| 1315 | 356 /* #### Formerly this function, and the next one, had |
| 357 | |
| 358 if (pos < cache->prev_change || pos >= cache->next_change) | |
| 359 | |
| 360 just like for plain UPDATE_SYNTAX_CACHE. However, sometimes the | |
| 361 value of POS may be invalid (particularly, it may be 0 for a buffer). | |
| 362 FSF has the check at only one end, so let's try the same. */ | |
| 363 if (pos >= cache->next_change) | |
| 826 | 364 update_syntax_cache (cache, pos, 1); |
| 365 } | |
| 460 | 366 |
| 367 /* Make syntax cache state good for CHARPOS, assuming it is | |
| 368 currently good for a position after CHARPOS. */ | |
| 826 | 369 DECLARE_INLINE_HEADER ( |
| 370 void | |
| 371 UPDATE_SYNTAX_CACHE_BACKWARD (struct syntax_cache *cache, Charxpos pos) | |
| 372 ) | |
| 373 { | |
| 1315 | 374 if (pos < cache->prev_change) |
| 826 | 375 update_syntax_cache (cache, pos, -1); |
| 376 } | |
| 460 | 377 |
| 378 /* Make syntax cache state good for CHARPOS */ | |
| 826 | 379 DECLARE_INLINE_HEADER ( |
| 380 void | |
| 381 UPDATE_SYNTAX_CACHE (struct syntax_cache *cache, Charxpos pos) | |
| 382 ) | |
| 383 { | |
| 1315 | 384 if (pos < cache->prev_change || pos >= cache->next_change) |
| 826 | 385 update_syntax_cache (cache, pos, 0); |
| 386 } | |
| 460 | 387 |
| 826 | 388 #define SYNTAX_FROM_CACHE(cache, c) \ |
| 389 SYNTAX_FROM_CODE (SYNTAX_CODE_FROM_CACHE (cache, c)) | |
| 460 | 390 |
| 826 | 391 #define SYNTAX_CODE_FROM_CACHE(cache, c) \ |
| 392 ((cache)->use_code ? (cache)->syntax_code \ | |
| 1296 | 393 : SYNTAX_CODE ((cache)->mirror_table, c)) |
| 394 | |
| 395 #ifdef NOT_WORTH_THE_EFFORT | |
| 396 /* If we really cared about the theoretical performance hit of the dirty | |
| 397 check in SYNTAX_CODE, we could use SYNTAX_CODE_1 and endeavor to always | |
| 398 keep the mirror table clean, e.g. by checking for dirtiness at the time | |
| 399 we set up the syntax cache. There are lots of potential problems, of | |
| 400 course -- incomplete understanding of the possible pathways into the | |
| 401 code, with some that are bypassing the setups, Lisp code being executed | |
| 402 in the meantime that could change things (e.g. QUIT is called in many | |
| 403 functions and could execute arbitrary Lisp very easily), etc. The QUIT | |
| 404 problem is the biggest one, probably, and one of the main reasons it's | |
| 405 probably just not worth it. */ | |
| 406 #define SYNTAX_CODE_FROM_CACHE(cache, c) \ | |
| 407 ((cache)->use_code ? (cache)->syntax_code \ | |
| 408 : SYNTAX_CODE_1 ((cache)->mirror_table, c)) | |
| 409 #endif | |
| 826 | 410 |
| 411 | |
| 412 /***************************** syntax code macros ****************************/ | |
| 460 | 413 |
| 414 #define SYNTAX_CODE_PREFIX(c) \ | |
| 415 ((c >> 7) & 1) | |
| 416 | |
| 417 #define SYNTAX_CODE_COMMENT_BITS(c) \ | |
| 418 ((c >> 16) &0xff) | |
| 419 | |
| 420 #define SYNTAX_CODES_START_P(a, b) \ | |
| 421 (((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START) >> 2) \ | |
| 422 & (SYNTAX_CODE_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_START)) | |
| 423 | |
| 424 #define SYNTAX_CODES_END_P(a, b) \ | |
| 425 (((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END) >> 2) \ | |
| 426 & (SYNTAX_CODE_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_END)) | |
| 427 | |
| 428 #define SYNTAX_CODES_COMMENT_MASK_START(a, b) \ | |
| 429 (SYNTAX_CODES_MATCH_START_P (a, b, SYNTAX_COMMENT_STYLE_A) \ | |
| 430 ? SYNTAX_COMMENT_STYLE_A \ | |
| 431 : (SYNTAX_CODES_MATCH_START_P (a, b, SYNTAX_COMMENT_STYLE_B) \ | |
| 432 ? SYNTAX_COMMENT_STYLE_B \ | |
| 433 : 0)) | |
| 434 #define SYNTAX_CODES_COMMENT_MASK_END(a, b) \ | |
| 435 (SYNTAX_CODES_MATCH_END_P (a, b, SYNTAX_COMMENT_STYLE_A) \ | |
| 436 ? SYNTAX_COMMENT_STYLE_A \ | |
| 437 : (SYNTAX_CODES_MATCH_END_P (a, b, SYNTAX_COMMENT_STYLE_B) \ | |
| 438 ? SYNTAX_COMMENT_STYLE_B \ | |
| 439 : 0)) | |
| 440 | |
| 441 #define SYNTAX_CODE_START_FIRST_P(a) \ | |
| 442 (SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START) | |
| 443 | |
| 444 #define SYNTAX_CODE_START_SECOND_P(a) \ | |
| 445 (SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_SECOND_CHAR_START) | |
| 446 | |
| 447 #define SYNTAX_CODE_END_FIRST_P(a) \ | |
| 448 (SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END) | |
| 449 | |
| 450 #define SYNTAX_CODE_END_SECOND_P(a) \ | |
| 451 (SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_SECOND_CHAR_END) | |
| 452 | |
| 453 | |
| 454 #define SYNTAX_CODES_MATCH_START_P(a, b, mask) \ | |
| 455 ((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_START & (mask)) \ | |
| 456 && (SYNTAX_CODE_COMMENT_BITS (b) \ | |
| 457 & SYNTAX_SECOND_CHAR_START & (mask))) | |
| 458 | |
| 459 #define SYNTAX_CODES_MATCH_END_P(a, b, mask) \ | |
| 460 ((SYNTAX_CODE_COMMENT_BITS (a) & SYNTAX_FIRST_CHAR_END & (mask)) \ | |
| 461 && (SYNTAX_CODE_COMMENT_BITS (b) & SYNTAX_SECOND_CHAR_END & (mask))) | |
| 462 | |
| 463 #define SYNTAX_CODE_MATCHES_1CHAR_P(a, mask) \ | |
| 464 ((SYNTAX_CODE_COMMENT_BITS (a) & (mask))) | |
| 465 | |
| 466 #define SYNTAX_CODE_COMMENT_1CHAR_MASK(a) \ | |
| 467 ((SYNTAX_CODE_MATCHES_1CHAR_P (a, SYNTAX_COMMENT_STYLE_A) \ | |
| 468 ? SYNTAX_COMMENT_STYLE_A \ | |
| 469 : (SYNTAX_CODE_MATCHES_1CHAR_P (a, SYNTAX_COMMENT_STYLE_B) \ | |
| 470 ? SYNTAX_COMMENT_STYLE_B \ | |
| 471 : 0))) | |
| 472 | |
| 473 | |
| 440 | 474 #endif /* INCLUDED_syntax_h_ */ |
