comparison src/lisp.h @ 1204:e22b0213b713

[xemacs-hg @ 2003-01-12 11:07:58 by michaels] modules/ChangeLog: 2002-12-16 Ben Wing <ben@xemacs.org> * postgresql/postgresql.c: remove ifdef USE_KKCC. src/ChangeLog: 2003-01-08 Mike Sperber <mike@xemacs.org> * console.h (CDFW_CONSOLE): Don't lead to a crash if we're dealing with a dead window/frame/device/console. 2002-12-20 Mike Sperber <mike@xemacs.org> * ui-gtk.c: Fix typo from Ben's patch: emacs_ffi_data is a typedef, not a struct. emacs_gtk_object_data is a typedef, not a struct. * gtk-glue.c (gdk_event_to_emacs_event): Fix typos from Ben's patch: le -> emacs_event + rearrange the code. * event-gtk.c (gtk_event_to_emacs_event): Fix typos from Ben's patch: ..._UNDERLYING_GDK_EVENT -> ..._GDK_EVENT, ev -> key_event. * device-gtk.c: Fix typo from Ben's patch: x_keysym_map_hash_table -> x_keysym_map_hashtable. 2002-12-19 Mike Sperber <mike@xemacs.org> * menubar-x.c (set_frame_menubar): Initialize protect_me field of popup_data. 2002-12-16 Ben Wing <ben@xemacs.org> Major cleanup of KKCC, etc. KKCC, pdump-related: -- descriptions are written for all objects. this required some changes in the format of some objects, e.g. extents, popup-data, coding system, lstream, lcrecord-list. -- KKCC now handles weakness in markers, hash tables, elsewhere correctly (formerly, you'd eventually get a stack overflow due to endlessly expanding markers). -- textual changes: lrecord_description -> memory_description, struct_description -> sized_memory_description. -- extensive comment describing descriptions and pdump. -- redo XD_UNION so it works inline and change its format to provide sufficient info for pdump. implement XD_UNION in pdump. also add XD_UNION_DYNAMIC_SIZE, which works like XD_UNION except for when auto-computing structure sizes. -- add support for XD_INDIRECT in description offsets (used by extents). -- add support for "description maps", allowing for indirect descriptions that are retrieved from an object at run-time. this generalizes XD_CODING_SYSTEM_END, XD_SPECIFIER_END, etc., which have now been eliminated. -- add a fifth field "flags" to memory_description, to support flags that can be specified for this particular line. Currently defined flags are XD_FLAG_NO_KKCC (KKCC should ignore this entry; useful for the weakness above in markers, etc.), XD_FLAG_NO_PDUMP (pdump should ignore this entry), XD_FLAG_UNION_DEFAULT_ENTRY (in union maps, this specifies a "default" entry for all remaining values), and XD_FLAG_FREE_LISP_OBJECT (for use with lcrecord-lists). -- clean up the kkcc-itis in events, so that the differences between event data as separate objects and as a union are now minimized to a small number of places. with the new XD_UNION, we no longer need event data as separate objects, so this code is no longer ifdef USE_KKCC, but instead ifdef EVENT_DATA_AS_OBJECTS, not used by default. make sure that we explicitly free the separate event data objects when no longer in use, to maintain the invariant the event processing causes no consing. -- also remove other USE_KKCC ifdefs when not necessary. -- allow for KKCC compilation under MS Windows. -- fix README.kkcc. -- dump_add_root_object -> dump_add_root_lisp_object. -- implement dump_add_root_block and use this to handle dump_add_opaque. -- factor out some code duplicated in kkcc and pdump. Other allocation/object-related: -- change various *slots.h so MARKED_SLOT() call no longer includes semicolon. -- free_marker() takes a Lisp_Object not a direct pointer. -- make bit vectors lcrecords, like vectors, and eliminate code that essentially duplicated the lcrecord handling. -- additional asserts in FREE_FIXED_TYPE, formerly duplicated in the various callers of this. -- all lcrecord allocation functions now zero out the returned lcrecords. unnecessary calls to zero_lcrecord removed. add long comment describing these functions. -- extract out process and coding system slots, like for buffers, frames, etc. -- lcrecords now set the type of items sitting on the free list to lcrecord_type_free. -- changes to the way that gap arrays are allocated, for kkcc's benefit -- now, one single memory block with a stretchy array on the end, instead of a separate block holding the array. Error-checking-related: -- now can compile with C++ under MS Windows. clean up compile errors discovered that way. (a few were real problems) -- add C++ error-checking code to verify problems with mismatched GCPRO/UNGCPRO. (there were a few in the kkcc code.) add long comment about how to catch insufficient GCPRO (yes, it's possible using C++). -- add debug_p4(), a simple object printer, when debug_print() doesn't work. -- add dp() and db() as short synonyms of debug_print(), debug_backtrace(). -- `print' tries EXTREMELY hard to avoid core dumping when printing when crashing or from debug_print(), and tries as hard as it reasonably can in other situations. -- Correct the message output upon crashing to be more up-to-date. Event-related: -- document event-matches-key-specifier-p better. -- generalize the dispatch queues formerly duplicated in the various event implementations. add event methods to drain pending events. generalize and clean up QUIT handling, removing event-specific quit processing. allow arbitrary keystrokes, not just ASCII, to be the QUIT char. among other things, this should fix some longstanding bugs in X quit handling. long comment describing the various event queues. -- implement delaying of XFlush() if there are pending expose events. SOMEONE PLEASE TRY THIS OUT. -- Fix `xemacs -batch -l dunnet' under Cygwin. Try to fix under MS Windows but not quite there yet. Other: -- class -> class_ and no more C++ games with this item. new -> new_ in the lwlib code, so far not elsewhere. -- use `struct htentry' not `struct hentry' in elhash.c to avoid debugger confusion with hash.c. -- new macros ALIST_LOOP_3, ALIST_LOOP_4. * README.kkcc: * alloc.c: * alloc.c (deadbeef_memory): * alloc.c (allocate_lisp_storage): * alloc.c (copy_lisp_object): * alloc.c (ALLOCATE_FIXED_TYPE_1): * alloc.c (FREE_FIXED_TYPE): * alloc.c (make_vector_internal): * alloc.c (make_bit_vector_internal): * alloc.c (make_key_data): * alloc.c (make_button_data): * alloc.c (make_motion_data): * alloc.c (make_process_data): * alloc.c (make_timeout_data): * alloc.c (make_magic_data): * alloc.c (make_magic_eval_data): * alloc.c (make_eval_data): * alloc.c (make_misc_user_data): * alloc.c (struct string_chars_block): * alloc.c (mark_lcrecord_list): * alloc.c (make_lcrecord_list): * alloc.c (alloc_managed_lcrecord): * alloc.c (free_managed_lcrecord): * alloc.c (alloc_automanaged_lcrecord): * alloc.c (staticpro_1): * alloc.c (staticpro): * alloc.c (lispdesc_indirect_count_1): * alloc.c (lispdesc_indirect_description_1): * alloc.c (lispdesc_one_description_line_size): * alloc.c (lispdesc_structure_size): * alloc.c (mark_object_maybe_checking_free): * alloc.c (mark_with_description): * alloc.c (mark_struct_contents): * alloc.c (mark_object): * alloc.c (tick_lcrecord_stats): * alloc.c (free_cons): * alloc.c (free_key_data): * alloc.c (free_button_data): * alloc.c (free_motion_data): * alloc.c (free_process_data): * alloc.c (free_timeout_data): * alloc.c (free_magic_data): * alloc.c (free_magic_eval_data): * alloc.c (free_eval_data): * alloc.c (free_misc_user_data): * alloc.c (free_marker): * alloc.c (compact_string_chars): * alloc.c (gc_sweep): * alloc.c (garbage_collect_1): * alloc.c (Fgarbage_collect): * alloc.c (common_init_alloc_early): * alloc.c (init_alloc_early): * alloc.c (init_alloc_once_early): * buffer.c: * buffer.c (mark_buffer): * buffer.c (MARKED_SLOT): * buffer.c (cleanup_buffer_undo_lists): * buffer.c (Fget_file_buffer): * buffer.h (MARKED_SLOT): * bufslots.h: * bytecode.c: * callint.c: * casetab.c: * chartab.c: * chartab.c (symbol_to_char_table_type): * cmdloop.c: * cmdloop.c (Fcommand_loop_1): * config.h.in (new): * conslots.h: * console-gtk-impl.h (struct gtk_frame): * console-impl.h: * console-impl.h (struct console): * console-impl.h (MARKED_SLOT): * console-impl.h (CONSOLE_QUIT_EVENT): * console-msw-impl.h (XM_BUMPQUEUE): * console-msw.c (write_string_to_mswindows_debugging_output): * console-msw.h: * console-stream-impl.h: * console-stream-impl.h (struct stream_console): * console-stream.c: * console-stream.c (stream_init_console): * console-stream.h: * console-tty.c: * console-tty.h: * console-x.h: * console.c: * console.c (mark_console): * console.c (MARKED_SLOT): * console.c (allocate_console): * console.c (get_console_variant): * console.c (create_console): * console.c (delete_console_internal): * console.c (Fset_input_mode): * console.c (Fcurrent_input_mode): * console.c (common_init_complex_vars_of_console): * console.h: * console.h (console_variant): * console.h (device_metrics): * data.c: * data.c (Faref): * data.c (Faset): * data.c (decode_weak_list_type): * database.c: * debug.c (xemacs_debug_loop): * debug.c (FROB): * debug.c (Fadd_debug_class_to_check): * debug.c (Fdelete_debug_class_to_check): * debug.c (Fset_debug_classes_to_check): * debug.c (Fset_debug_class_types_to_check): * debug.c (Fdebug_types_being_checked): * debug.h (DASSERT): * device-gtk.c: * device-impl.h (struct device): * device-impl.h (MARKED_SLOT): * device-msw.c: * device-x.c: * device-x.c (x_init_device_class): * device-x.c (x_comp_visual_info): * device-x.c (x_try_best_visual_class): * device-x.c (x_init_device): * device-x.c (construct_name_list): * device-x.c (x_get_resource_prefix): * device-x.c (Fx_get_resource): * device-x.c (Fx_display_visual_class): * device.c: * device.c (MARKED_SLOT): * device.c (allocate_device): * device.c (Fmake_device): * device.c (delete_device_internal): * device.c (Fset_device_class): * device.h: * devslots.h: * devslots.h (MARKED_SLOT): * dialog-msw.c: * dired-msw.c (mswindows_ls_sort_fcn): * dired-msw.c (mswindows_get_files): * dired-msw.c (mswindows_format_file): * doprnt.c (parse_doprnt_spec): * dumper.c: * dumper.c (struct): * dumper.c (dump_add_root_block): * dumper.c (dump_add_root_struct_ptr): * dumper.c (dump_add_root_lisp_object): * dumper.c (pdump_struct_list_elt): * dumper.c (pdump_get_entry_list): * dumper.c (pdump_backtrace): * dumper.c (pdump_bump_depth): * dumper.c (pdump_register_sub): * dumper.c (pdump_register_object): * dumper.c (pdump_register_struct_contents): * dumper.c (pdump_register_struct): * dumper.c (pdump_store_new_pointer_offsets): * dumper.c (pdump_dump_data): * dumper.c (pdump_reloc_one): * dumper.c (pdump_allocate_offset): * dumper.c (pdump_scan_by_alignment): * dumper.c (pdump_dump_root_blocks): * dumper.c (pdump_dump_rtables): * dumper.c (pdump_dump_root_lisp_objects): * dumper.c (pdump): * dumper.c (pdump_load_finish): * dumper.c (pdump_file_get): * dumper.c (pdump_resource_get): * dumper.c (pdump_load): * editfns.c (save_excursion_restore): * editfns.c (user_login_name): * editfns.c (save_restriction_restore): * elhash.c: * elhash.c (htentry): * elhash.c (struct Lisp_Hash_Table): * elhash.c (HTENTRY_CLEAR_P): * elhash.c (LINEAR_PROBING_LOOP): * elhash.c (check_hash_table_invariants): * elhash.c (mark_hash_table): * elhash.c (hash_table_equal): * elhash.c (print_hash_table_data): * elhash.c (free_hentries): * elhash.c (make_general_lisp_hash_table): * elhash.c (decode_hash_table_weakness): * elhash.c (decode_hash_table_test): * elhash.c (Fcopy_hash_table): * elhash.c (resize_hash_table): * elhash.c (pdump_reorganize_hash_table): * elhash.c (find_htentry): * elhash.c (Fgethash): * elhash.c (Fputhash): * elhash.c (remhash_1): * elhash.c (Fremhash): * elhash.c (Fclrhash): * elhash.c (copy_compress_hentries): * elhash.c (elisp_maphash_unsafe): * elhash.c (finish_marking_weak_hash_tables): * elhash.c (prune_weak_hash_tables): * elhash.h: * emacs.c: * emacs.c (main_1): * emacs.c (main): * emacs.c (shut_down_emacs): * emodules.h (dump_add_root_lisp_object): * eval.c: * eval.c (unwind_to_catch): * eval.c (maybe_signal_error_1): * eval.c (maybe_signal_continuable_error_1): * eval.c (maybe_signal_error): * eval.c (maybe_signal_continuable_error): * eval.c (maybe_signal_error_2): * eval.c (maybe_signal_continuable_error_2): * eval.c (maybe_signal_ferror): * eval.c (maybe_signal_continuable_ferror): * eval.c (maybe_signal_ferror_with_frob): * eval.c (maybe_signal_continuable_ferror_with_frob): * eval.c (maybe_syntax_error): * eval.c (maybe_sferror): * eval.c (maybe_invalid_argument): * eval.c (maybe_invalid_constant): * eval.c (maybe_invalid_operation): * eval.c (maybe_invalid_change): * eval.c (maybe_invalid_state): * eval.c (Feval): * eval.c (call_trapping_problems): * eval.c (call_with_suspended_errors): * eval.c (warn_when_safe_lispobj): * eval.c (warn_when_safe): * eval.c (vars_of_eval): * event-Xt.c: * event-Xt.c (maybe_define_x_key_as_self_inserting_character): * event-Xt.c (x_to_emacs_keysym): * event-Xt.c (x_event_to_emacs_event): * event-Xt.c (emacs_Xt_enqueue_focus_event): * event-Xt.c (emacs_Xt_format_magic_event): * event-Xt.c (emacs_Xt_compare_magic_event): * event-Xt.c (emacs_Xt_hash_magic_event): * event-Xt.c (emacs_Xt_handle_magic_event): * event-Xt.c (Xt_timeout_to_emacs_event): * event-Xt.c (Xt_process_to_emacs_event): * event-Xt.c (signal_special_Xt_user_event): * event-Xt.c (emacs_Xt_next_event): * event-Xt.c (emacs_Xt_event_handler): * event-Xt.c (emacs_Xt_drain_queue): * event-Xt.c (emacs_Xt_event_pending_p): * event-Xt.c (check_if_pending_expose_event): * event-Xt.c (reinit_vars_of_event_Xt): * event-Xt.c (vars_of_event_Xt): * event-gtk.c: * event-gtk.c (IS_MODIFIER_KEY): * event-gtk.c (emacs_gtk_format_magic_event): * event-gtk.c (emacs_gtk_compare_magic_event): * event-gtk.c (emacs_gtk_hash_magic_event): * event-gtk.c (emacs_gtk_handle_magic_event): * event-gtk.c (gtk_to_emacs_keysym): * event-gtk.c (gtk_timeout_to_emacs_event): * event-gtk.c (gtk_process_to_emacs_event): * event-gtk.c (dragndrop_data_received): * event-gtk.c (signal_special_gtk_user_event): * event-gtk.c (emacs_gtk_next_event): * event-gtk.c (gtk_event_to_emacs_event): * event-gtk.c (generic_event_handler): * event-gtk.c (emacs_shell_event_handler): * event-gtk.c (emacs_gtk_drain_queue): * event-gtk.c (emacs_gtk_event_pending_p): * event-gtk.c (reinit_vars_of_event_gtk): * event-gtk.c (vars_of_event_gtk): * event-msw.c: * event-msw.c (struct winsock_stream): * event-msw.c (winsock_reader): * event-msw.c (winsock_writer): * event-msw.c (mswindows_enqueue_dispatch_event): * event-msw.c (mswindows_enqueue_misc_user_event): * event-msw.c (mswindows_enqueue_magic_event): * event-msw.c (mswindows_enqueue_process_event): * event-msw.c (mswindows_enqueue_mouse_button_event): * event-msw.c (mswindows_enqueue_keypress_event): * event-msw.c (mswindows_dequeue_dispatch_event): * event-msw.c (emacs_mswindows_drain_queue): * event-msw.c (mswindows_need_event_in_modal_loop): * event-msw.c (mswindows_need_event): * event-msw.c (mswindows_wm_timer_callback): * event-msw.c (dde_eval_string): * event-msw.c (Fdde_alloc_advise_item): * event-msw.c (mswindows_dde_callback): * event-msw.c (mswindows_wnd_proc): * event-msw.c (remove_timeout_mapper): * event-msw.c (emacs_mswindows_remove_timeout): * event-msw.c (emacs_mswindows_event_pending_p): * event-msw.c (emacs_mswindows_format_magic_event): * event-msw.c (emacs_mswindows_compare_magic_event): * event-msw.c (emacs_mswindows_hash_magic_event): * event-msw.c (emacs_mswindows_handle_magic_event): * event-msw.c (emacs_mswindows_select_console): * event-msw.c (emacs_mswindows_unselect_console): * event-msw.c (reinit_vars_of_event_mswindows): * event-msw.c (vars_of_event_mswindows): * event-stream.c: * event-stream.c (mark_command_builder): * event-stream.c (reset_command_builder_event_chain): * event-stream.c (allocate_command_builder): * event-stream.c (copy_command_builder): * event-stream.c (command_builder_append_event): * event-stream.c (event_stream_event_pending_p): * event-stream.c (event_stream_force_event_pending): * event-stream.c (maybe_read_quit_event): * event-stream.c (event_stream_drain_queue): * event-stream.c (remove_quit_p_event): * event-stream.c (event_stream_quit_p): * event-stream.c (echo_key_event): * event-stream.c (maybe_kbd_translate): * event-stream.c (execute_help_form): * event-stream.c (event_stream_generate_wakeup): * event-stream.c (enqueue_dispatch_event): * event-stream.c (enqueue_magic_eval_event): * event-stream.c (Fenqueue_eval_event): * event-stream.c (enqueue_misc_user_event): * event-stream.c (enqueue_misc_user_event_pos): * event-stream.c (next_event_internal): * event-stream.c (Fnext_event): * event-stream.c (Faccept_process_output): * event-stream.c (execute_internal_event): * event-stream.c (munge_keymap_translate): * event-stream.c (command_builder_find_leaf_no_mule_processing): * event-stream.c (command_builder_find_leaf): * event-stream.c (lookup_command_event): * event-stream.c (is_scrollbar_event): * event-stream.c (execute_command_event): * event-stream.c (Fdispatch_event): * event-stream.c (Fread_key_sequence): * event-stream.c (dribble_out_event): * event-stream.c (vars_of_event_stream): * event-tty.c (tty_timeout_to_emacs_event): * event-tty.c (emacs_tty_next_event): * event-tty.c (emacs_tty_drain_queue): * event-tty.c (reinit_vars_of_event_tty): * event-unixoid.c: * event-unixoid.c (find_tty_or_stream_console_from_fd): * event-unixoid.c (read_event_from_tty_or_stream_desc): * event-unixoid.c (drain_tty_devices): * event-unixoid.c (poll_fds_for_input): * events.c: * events.c (deinitialize_event): * events.c (zero_event): * events.c (mark_event): * events.c (print_event_1): * events.c (print_event): * events.c (event_equal): * events.c (event_hash): * events.c (Fmake_event): * events.c (Fdeallocate_event): * events.c (Fcopy_event): * events.c (map_event_chain_remove): * events.c (character_to_event): * events.c (event_to_character): * events.c (Fevent_to_character): * events.c (format_event_object): * events.c (upshift_event): * events.c (downshift_event): * events.c (event_upshifted_p): * events.c (Fevent_live_p): * events.c (Fevent_type): * events.c (Fevent_timestamp): * events.c (CHECK_EVENT_TYPE): * events.c (CHECK_EVENT_TYPE2): * events.c (CHECK_EVENT_TYPE3): * events.c (Fevent_key): * events.c (Fevent_button): * events.c (Fevent_modifier_bits): * events.c (event_x_y_pixel_internal): * events.c (event_pixel_translation): * events.c (Fevent_process): * events.c (Fevent_function): * events.c (Fevent_object): * events.c (Fevent_properties): * events.c (syms_of_events): * events.c (vars_of_events): * events.h: * events.h (struct event_stream): * events.h (struct Lisp_Key_Data): * events.h (KEY_DATA_KEYSYM): * events.h (EVENT_KEY_KEYSYM): * events.h (struct Lisp_Button_Data): * events.h (EVENT_BUTTON_BUTTON): * events.h (struct Lisp_Motion_Data): * events.h (EVENT_MOTION_X): * events.h (struct Lisp_Process_Data): * events.h (EVENT_PROCESS_PROCESS): * events.h (struct Lisp_Timeout_Data): * events.h (EVENT_TIMEOUT_INTERVAL_ID): * events.h (struct Lisp_Eval_Data): * events.h (EVENT_EVAL_FUNCTION): * events.h (struct Lisp_Misc_User_Data): * events.h (EVENT_MISC_USER_FUNCTION): * events.h (struct Lisp_Magic_Eval_Data): * events.h (EVENT_MAGIC_EVAL_INTERNAL_FUNCTION): * events.h (struct Lisp_Magic_Data): * events.h (EVENT_MAGIC_UNDERLYING): * events.h (EVENT_MAGIC_GDK_EVENT): * events.h (struct Lisp_Event): * events.h (XEVENT_CHANNEL): * events.h (SET_EVENT_TIMESTAMP_ZERO): * events.h (SET_EVENT_CHANNEL): * events.h (SET_EVENT_NEXT): * events.h (XSET_EVENT_TYPE): * events.h (struct command_builder): * extents.c: * extents.c (gap_array_adjust_markers): * extents.c (gap_array_recompute_derived_values): * extents.c (gap_array_move_gap): * extents.c (gap_array_make_gap): * extents.c (gap_array_insert_els): * extents.c (gap_array_delete_els): * extents.c (gap_array_make_marker): * extents.c (gap_array_delete_marker): * extents.c (gap_array_move_marker): * extents.c (make_gap_array): * extents.c (free_gap_array): * extents.c (extent_list_num_els): * extents.c (extent_list_insert): * extents.c (mark_extent_auxiliary): * extents.c (allocate_extent_auxiliary): * extents.c (decode_extent_at_flag): * extents.c (verify_extent_mapper): * extents.c (symbol_to_glyph_layout): * extents.c (syms_of_extents): * faces.c: * file-coding.c: * file-coding.c (struct_detector_category_description =): * file-coding.c (detector_category_dynarr_description_1): * file-coding.c (struct_detector_description =): * file-coding.c (detector_dynarr_description_1): * file-coding.c (MARKED_SLOT): * file-coding.c (mark_coding_system): * file-coding.c (coding_system_extra_description_map): * file-coding.c (coding_system_description): * file-coding.c (allocate_coding_system): * file-coding.c (symbol_to_eol_type): * file-coding.c (Fcoding_system_aliasee): * file-coding.c (set_coding_stream_coding_system): * file-coding.c (struct convert_eol_coding_system): * file-coding.c (struct undecided_coding_system): * file-coding.c (undecided_mark_coding_stream): * file-coding.c (coding_category_symbol_to_id): * file-coding.c (struct gzip_coding_system): * file-coding.c (coding_system_type_create): * file-coding.h: * file-coding.h (struct Lisp_Coding_System): * file-coding.h (CODING_SYSTEM_SLOT_DECLARATION): * file-coding.h (coding_system_variant): * file-coding.h (struct coding_system_methods): * file-coding.h (DEFINE_CODING_SYSTEM_TYPE_WITH_DATA): * file-coding.h (INITIALIZE_CODING_SYSTEM_TYPE_WITH_DATA): * file-coding.h (struct coding_stream): * fileio.c (Fsubstitute_in_file_name): * floatfns.c: * fns.c: * fns.c (base64_encode_1): * frame-gtk.c: * frame-gtk.c (Fgtk_start_drag_internal): * frame-impl.h (struct frame): * frame-impl.h (MARKED_SLOT): * frame-msw.c: * frame-x.c: * frame-x.c (Fcde_start_drag_internal): * frame-x.c (Foffix_start_drag_internal): * frame.c: * frame.c (MARKED_SLOT): * frame.c (allocate_frame_core): * frame.c (delete_frame_internal): * frame.c (Fmouse_position_as_motion_event): * frameslots.h: * frameslots.h (MARKED_SLOT_ARRAY): * free-hook.c: * glyphs-msw.c (mswindows_widget_instantiate): * glyphs-x.c: * glyphs-x.c (convert_EImage_to_XImage): * glyphs.c: * glyphs.c (process_image_string_instantiator): * glyphs.c (mark_image_instance): * glyphs.c (allocate_image_instance): * glyphs.c (unmap_subwindow): * glyphs.c (map_subwindow): * glyphs.c (syms_of_glyphs): * glyphs.c (specifier_type_create_image): * glyphs.h: * glyphs.h (struct text_image_instance): * glyphs.h (struct Lisp_Image_Instance): * gmalloc.c: * gmalloc.c ("C"): * gpmevent.c (Freceive_gpm_event): * gpmevent.c (gpm_next_event_cb): * gpmevent.c (vars_of_gpmevent): * gtk-glue.c (gdk_event_to_emacs_event): * gtk-xemacs.c (gtk_xemacs_class_init): * gui-msw.c: * gui-msw.c (mswindows_handle_gui_wm_command): * gui-msw.c (mswindows_translate_menu_or_dialog_item): * gui-x.c: * gui-x.c (mark_popup_data): * gui-x.c (snarf_widget_value_mapper): * gui-x.c (gcpro_popup_callbacks): * gui-x.c (ungcpro_popup_callbacks): * gui-x.c (free_popup_widget_value_tree): * gui-x.c (popup_selection_callback): * gui-x.h: * gui-x.h (struct popup_data): * gui.c: * gui.c (allocate_gui_item): * gutter.c (decode_gutter_position): * hash.c (NULL_ENTRY): * indent.c (vmotion_1): * indent.c (vmotion_pixels): * input-method-motif.c (res): * input-method-xlib.c (IMInstantiateCallback): * input-method-xlib.c (XIM_init_device): * input-method-xlib.c (res): * intl-encap-win32.c: * intl-encap-win32.c (qxeSHGetDataFromIDList): * intl-win32.c: * intl-win32.c (mswindows_multibyte_cp_type): * intl-win32.c (struct mswindows_multibyte_coding_system): * keymap.c: * keymap.c (make_key_description): * keymap.c (keymap_store): * keymap.c (get_keyelt): * keymap.c (keymap_lookup_1): * keymap.c (define_key_parser): * keymap.c (key_desc_list_to_event): * keymap.c (event_matches_key_specifier_p): * keymap.c (meta_prefix_char_p): * keymap.c (ensure_meta_prefix_char_keymapp): * keymap.c (Fdefine_key): * keymap.c (struct raw_lookup_key_mapper_closure): * keymap.c (raw_lookup_key): * keymap.c (raw_lookup_key_mapper): * keymap.c (lookup_keys): * keymap.c (lookup_events): * keymap.c (Flookup_key): * keymap.c (struct map_keymap_unsorted_closure): * keymap.c (map_keymap_unsorted_mapper): * keymap.c (map_keymap_sorted): * keymap.c (map_keymap_mapper): * keymap.c (map_keymap): * keymap.c (accessible_keymaps_mapper_1): * keymap.c (Faccessible_keymaps): * keymap.c (Fsingle_key_description): * keymap.c (raw_keys_to_keys): * keymap.c (format_raw_keys): * keymap.c (where_is_recursive_mapper): * keymap.c (where_is_internal): * keymap.c (describe_map_mapper_shadow_search): * keymap.c (keymap_lookup_inherited_mapper): * keymap.c (describe_map_mapper): * keymap.h (event_matches_key_specifier_p): * lisp.h: * lisp.h (this): * lisp.h (RETURN_NOT_REACHED): * lisp.h (struct Lisp_Vector): * lisp.h (struct Lisp_Bit_Vector): * lisp.h (UNGCPRO_1): * lisp.h (NUNGCPRO): * lisp.h (NNUNGCPRO): * lisp.h (DECLARE_INLINE_HEADER): * lrecord.h: * lrecord.h (struct lrecord_header): * lrecord.h (struct lcrecord_header): * lrecord.h (lrecord_type): * lrecord.h (struct lrecord_implementation): * lrecord.h (RECORD_DUMPABLE): * lrecord.h (memory_description_type): * lrecord.h (data_description_entry_flags): * lrecord.h (struct memory_description): * lrecord.h (struct sized_memory_description): * lrecord.h (XD_INDIRECT): * lrecord.h (XD_IS_INDIRECT): * lrecord.h (XD_DYNARR_DESC): * lrecord.h (DEFINE_BASIC_LRECORD_IMPLEMENTATION): * lrecord.h (MAKE_LRECORD_IMPLEMENTATION): * lrecord.h (MAKE_EXTERNAL_LRECORD_IMPLEMENTATION): * lrecord.h (alloc_lcrecord_type): * lstream.c: * lstream.c (Lstream_new): * lstream.c (lisp_buffer_marker): * lstream.h: * lstream.h (lstream_implementation): * lstream.h (DEFINE_LSTREAM_IMPLEMENTATION): * lstream.h (DEFINE_LSTREAM_IMPLEMENTATION_WITH_DATA): * marker.c: * marker.c (copy_marker_1): * mem-limits.h: * menubar-gtk.c: * menubar-gtk.c (gtk_popup_menu): * menubar-msw.c: * menubar-msw.c (mswindows_popup_menu): * menubar-x.c (make_dummy_xbutton_event): * menubar-x.c (command_builder_operate_menu_accelerator): * menubar-x.c (menu_accelerator_safe_compare): * menubar-x.c (menu_accelerator_safe_mod_compare): * mule-charset.c: * mule-charset.c (make_charset): * mule-charset.c (Fcharset_property): * mule-coding.c: * mule-coding.c (ccs_description_1): * mule-coding.c (ccs_description =): * mule-coding.c (ccsd_description_1): * mule-coding.c (ccsd_description =): * nt.c (getpwnam): * nt.c (init_mswindows_environment): * nt.c (get_cached_volume_information): * nt.c (mswindows_is_executable): * nt.c (read_unc_volume): * nt.c (mswindows_access): * nt.c (mswindows_link): * nt.c (mswindows_fstat): * nt.c (mswindows_stat): * nt.c (mswindows_executable_type): * nt.c (Fmswindows_short_file_name): * nt.c (Fmswindows_long_file_name): * objects-impl.h (struct Lisp_Color_Instance): * objects-impl.h (struct Lisp_Font_Instance): * objects-tty.c: * objects-x.c (allocate_nearest_color): * objects.c: * objects.c (Fmake_color_instance): * objects.c (Fmake_font_instance): * objects.c (font_instantiate): * opaque.c: * opaque.c (make_opaque): * opaque.c (make_opaque_ptr): * opaque.c (reinit_opaque_early): * opaque.c (init_opaque_once_early): * print.c: * print.c (printing_badness): * print.c (printing_major_badness): * print.c (print_internal): * print.c (debug_p4): * print.c (dp): * print.c (debug_backtrace): * process-nt.c (nt_create_process): * process-nt.c (get_internet_address): * process-unix.c: * process-unix.c (struct unix_process_data): * process-unix.c (get_internet_address): * process-unix.c (unix_alloc_process_data): * process-unix.c (unix_create_process): * process-unix.c (try_to_initialize_subtty): * process-unix.c (unix_kill_child_process): * process-unix.c (process_type_create_unix): * process.c: * process.c (mark_process): * process.c (MARKED_SLOT): * process.c (make_process_internal): * process.c (Fprocess_tty_name): * process.c (decode_signal): * process.h: * procimpl.h: * procimpl.h (struct process_methods): * procimpl.h (struct Lisp_Process): * rangetab.c: * realpath.c (readlink_and_correct_case): * redisplay-x.c (x_window_output_end): * redisplay-x.c (x_redraw_exposed_area): * redisplay-x.c (x_clear_frame): * redisplay.c: * redisplay.h: * redisplay.h (struct rune_dglyph): * redisplay.h (struct rune): * scrollbar.c: * scrollbar.c (create_scrollbar_instance): * specifier.c: * specifier.c (specifier_empty_extra_description_1): * specifier.c (make_specifier_internal): * specifier.c (decode_locale_type): * specifier.c (decode_how_to_add_specification): * specifier.h: * specifier.h (struct specifier_methods): * specifier.h (DEFINE_SPECIFIER_TYPE_WITH_DATA): * specifier.h (INITIALIZE_SPECIFIER_TYPE_WITH_DATA): * symbols.c: * symbols.c (Fsetplist): * symbols.c (default_value): * symbols.c (decode_magic_handler_type): * symbols.c (handler_type_from_function_symbol): * symbols.c (Fdefvaralias): * symbols.c (init_symbols_once_early): * symbols.c (reinit_symbols_early): * symsinit.h: * sysdep.c (sys_subshell): * sysdep.c (tty_init_sys_modes_on_device): * syswindows.h: * text.c (dfc_convert_to_external_format): * text.c (dfc_convert_to_internal_format): * text.c (reinit_eistring_early): * text.c (init_eistring_once_early): * text.c (reinit_vars_of_text): * text.h: * text.h (INC_IBYTEPTR_FMT): * text.h (DEC_IBYTEPTR_FMT): * toolbar.c: * toolbar.c (decode_toolbar_position): * tooltalk.c: * ui-gtk.c: * unexnt.c: * unexnt.c (_start): * unexnt.c (unexec): * unexnt.c (get_section_info): * unicode.c: * unicode.c (vars_of_unicode): * window.c: * window.c (allocate_window): * window.c (new_window_mirror): * window.c (update_mirror_internal): * winslots.h:
author michaels
date Sun, 12 Jan 2003 11:08:22 +0000
parents 37bdd24225ef
children 465bd3c7d932
comparison
equal deleted inserted replaced
1203:5f2f8dcbfb3e 1204:e22b0213b713
313 declarations in DECLARE_INTCLASS_ARITH_COMPARE(). The bool/int 313 declarations in DECLARE_INTCLASS_ARITH_COMPARE(). The bool/int
314 equivalence also means that we have to forcibly block the combinations 314 equivalence also means that we have to forcibly block the combinations
315 we don't want by creating overloaded versions of them and declaring them 315 we don't want by creating overloaded versions of them and declaring them
316 private. */ 316 private. */
317 317
318 #undef class
319 #undef this 318 #undef this
320 319
321 class Bytecount; 320 class Bytecount;
322 class Bytebpos; 321 class Bytebpos;
323 class Bytexpos; 322 class Bytexpos;
740 #if 0 /* doesn't work */ 739 #if 0 /* doesn't work */
741 inline Bytecount operator - (const Ibyte *x, const Ibyte *y) \ 740 inline Bytecount operator - (const Ibyte *x, const Ibyte *y) \
742 { return Bytecount (x - y); } 741 { return Bytecount (x - y); }
743 #endif 742 #endif
744 743
745 #define class c_class
746 #define this c_this 744 #define this c_this
747 745
748 #endif /* __cplusplus */ 746 #endif /* __cplusplus */
749 747
750 /* Counts of elements */ 748 /* Counts of elements */
813 #endif 811 #endif
814 812
815 #ifndef DOESNT_RETURN 813 #ifndef DOESNT_RETURN
816 # if defined __GNUC__ 814 # if defined __GNUC__
817 # if ((__GNUC__ > 2) || (__GNUC__ == 2) && (__GNUC_MINOR__ >= 5)) 815 # if ((__GNUC__ > 2) || (__GNUC__ == 2) && (__GNUC_MINOR__ >= 5))
818 # define RETURN_NOT_REACHED(value) 816 # define RETURN_NOT_REACHED(value) DO_NOTHING
819 # define DOESNT_RETURN void 817 # define DOESNT_RETURN void
820 # define DECLARE_DOESNT_RETURN(decl) \ 818 # define DECLARE_DOESNT_RETURN(decl) \
821 extern void decl __attribute__ ((noreturn)) 819 extern void decl __attribute__ ((noreturn))
822 # define DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS(decl,str,idx) \ 820 # define DECLARE_DOESNT_RETURN_GCC_ATTRIBUTE_SYNTAX_SUCKS(decl,str,idx) \
823 /* Should be able to state multiple independent __attribute__s, but \ 821 /* Should be able to state multiple independent __attribute__s, but \
841 /* Another try to fix SunPro C compiler warnings */ 839 /* Another try to fix SunPro C compiler warnings */
842 /* "end-of-loop code not reached" */ 840 /* "end-of-loop code not reached" */
843 /* "statement not reached */ 841 /* "statement not reached */
844 #if defined __SUNPRO_C || defined __USLC__ 842 #if defined __SUNPRO_C || defined __USLC__
845 #define RETURN_SANS_WARNINGS if (1) return 843 #define RETURN_SANS_WARNINGS if (1) return
846 #define RETURN_NOT_REACHED(value) 844 #define RETURN_NOT_REACHED(value) DO_NOTHING
847 #endif 845 #endif
848 846
847 /* More ways to shut up compiler. This works in Fcommand_loop_1(),
848 where there's an infinite loop in a function returning a Lisp object.
849 */
850 #if defined (_MSC_VER) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || \
851 (defined (DEC_ALPHA) && defined (OSF1))
852 #define DO_NOTHING_DISABLING_NO_RETURN_WARNINGS if (0) return Qnil
853 #else
854 #define DO_NOTHING_DISABLING_NO_RETURN_WARNINGS DO_NOTHING
855 #endif
856
849 #ifndef RETURN_NOT_REACHED 857 #ifndef RETURN_NOT_REACHED
850 #define RETURN_NOT_REACHED(value) return value; 858 #define RETURN_NOT_REACHED(value) return (value)
851 #endif 859 #endif
852 860
853 #ifndef RETURN_SANS_WARNINGS 861 #ifndef RETURN_SANS_WARNINGS
854 #define RETURN_SANS_WARNINGS return 862 #define RETURN_SANS_WARNINGS return
855 #endif 863 #endif
1870 else \ 1878 else \
1871 prev_tail_##elt = tail_##elt; \ 1879 prev_tail_##elt = tail_##elt; \
1872 } \ 1880 } \
1873 } while (0) 1881 } while (0)
1874 1882
1883
1884 /* Macros for looping over internal alists.
1885
1886 *** ALL OF THESE MACROS MUST BE DECLARED INSIDE BRACES -- SEE ABOVE. ***
1887
1888 ALIST_LOOP_3 loops over an alist, at each iteration setting CAR and CDR
1889 to the car and cdr of the acons. CAR and CDR are automatically
1890 declared.
1891
1892 ALIST_LOOP_4 is similar to ALIST_LOOP_3 but contains an additional
1893 variable ACONS at the beginning for access to the acons itself.All of
1894 the variables ACONS, CAR and CDR are automatically declared.
1895 */
1896
1897 #define ALIST_LOOP_3(car, cdr, alist) \
1898 Lisp_Object _al3_acons_##car, car, cdr, _al3_tail_##car; \
1899 for (_al3_tail_##car = alist; \
1900 NILP (_al3_tail_##car) ? \
1901 0 : (_al3_acons_##car = XCAR (_al3_tail_##car), \
1902 car = XCAR (_al3_acons_##car), \
1903 cdr = XCDR (_al3_acons_##car), 1); \
1904 _al3_tail_##car = XCDR (_al3_tail_##car))
1905
1906 #define ALIST_LOOP_4(acons, car, cdr, list) \
1907 Lisp_Object acons, car, cdr, _al4_tail_##car; \
1908 for (_al4_tail_##car = list; \
1909 NILP (_al4_tail_##car) ? \
1910 0 : (elt = XCAR (_al4_tail_##car), car = XCAR (elt), \
1911 cdr = XCDR (elt), 1); \
1912 _al4_tail_##car = XCDR (tail))
1875 1913
1876 /* Macros for looping over external alists. 1914 /* Macros for looping over external alists.
1877 1915
1878 *** ALL OF THESE MACROS MUST BE DECLARED INSIDE BRACES -- SEE ABOVE. *** 1916 *** ALL OF THESE MACROS MUST BE DECLARED INSIDE BRACES -- SEE ABOVE. ***
1879 1917
2169 2207
2170 struct Lisp_Vector 2208 struct Lisp_Vector
2171 { 2209 {
2172 struct lcrecord_header header; 2210 struct lcrecord_header header;
2173 long size; 2211 long size;
2174 /* next is now chained through v->contents[size], terminated by Qzero.
2175 This means that pure vectors don't need a "next" */
2176 /* struct Lisp_Vector *next; */
2177 Lisp_Object contents[1]; 2212 Lisp_Object contents[1];
2178 }; 2213 };
2179 typedef struct Lisp_Vector Lisp_Vector; 2214 typedef struct Lisp_Vector Lisp_Vector;
2180 2215
2181 DECLARE_LRECORD (vector, Lisp_Vector); 2216 DECLARE_LRECORD (vector, Lisp_Vector);
2207 #error You really have 128-bit integers?! 2242 #error You really have 128-bit integers?!
2208 #endif 2243 #endif
2209 2244
2210 struct Lisp_Bit_Vector 2245 struct Lisp_Bit_Vector
2211 { 2246 {
2212 struct lrecord_header lheader; 2247 struct lcrecord_header lheader;
2213 Lisp_Object next;
2214 Elemcount size; 2248 Elemcount size;
2215 unsigned long bits[1]; 2249 unsigned long bits[1];
2216 }; 2250 };
2217 typedef struct Lisp_Bit_Vector Lisp_Bit_Vector; 2251 typedef struct Lisp_Bit_Vector Lisp_Bit_Vector;
2218 2252
2234 if (!BITP (x)) \ 2268 if (!BITP (x)) \
2235 x = wrong_type_argument (Qbitp, x); \ 2269 x = wrong_type_argument (Qbitp, x); \
2236 } while (0) 2270 } while (0)
2237 2271
2238 #define bit_vector_length(v) ((v)->size) 2272 #define bit_vector_length(v) ((v)->size)
2239 #define bit_vector_next(v) ((v)->next)
2240 2273
2241 DECLARE_INLINE_HEADER ( 2274 DECLARE_INLINE_HEADER (
2242 int 2275 int
2243 bit_vector_bit (Lisp_Bit_Vector *v, Elemcount n) 2276 bit_vector_bit (Lisp_Bit_Vector *v, Elemcount n)
2244 ) 2277 )
2666 2699
2667 Lisp_Object make_weak_list (enum weak_list_type type); 2700 Lisp_Object make_weak_list (enum weak_list_type type);
2668 /* The following two are only called by the garbage collector */ 2701 /* The following two are only called by the garbage collector */
2669 int finish_marking_weak_lists (void); 2702 int finish_marking_weak_lists (void);
2670 void prune_weak_lists (void); 2703 void prune_weak_lists (void);
2671
2672 /*-------------------------- lcrecord-list -----------------------------*/
2673
2674 struct lcrecord_list
2675 {
2676 struct lcrecord_header header;
2677 Lisp_Object free;
2678 Elemcount size;
2679 const struct lrecord_implementation *implementation;
2680 };
2681
2682 DECLARE_LRECORD (lcrecord_list, struct lcrecord_list);
2683 #define XLCRECORD_LIST(x) XRECORD (x, lcrecord_list, struct lcrecord_list)
2684 #define wrap_lcrecord_list(p) wrap_record (p, lcrecord_list)
2685 #define LCRECORD_LISTP(x) RECORDP (x, lcrecord_list)
2686 /* #define CHECK_LCRECORD_LIST(x) CHECK_RECORD (x, lcrecord_list)
2687 Lcrecord lists should never escape to the Lisp level, so
2688 functions should not be doing this. */
2689
2690 Lisp_Object make_lcrecord_list (Elemcount size,
2691 const struct lrecord_implementation
2692 *implementation);
2693 Lisp_Object allocate_managed_lcrecord (Lisp_Object lcrecord_list);
2694 void free_managed_lcrecord (Lisp_Object lcrecord_list, Lisp_Object lcrecord);
2695 2704
2696 2705
2697 /************************************************************************/ 2706 /************************************************************************/
2698 /* Definitions related to the format of text and of characters */ 2707 /* Definitions related to the format of text and of characters */
2699 /************************************************************************/ 2708 /************************************************************************/
3002 Every function that can call Feval must protect in this fashion all 3011 Every function that can call Feval must protect in this fashion all
3003 Lisp_Object variables whose contents will be used again. */ 3012 Lisp_Object variables whose contents will be used again. */
3004 3013
3005 extern struct gcpro *gcprolist; 3014 extern struct gcpro *gcprolist;
3006 3015
3016 /* #### Catching insufficient gcpro:
3017
3018 The C++ code below catches GCPRO without UNGCPRO or vice-versa.
3019 Catching cases where there's no GCPRO or UNGCPRO but should be, however,
3020 is much harder, but could be done:
3021
3022 1. Lisp_Object becomes a real object. Its creator and destructor need to
3023 figure out whether the object is on the stack (by looking at the range
3024 that `this' is within), and if so, add the pointer to a list of all
3025 stack-based Lisp_Objects.
3026
3027 2. The assignment method needs to do reference-counting on actual Lisp
3028 objects -- in particular, we need to know if there are any references
3029 to a Lisp object that are *NOT* from stack-based Lisp_Objects.
3030
3031 3. When we get to a point in the code where we might garbage collect --
3032 i.e. Ffuncall(), Feval(), or Fgarbage_collect() is called -- we look
3033 at our list of stack-based Lisp_Objects, and if there are any that
3034 point to Lisp objects with no non-stack references, see if there are
3035 any gcpros pointing to the object, and if not, set a flag indicating
3036 that the object is "destroyed". (Don't abort yet because the function
3037 might not use the object any more.)
3038
3039 4. When we detag a pointer using XFOO(), abort if its "destroyed" flag
3040 is set.
3041
3042 --ben
3043 */
3044
3007 struct gcpro 3045 struct gcpro
3008 { 3046 {
3009 struct gcpro *next; 3047 struct gcpro *next;
3010 const Lisp_Object *var; /* Address of first protected variable */ 3048 const Lisp_Object *var; /* Address of first protected variable */
3011 int nvars; /* Number of consecutive protected variables */ 3049 int nvars; /* Number of consecutive protected variables */
3050 #if defined (__cplusplus) && defined (ERROR_CHECK_GC)
3051 /* Try to catch GCPRO without UNGCPRO, or vice-versa. G++ complains (at
3052 least with sufficient numbers of warnings enabled, i.e. -Weffc++) if a
3053 copy constructor or assignment operator is not defined. */
3054 gcpro () : next (0), var (0), nvars (0) { }
3055 gcpro (const gcpro& g) : next (g.next), var (g.var), nvars (g.nvars) { }
3056 gcpro& operator= (const gcpro& g) { next = g.next; var = g.var;
3057 nvars = g.nvars;
3058 #undef this
3059 return *this;}
3060 #define this c_this
3061 ~gcpro () { assert (!next); }
3062 #endif /* defined (__cplusplus) && defined (ERROR_CHECK_GC) */
3012 }; 3063 };
3013 3064
3014 /* Normally, you declare variables gcpro1, gcpro2, ... and use the 3065 /* Normally, you declare variables gcpro1, gcpro2, ... and use the
3015 GCPROn() macros. However, if you need to have nested gcpro's, 3066 GCPROn() macros. However, if you need to have nested gcpro's,
3016 declare ngcpro1, ngcpro2, ... and use NGCPROn(). If you need 3067 declare ngcpro1, ngcpro2, ... and use NGCPROn(). If you need
3133 gcpro1.next = gcprolist, gcpro1.var = array1, gcpro1.nvars = n1, \ 3184 gcpro1.next = gcprolist, gcpro1.var = array1, gcpro1.nvars = n1, \
3134 gcpro2.next = &gcpro1, gcpro2.var = array2, gcpro2.nvars = n2, \ 3185 gcpro2.next = &gcpro1, gcpro2.var = array2, gcpro2.nvars = n2, \
3135 gcpro3.next = &gcpro2, gcpro3.var = array3, gcpro3.nvars = n3, \ 3186 gcpro3.next = &gcpro2, gcpro3.var = array3, gcpro3.nvars = n3, \
3136 gcprolist = &gcpro3 )) 3187 gcprolist = &gcpro3 ))
3137 3188
3138 #define UNGCPRO ((void) (gcprolist = gcpro1.next)) 3189 #if defined (__cplusplus) && defined (ERROR_CHECK_GC)
3190 /* We need to reset each gcpro to avoid triggering the assert() in
3191 ~gcpro(). This happens in UNGCPRO and longjmp(). */
3192 #define UNWIND_GCPRO_TO(val) \
3193 do \
3194 { \
3195 struct gcpro *__gcpro_stop = (val); \
3196 /* Try to catch UNGCPRO without GCPRO. We arrange for there to be a \
3197 sentinel at the end of the gcprolist, so it should never be NULL. */ \
3198 assert (__gcpro_stop); \
3199 while (gcprolist != __gcpro_stop) \
3200 { \
3201 struct gcpro *__gcpro_next = gcprolist->next; \
3202 gcprolist->next = 0; \
3203 gcprolist = __gcpro_next; \
3204 assert (gcprolist); \
3205 } \
3206 } while (0)
3207 #else
3208 #define UNWIND_GCPRO_TO(val) (gcprolist = (val))
3209 #endif /* defined (__cplusplus) && defined (ERROR_CHECK_GC) */
3210
3211 #define UNGCPRO_1(gcpro1) UNWIND_GCPRO_TO (gcpro1.next)
3212
3213 #define UNGCPRO UNGCPRO_1 (gcpro1)
3139 3214
3140 #define NGCPRO1(var1) ((void) ( \ 3215 #define NGCPRO1(var1) ((void) ( \
3141 ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1, \ 3216 ngcpro1.next = gcprolist, ngcpro1.var = &var1, ngcpro1.nvars = 1, \
3142 gcprolist = &ngcpro1 )) 3217 gcprolist = &ngcpro1 ))
3143 3218
3180 ngcpro1.next = gcprolist, ngcpro1.var = array1, ngcpro1.nvars = n1, \ 3255 ngcpro1.next = gcprolist, ngcpro1.var = array1, ngcpro1.nvars = n1, \
3181 ngcpro2.next = &ngcpro1, ngcpro2.var = array2, ngcpro2.nvars = n2, \ 3256 ngcpro2.next = &ngcpro1, ngcpro2.var = array2, ngcpro2.nvars = n2, \
3182 ngcpro3.next = &ngcpro2, ngcpro3.var = array3, ngcpro3.nvars = n3, \ 3257 ngcpro3.next = &ngcpro2, ngcpro3.var = array3, ngcpro3.nvars = n3, \
3183 gcprolist = &ngcpro3 )) 3258 gcprolist = &ngcpro3 ))
3184 3259
3185 #define NUNGCPRO ((void) (gcprolist = ngcpro1.next)) 3260 #define NUNGCPRO UNGCPRO_1 (ngcpro1)
3186 3261
3187 #define NNGCPRO1(var1) ((void) ( \ 3262 #define NNGCPRO1(var1) ((void) ( \
3188 nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1, \ 3263 nngcpro1.next = gcprolist, nngcpro1.var = &var1, nngcpro1.nvars = 1, \
3189 gcprolist = &nngcpro1 )) 3264 gcprolist = &nngcpro1 ))
3190 3265
3227 nngcpro1.next = gcprolist, nngcpro1.var = array1, nngcpro1.nvars = n1, \ 3302 nngcpro1.next = gcprolist, nngcpro1.var = array1, nngcpro1.nvars = n1, \
3228 nngcpro2.next = &nngcpro1, nngcpro2.var = array2, nngcpro2.nvars = n2, \ 3303 nngcpro2.next = &nngcpro1, nngcpro2.var = array2, nngcpro2.nvars = n2, \
3229 nngcpro3.next = &nngcpro2, nngcpro3.var = array3, nngcpro3.nvars = n3, \ 3304 nngcpro3.next = &nngcpro2, nngcpro3.var = array3, nngcpro3.nvars = n3, \
3230 gcprolist = &nngcpro3 )) 3305 gcprolist = &nngcpro3 ))
3231 3306
3232 #define NNUNGCPRO ((void) (gcprolist = nngcpro1.next)) 3307 #define NNUNGCPRO UNGCPRO_1 (nngcpro1)
3233 3308
3234 #endif /* ! DEBUG_GCPRO */ 3309 #endif /* ! DEBUG_GCPRO */
3235 3310
3236 /* Evaluate expr, UNGCPRO, and then return the value of expr. */ 3311 /* Evaluate expr, UNGCPRO, and then return the value of expr. */
3237 #define RETURN_UNGCPRO(expr) do \ 3312 #define RETURN_UNGCPRO(expr) do \
3294 #endif 3369 #endif
3295 3370
3296 void register_post_gc_action (void (*fun) (void *), void *arg); 3371 void register_post_gc_action (void (*fun) (void *), void *arg);
3297 int begin_gc_forbidden (void); 3372 int begin_gc_forbidden (void);
3298 void end_gc_forbidden (int count); 3373 void end_gc_forbidden (int count);
3299
3300
3301 /************************************************************************/
3302 /* Dumping */
3303 /************************************************************************/
3304
3305 /* dump_add_root_struct_ptr (&var, &desc) dumps the structure pointed to by
3306 `var'. This is for a single relocatable pointer located in the data
3307 segment (i.e. the block pointed to is in the heap). */
3308 #ifdef PDUMP
3309 void dump_add_root_struct_ptr (void *, const struct struct_description *);
3310 #else
3311 #define dump_add_root_struct_ptr(varaddr,descaddr) DO_NOTHING
3312 #endif
3313
3314 /* dump_add_opaque (&var, size) dumps the opaque static structure `var'.
3315 This is for a static block of memory (in the data segment, not the
3316 heap), with no relocatable pointers in it. */
3317 #ifdef PDUMP
3318 void dump_add_opaque (const void *, Bytecount);
3319 #else
3320 #define dump_add_opaque(varaddr,size) DO_NOTHING
3321 #endif
3322
3323 /* dump_add_root_block (&var, &desc) dumps the static structure located at
3324 `var' and described by DESC. This is for a static block of memory (in
3325 the data segment, not the heap), with relocatable pointers in it, as
3326 described by DESC. (#### Not yet implemented) */
3327 #ifdef PDUMP
3328 void dump_add_root_block (void *ptraddress,
3329 const struct lrecord_description *desc);
3330 #else
3331 #define dump_add_root_block(ptraddress,desc) DO_NOTHING
3332 #endif
3333
3334 /* Call dump_add_opaque_int (&int_var) to dump `int_var', of type `int'. */
3335 #ifdef PDUMP
3336 #define dump_add_opaque_int(int_varaddr) do { \
3337 int *dao_ = (int_varaddr); /* type check */ \
3338 dump_add_opaque (dao_, sizeof (*dao_)); \
3339 } while (0)
3340 #else
3341 #define dump_add_opaque_int(int_varaddr) DO_NOTHING
3342 #endif
3343
3344 /* Call dump_add_opaque_fixnum (&fixnum_var) to dump `fixnum_var', of type `Fixnum'. */
3345 #ifdef PDUMP
3346 #define dump_add_opaque_fixnum(fixnum_varaddr) do { \
3347 Fixnum *dao_ = (fixnum_varaddr); /* type check */ \
3348 dump_add_opaque (dao_, sizeof (*dao_)); \
3349 } while (0)
3350 #else
3351 #define dump_add_opaque_fixnum(fixnum_varaddr) DO_NOTHING
3352 #endif
3353
3354 /* Call dump_add_root_object (&var) to ensure that var is properly updated after pdump. */
3355 #ifdef PDUMP
3356 void dump_add_root_object (Lisp_Object *);
3357 #else
3358 #define dump_add_root_object(varaddr) DO_NOTHING
3359 #endif
3360
3361 /* Call dump_add_root_object (&var) to ensure that var is properly updated after
3362 pdump. var must point to a linked list of objects out of which
3363 some may not be dumped */
3364 #ifdef PDUMP
3365 void dump_add_weak_object_chain (Lisp_Object *);
3366 #else
3367 #define dump_add_weak_object_chain(varaddr) DO_NOTHING
3368 #endif
3369
3370 /* Nonzero means Emacs has already been initialized.
3371 Used during startup to detect startup of dumped Emacs. */
3372 extern int initialized;
3373
3374 3374
3375 3375
3376 /************************************************************************/ 3376 /************************************************************************/
3377 /* Misc definitions */ 3377 /* Misc definitions */
3378 /************************************************************************/ 3378 /************************************************************************/
3433 void disksave_object_finalization (void); 3433 void disksave_object_finalization (void);
3434 extern int purify_flag; 3434 extern int purify_flag;
3435 extern EMACS_INT gc_generation_number[1]; 3435 extern EMACS_INT gc_generation_number[1];
3436 int c_readonly (Lisp_Object); 3436 int c_readonly (Lisp_Object);
3437 int lisp_readonly (Lisp_Object); 3437 int lisp_readonly (Lisp_Object);
3438 void copy_lisp_object (Lisp_Object dst, Lisp_Object src);
3438 Lisp_Object build_intstring (const Ibyte *); 3439 Lisp_Object build_intstring (const Ibyte *);
3439 Lisp_Object build_string (const CIbyte *); 3440 Lisp_Object build_string (const CIbyte *);
3440 Lisp_Object build_ext_string (const Extbyte *, Lisp_Object); 3441 Lisp_Object build_ext_string (const Extbyte *, Lisp_Object);
3441 Lisp_Object build_msg_intstring (const Ibyte *); 3442 Lisp_Object build_msg_intstring (const Ibyte *);
3442 Lisp_Object build_msg_string (const CIbyte *); 3443 Lisp_Object build_msg_string (const CIbyte *);
3447 Lisp_Object make_float (double); 3448 Lisp_Object make_float (double);
3448 Lisp_Object make_string_nocopy (const Ibyte *, Bytecount); 3449 Lisp_Object make_string_nocopy (const Ibyte *, Bytecount);
3449 void free_cons (Lisp_Object); 3450 void free_cons (Lisp_Object);
3450 void free_list (Lisp_Object); 3451 void free_list (Lisp_Object);
3451 void free_alist (Lisp_Object); 3452 void free_alist (Lisp_Object);
3452 void mark_conses_in_list (Lisp_Object); 3453 void free_marker (Lisp_Object);
3453 void free_marker (Lisp_Marker *);
3454 int object_dead_p (Lisp_Object); 3454 int object_dead_p (Lisp_Object);
3455 void mark_object (Lisp_Object obj); 3455 void mark_object (Lisp_Object obj);
3456 int marked_p (Lisp_Object obj); 3456 int marked_p (Lisp_Object obj);
3457 extern int funcall_allocation_flag; 3457 extern int funcall_allocation_flag;
3458 extern int need_to_garbage_collect; 3458 extern int need_to_garbage_collect;
3463 3463
3464 #ifdef MEMORY_USAGE_STATS 3464 #ifdef MEMORY_USAGE_STATS
3465 Bytecount malloced_storage_size (void *, Bytecount, struct overhead_stats *); 3465 Bytecount malloced_storage_size (void *, Bytecount, struct overhead_stats *);
3466 Bytecount fixed_type_block_overhead (Bytecount); 3466 Bytecount fixed_type_block_overhead (Bytecount);
3467 #endif 3467 #endif
3468 #ifdef PDUMP 3468
3469 void pdump (void); 3469 #ifdef EVENT_DATA_AS_OBJECTS
3470 int pdump_load (const char *); 3470 Lisp_Object make_key_data (void);
3471 3471 Lisp_Object make_button_data (void);
3472 extern char *pdump_start, *pdump_end; 3472 Lisp_Object make_motion_data (void);
3473 #define DUMPEDP(adr) ((((char *)(adr)) < pdump_end) && (((char *)(adr)) >= pdump_start)) 3473 Lisp_Object make_process_data (void);
3474 #else 3474 Lisp_Object make_timeout_data (void);
3475 #define DUMPEDP(adr) 0 3475 Lisp_Object make_magic_data (void);
3476 #endif 3476 Lisp_Object make_magic_eval_data (void);
3477 3477 Lisp_Object make_eval_data (void);
3478 3478 Lisp_Object make_misc_user_data (void);
3479 #ifdef USE_KKCC 3479 void free_key_data (Lisp_Object);
3480 Lisp_Object allocate_event (void); 3480 void free_button_data (Lisp_Object);
3481 Lisp_Object allocate_key_data (void); 3481 void free_motion_data (Lisp_Object);
3482 Lisp_Object allocate_button_data (void); 3482 void free_process_data (Lisp_Object);
3483 Lisp_Object allocate_motion_data (void); 3483 void free_timeout_data (Lisp_Object);
3484 Lisp_Object allocate_process_data (void); 3484 void free_magic_data (Lisp_Object);
3485 Lisp_Object allocate_timeout_data (void); 3485 void free_magic_eval_data (Lisp_Object);
3486 Lisp_Object allocate_magic_data (void); 3486 void free_eval_data (Lisp_Object);
3487 Lisp_Object allocate_magic_eval_data (void); 3487 void free_misc_user_data (Lisp_Object);
3488 Lisp_Object allocate_eval_data (void); 3488 #endif /* EVENT_DATA_AS_OBJECTS */
3489 Lisp_Object allocate_misc_user_data (void);
3490 #endif /* USE_KKCC */
3491 3489
3492 /* Defined in buffer.c */ 3490 /* Defined in buffer.c */
3493 Lisp_Object get_truename_buffer (Lisp_Object); 3491 Lisp_Object get_truename_buffer (Lisp_Object);
3494 void switch_to_buffer (Lisp_Object, Lisp_Object); 3492 void switch_to_buffer (Lisp_Object, Lisp_Object);
3495 extern int find_file_compare_truenames; 3493 extern int find_file_compare_truenames;
3503 int error_if_deleted_or_does_not_exist); 3501 int error_if_deleted_or_does_not_exist);
3504 int map_over_sharing_buffers (struct buffer *buf, 3502 int map_over_sharing_buffers (struct buffer *buf,
3505 int (*mapfun) (struct buffer *buf, 3503 int (*mapfun) (struct buffer *buf,
3506 void *closure), 3504 void *closure),
3507 void *closure); 3505 void *closure);
3506 void cleanup_buffer_undo_lists (void);
3508 3507
3509 extern struct buffer *current_buffer; 3508 extern struct buffer *current_buffer;
3510 3509
3511 extern void init_initial_directory (void); /* initialize initial_directory */ 3510 extern void init_initial_directory (void); /* initialize initial_directory */
3512 3511
4058 Lisp_Object enqueue_misc_user_event_pos (Lisp_Object, Lisp_Object, 4057 Lisp_Object enqueue_misc_user_event_pos (Lisp_Object, Lisp_Object,
4059 Lisp_Object, int, int, int, int); 4058 Lisp_Object, int, int, int, int);
4060 extern int modifier_keys_are_sticky; 4059 extern int modifier_keys_are_sticky;
4061 4060
4062 /* Defined in event-Xt.c */ 4061 /* Defined in event-Xt.c */
4063 void enqueue_Xt_dispatch_event (Lisp_Object event);
4064 void signal_special_Xt_user_event (Lisp_Object, Lisp_Object, Lisp_Object); 4062 void signal_special_Xt_user_event (Lisp_Object, Lisp_Object, Lisp_Object);
4065 4063
4066 4064
4067 /* Defined in events.c */ 4065 /* Defined in events.c */
4068 EXFUN (Fcopy_event, 2); 4066 EXFUN (Fcopy_event, 2);
4406 4404
4407 4405
4408 /* Lower-level ways to output data: */ 4406 /* Lower-level ways to output data: */
4409 void print_internal (Lisp_Object, Lisp_Object, int); 4407 void print_internal (Lisp_Object, Lisp_Object, int);
4410 void debug_print (Lisp_Object); 4408 void debug_print (Lisp_Object);
4409 void debug_p4 (Lisp_Object obj);
4410 void debug_p3 (Lisp_Object obj);
4411 void debug_short_backtrace (int);
4412 void debug_backtrace (void);
4411 /* NOTE: Do not call this with the data of a Lisp_String. Use princ. 4413 /* NOTE: Do not call this with the data of a Lisp_String. Use princ.
4412 * Note: stream should be defaulted before calling 4414 * Note: stream should be defaulted before calling
4413 * (eg Qnil means stdout, not Vstandard_output, etc) */ 4415 * (eg Qnil means stdout, not Vstandard_output, etc) */
4414 void write_c_string (Lisp_Object stream, const CIbyte *str); 4416 void write_c_string (Lisp_Object stream, const CIbyte *str);
4415 /* Same goes for this function. */ 4417 /* Same goes for this function. */
4453 Lisp_Object internal_with_output_to_temp_buffer (Lisp_Object, 4455 Lisp_Object internal_with_output_to_temp_buffer (Lisp_Object,
4454 Lisp_Object (*) (Lisp_Object), 4456 Lisp_Object (*) (Lisp_Object),
4455 Lisp_Object, Lisp_Object); 4457 Lisp_Object, Lisp_Object);
4456 void float_to_string (char *, double); 4458 void float_to_string (char *, double);
4457 void internal_object_printer (Lisp_Object, Lisp_Object, int); 4459 void internal_object_printer (Lisp_Object, Lisp_Object, int);
4458 void debug_short_backtrace (int);
4459 void debug_backtrace (void);
4460 4460
4461 /* Defined in profile.c */ 4461 /* Defined in profile.c */
4462 void mark_profiling_info (void); 4462 void mark_profiling_info (void);
4463 void profile_increase_call_count (Lisp_Object); 4463 void profile_increase_call_count (Lisp_Object);
4464 extern int profiling_active; 4464 extern int profiling_active;
4877 DECLARE_INLINE_HEADER (int qxeatoi (const Ibyte *string)) 4877 DECLARE_INLINE_HEADER (int qxeatoi (const Ibyte *string))
4878 { 4878 {
4879 return atoi ((const char *) string); 4879 return atoi ((const char *) string);
4880 } 4880 }
4881 4881
4882 DECLARE_INLINE_HEADER (Ibyte *qxestrupr (Ibyte *s))
4883 {
4884 return (Ibyte *) strupr ((char *) s);
4885 }
4886
4887 DECLARE_INLINE_HEADER (Ibyte *qxestrlwr (Ibyte *s))
4888 {
4889 return (Ibyte *) strlwr ((char *) s);
4890 }
4891
4882 int qxesprintf (Ibyte *buffer, const CIbyte *format, ...) 4892 int qxesprintf (Ibyte *buffer, const CIbyte *format, ...)
4883 PRINTF_ARGS (2, 3); 4893 PRINTF_ARGS (2, 3);
4884 4894
4885 /* Do not use POSIX locale routines. Not Mule-correct. */ 4895 /* Do not use POSIX locale routines. Not Mule-correct. */
4886 #define qxestrcoll DO NOT USE. 4896 #define qxestrcoll DO NOT USE.
4920 void buffer_mule_signal_deleted_region (struct buffer *buf, Charbpos start, 4930 void buffer_mule_signal_deleted_region (struct buffer *buf, Charbpos start,
4921 Charbpos end, Bytebpos byte_start, 4931 Charbpos end, Bytebpos byte_start,
4922 Bytebpos byte_end); 4932 Bytebpos byte_end);
4923 4933
4924 /* Defined in unicode.c */ 4934 /* Defined in unicode.c */
4925 extern const struct struct_description to_unicode_description[]; 4935 extern const struct sized_memory_description to_unicode_description;
4926 extern const struct struct_description from_unicode_description[]; 4936 extern const struct sized_memory_description from_unicode_description;
4927 void init_charset_unicode_tables (Lisp_Object charset); 4937 void init_charset_unicode_tables (Lisp_Object charset);
4928 void free_charset_unicode_tables (Lisp_Object charset); 4938 void free_charset_unicode_tables (Lisp_Object charset);
4929 void recalculate_unicode_precedence (void); 4939 void recalculate_unicode_precedence (void);
4930 extern Lisp_Object Qunicode; 4940 extern Lisp_Object Qunicode;
4931 extern Lisp_Object Qutf_16, Qutf_8, Qucs_4, Qutf_7; 4941 extern Lisp_Object Qutf_16, Qutf_8, Qucs_4, Qutf_7;