* src/xmenu.c (create_and_show_popup_menu): Use record_unwind_protect
instead of record_unwind_protect_ptr.
(leave_toolkit_menu): Use a Lisp_Object instead of a untagged pointer.
* src/comp.h (USE_POINTER_TO_CONSTANT_VECTOR): If defined, don't
use vectors.
(Lisp_Native_Comp_Unit): Make data_relocs and data_eph_relocs
pointers to Lisp_Object pointers.
* src/comp.c (ABI_VERSION): Increase to 13.
(check_comp_unit_relocs): Don't check if pointers are used.
* src/comp.c (load_comp_unit, Fcomp__register_lambda): Handle
case that constant vectors are pointers.
* src/comp.c (emit_static_object): Add some FIXME comments.
(declare_imported_data_relocs): Handle case of pointers to
constants vectors differently.
* src/comp.c (declare_imported_data_relocs): Make array elemen
type volatile.
* src/comp.c (comp_t): Add n_data_relocs and
n_data_relocs_ephemeral.
(obj_to_reloc): Set array length correctly.
(declare_imported_data_relocs): Return # of constants.
(declare_imported_data): Set comp's number of constants.
* src/igc.c (root_create_exact_ptr, igc_root_create_exact_ptr):
Return root list node.
* src/igc.h (igc_root_create_exact_ptr): Change return type.
* src/pdumper.c (dump_do_dump_relocation): Don't do fixup if
using pointers to constants vectors.
* src/comp.h (struct Lisp_Native_Comp_Unit): Add member
data_eph_vec.
* src/comp.c (load_comp_unit): Use data_eph_vec to protect the
eph constants.
* test/src/emacs-module-resources/mod-test.c
(Fmod_test_address_to_userptr, Fmod_test_userptr_to_address):
Avoid compilation warnings when 'intmax_t' is a 64-bit type, while
pointers are 32-bit wide.
* src/fns.c (restore_mutability):
(hash_table_user_defined_call): Use 'record_unwind_protect', not
'record_unwind_protect_ptr', and adjust accordingly.
This should ensure the value is properly marked by GC.
* src/regex-emacs.c (unwind_re_match):
(re_match_2_internal): Use a Lisp_Object for the callback argument.
* src/igc.c (igc_assert_not_an_mps_object): New function.
* src/eval.c (record_unwind_protect_ptr):
(record_unwind_protect_ptr_mark):
(record_unwind_protect_module): Use it.
* src/igc.c (fix_user_ptr): Ignore the p field.
* test/src/test/src/emacs-module-tests.el (mod-test-unaligned-userptr):
New test.
* test/src/emacs-module-resources/mod-test.c
(Fmod_test_address_to_userptr, Fmod_test_userptr_to_address): New
helpers.
We used to trace the pointer in Lisp_Misc_Ptr objects just in case it
points to an object on the GC heap without knowing much of the intended
use. However, make_misc_ptr is primarily used by make_mint_ptr for
unaligned pointers. MPS ignores unaligned references and, if enabled,
unaligned references cause an igc_assertion to fail. So tracing the
pointer is either useless or counterproductive.
* src/igc.c (fix_misc_ptr): Ignore the pointer field.
* src/gtkutil.c (free_gc_handle_callback): New.
(xg_finish_scroll_bar_creation): Use it instead of free_glib_gc_handle.
* src/pgtkterm.c (xg_scroll_callback, xg_end_scroll_callback): Adapt to
gc_handles.
Determining the best size for a static array seems difficult; so
allocate it dynamically.
* src/charset.c (CHARSET_TABLE_INIT_SIZE): New constant.
(syms_of_charset): Malloc charset_table here.
(charset_table_init): Removed.
(shrink_charset_table): New function.
(Fclear_charset_maps): Call it.
* src/charset.h (charset_table_init): Removed.
(charset_attributes_getter): Add an assertion.
* src/pdumper (dump_charset_table, dump_do_dump_relocation): Assert that
charset_table_size == charset_table_used.
The charset_table_init array can't be used because it may be too small.
* src/pdumper.c (RELOC_CHARSET_TABLE): New reloc type.
(dump_charset_table): Emit RELOC_CHARSET_TABLE.
(dump_do_dump_relocation): Implement the RELOC_CHARSET_TABLE case.
A weak hash table is now once again a pointer to a structure that
looks like a strong hash table.
* src/fns.c (weak_hash_from_key, set_weak_hash_next_slot):
(set_weak_hash_hash_slot, set_weak_hash_index_slot):
(WEAK_HASH_NEXT, WEAK_HASH_INDEX): Use Lisp_Objects or integers, not
the old 'struct Lisp_Weak_Hash_Table_Entry' type.
(allocate_weak_hash_table): Rewrite to use ...
(allocate_weak_hash_table_parts): ... this new function.
(make_weak_hash_table, weak_hash_index_index): Adjust entry types.
(maybe_resize_weak_hash_table): Reuse
'allocate_weak_hash_table_parts'.
(weak_hash_lookup_with_hash, weak_hash_put):
(weak_hash_remove_from_table, weak_hash_clear):
(Fhash_table_size, Fputhash): Adjust entry types.
* src/igc.c (fix_weak, IGC_FIX12_WEAK): Function and macro removed.
(fix_weak_hash_table_strong_part):
(fix_weak_hash_table_weak_part): Rewritten to use interior pointers
rather than making assumptions about the memory layout.
(weak_hash_table_entry, make_weak_hash_table_entry): Functions
removed.
(igc_alloc_weak_hash_table_strong_part):
(igc_alloc_weak_hash_table_weak_part): Rewritten to use 'alloc_multi'.
* src/igc.h:
* src/lisp.h (struct Lisp_Weak_Hash_Table_Entry): Type removed.
(struct Lisp_Weak_Hash_Table_Strong_Part)
(struct Lisp_Weak_Hash_Table_Weak_Part): Remove flexible 'entries' array.
(WEAK_HASH_KEY, WEAK_HASH_VALUE, WEAK_HASH_HASH)
(WEAK_HASH_TABLE_SIZE, weak_hash_table_index_size):
(DOHASH_WEAK, set_weak_hash_key_slot):
(set_weak_hash_value_slot): Adjust types of hash table entries.
Hash table weak and strong parts cannot be described as C structures,
since they consist of a sequence of variably-sized objects.
* src/igc.c (alloc_multi): New function.
These objects are no longer used.
* src/igc.c (pinned_objects_in_dump): Deleted
(igc_on_pdump_loaded): Skip creating pins.
(fix_charset_table): This should no longer be needed.
This is a preparation step to remove the pinned charset objects from the
GC heap.
* src/pdumper.c (dump_charset_table): Copy the charset_table back to
charset_table_init.
(dump_fixup_type.DUMP_FIXUP_CHARSET_CODE_SPACE_MASK): New fixup type.
(dump_reloc_type.RELOC_CHARSET_CODE_SPACE_MASK): New reloc type.
(dump_cold_charset): Emit fixup to relocate the code space mask.
(dump_do_fixup): Implemented DUMP_FIXUP_CHARSET_CODE_SPACE_MASK.
(dump_do_dump_relocation): Implemented RELOC_CHARSET_CODE_SPACE_MASK.
* src/charset.c (charset_table): Initialize charset_table here, not ...
(syms_of_charset): ... here.
* src/igc.c (igc_on_pdump_loaded): Remove assertion. charset_table no
longer points to the beginning of the dump.
When compiled with igc_debug, fix_weak_hash_table_strong_part can
trigger assertion failures because it calls fix_raw with unaligned
addresses. I assume that the AWL pool will filter out unaligned
addresses and the assertion is not needed.
* src/igc.c (fix_weak, IGC_FIX12_WEAK): New.
(fix_weak_hash_table_strong_part, fix_weak_hash_table_weak_part): Use
it.
* test/src/fns-tests.el (ft-weak-fixnums): New test.
(ft--test-weak-fixnums): New helper.
* src/igc.h (w32_aligned_stack_pos): New union.
* src/w32proc.c (timer_loop):
* src/w32fns.c (w32_msg_worker): Use it to ensure proper alignment
of stack bottom. Evidently, MPS requires it to be aligned as the
'Word' type used by MPS, see
https://lists.gnu.org/archive/html/emacs-devel/2025-10/msg00767.html
for the details.
This simplifies the GC code, as this was the only field in the charset
struct that referenced the GC heap. Without it, we no longer need to
trace the charset_table.
* src/charset.h (struct charset.attributes): Removed.
(charset_attributes_getter): New helper.
(CHARSET_ATTRIBUTES): Use it.
* src/charset.c (charset_attributes_table): New.
(Fdefine_charset_internal): Place attrs in charset_attributes_table.
(syms_of_charset): Initialize charset_attributes_table.
(mark_charset): Deleted.
* src/pdumper.c (dump_charset): Skip attributes field.
* src/lisp.h (mark_charset): Deleted.
* src/igc.c (fix_charset_table): Nothing to do anymore.
* src/alloc.c (garbage_collect): mark_charset no longer needed.
* src/pgtkmenu.c (menu_highlight_callback, menubar_selection_callback)
(popup_selection_callback):
* src/pgtkterm.c (size_allocate, pgtk_set_event_handler): Use
'gc_handle' or raw pointer, not 'glib_user_data'.
* src/gtkutil.c (struct xg_frame_tb_info): Use 'gc_handle', not
'Lisp_Object'.
(free_glib_gc_handle): New function.
(hierarchy_ch_cb, qttip_cb): Use 'gc_handle', not 'glib_user_data'.
(style_changed_cb): Use pointer directly, not through
'glib_user_data'.
(xg_create_frame_widgets,xg_create_frame_outer_widgets): Use
'gc_handle' or pointer.
(xg_free_frame_widgets) [MPS]: Use 'xfree'
(create_dialog, xg_dialog_response_cb, xg_dialog_run):
(xg_toggle_notify_cb, xg_get_file_with_chooser): Use pointers
directly.
(make_cl_data, update_cl_data, unref_cl_data): Use 'gc_handle' values.
(xg_mark_data): Simplify, since 'gc_handle' values are marked elsewhere.
(menuitem_destroy_callback, menu_destroy_callback): Use pointers
directly.
(xg_create_one_menuitem): Use 'gc_handle' values for callback data.
(menu_bar_button_pressed_cb, create_menus):
(xg_update_menu_item): Use 'gc_handle' values.
(menubar_map_cb): Use pointer to stack variable.
(xg_update_frame_menubar, find_scrollbar_cb): Use 'gc_handle' value.
(xg_get_widget_from_map): Use pointer to stack variable.
(xg_gtk_scroll_free_scroll_bar_cell): Funtion removed.
(xg_finish_scroll_bar_creation): Use 'gc_handle' value. The object we
create a handle for is unprintable and must not be leaked to Lisp.
(draw_page):
(xg_print_frames_dialog): Use 'gc_handle' values.
(xg_tool_bar_callback, xg_tool_bar_help_callback): Use integers cast
to pointers.
(tb_size_cb): Use 'gc_handle' value.
(xg_create_tool_bar) [MPS]: Use 'xmalloc'.
(xg_make_tool_item): Use integers cast to pointers.
(update_frame_tool_bar): Use 'gc_handle' values.
(free_frame_tool_bar) [MPS]: Use 'xfree'.
(xg_im_context_commit, xg_widget_style_updated):
* src/gtkutil.h (xg_menu_cb_data, xg_menu_item_cb_data):
* src/xmenu.c (menu_highlight_callback, menubar_selection_callback):
Use 'gc_handle' values, not Lisp_Object values.
* src/igc.c (w32_add_non_lisp_thread)
(w32_remove_non_lisp_thread) [HAVE_NTGUI]: New functions to
register w32 threads with MPS.
* src/igc.h: Define their prototypes.
* src/w32proc.c (timer_loop):
* src/w32fns.c (w32_msg_worker) [HAVE_MPS]: Call
'w32_add_non_lisp_thread' when the thread starts and
'w32_remove_non_lisp_thread' when it is about to exit.
Must use GC handles there too.
* src/xterm.c (xaw_jump_callback, xaw_scroll_callback)
(x_create_toolkit_scroll_bar): Some reformatting.
(xaw_free_gc_handle): Renamed from xaw_destroy_scrollbar_callback.
(x_create_horizontal_toolkit_scroll_bar): Create a GC handle.