1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-04-06 14:22:31 -07:00
Commit graph

188147 commits

Author SHA1 Message Date
Helmut Eller
e4f2d89487 Fix PGTK scrollbars
* 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.
2025-11-02 17:00:30 +01:00
Helmut Eller
45d0c389ec Remove the charset_table_init array
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.
2025-11-02 15:19:50 +01:00
Helmut Eller
0588ad9cbe Copy the charset_table to malloced memory
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.
2025-11-01 18:44:00 +01:00
Gerd Möllmann
9b9c187a6a * src/igc.c (fix_hash_table): Don't fix empty_hash_index_vector 2025-11-01 13:53:24 +00:00
Pip Cet
1a2da25031 Avoid (rarely) turning INVALID_LISP_OBJECT into Qnil when fixing
* src/igc.c (fix_lisp_obj): If 'addr' is NULL but 'tag' isn't, leave
the word alone; it's an INVALID_LISP_OBJECT.
2025-11-01 07:14:31 +00:00
Pip Cet
95fd3ca980 * src/igc.c: Adjust pdumper hashes. 2025-10-31 14:12:05 +00:00
Pip Cet
dfe07bfded Fix thinko in alloc_multi
* src/igc.c (igc_hash): Round up sizes destructively.
2025-10-31 14:10:08 +00:00
Pip Cet
267b2a1cd9 Use a strong Lisp hash table as a weak hash table's strong part
* 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, allocate_weak_hash_table):
(strong_copy_hash_table): Adjust member access.
(strengthen_hash_table_for_dump): Also, fix comment.
(make_weak_hash_table, weak_hash_index_index):
(maybe_resize_weak_hash_table, weak_hash_lookup):
(weak_hash_put, weak_hash_remove_from_table):
(weak_hash_clear, Fhash_table_size, Fhash_table_test):
(Fhash_table_weakness, Fputhash, Fremhash):
* src/igc.c (fix_hash_table, fix_weak_hash_table):
(fix_weak_hash_table_strong_part):
(fix_weak_hash_table_weak_part): Adjust member access.
* src/lisp.h (struct Lisp_Weak_Hash_Table_Strong_Part): Redefine to
include a 'struct Lisp_Hash_Table'.
(WEAK_HASH_KEY, make_lisp_weak_hash_table, WEAK_HASH_VALUE):
(WEAK_HASH_HASH, WEAK_HASH_TABLE_SIZE, DOHASH_WEAK):
(set_hash_value_slot, set_weak_hash_key_slot):
(set_weak_hash_value_slot):
* src/print.c (print_object): Adjust member access.
2025-10-30 22:54:13 +00:00
Pip Cet
d535d85975 Make weak hash tables look like strong hash tables again
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.
2025-10-30 22:54:13 +00:00
Pip Cet
5a784bfd5d Use AWL0 pool for weak hash tables
* src/igc.c (make_pool_awl): Function removed.
(make_igc): Use 'make_pool_awl0' instead.
2025-10-30 22:54:13 +00:00
Pip Cet
813fd88c02 Introduce a function to allocate several Emacs objects in one go
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.
2025-10-30 22:54:13 +00:00
Helmut Eller
7cc4f7a657 Abort if charset_table_init is too small
* src/pdumper.c (dump_charset_table): As requested by Pip.
2025-10-30 21:28:56 +01:00
Helmut Eller
494311785f charset_table_init no longer needs protection
* src/igc.c (root_create_charset_table): Deleted.
2025-10-30 18:45:50 +01:00
Helmut Eller
b6575fa647 Removed dump-pins
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.
2025-10-30 18:42:04 +01:00
Helmut Eller
2b251af993 Copy the charset_table out from the dump
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.
2025-10-30 18:28:56 +01:00
Helmut Eller
699db8d2b3 Allow unaligned addresses in the weak pool
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.
2025-10-30 17:20:10 +01:00
Gerd Möllmann
fa17b233a6 * src/igc.c (igc_alloc_handler): Alloc handlers from MPS on macOS/arm64. 2025-10-30 11:10:04 +01:00
Eli Zaretskii
6ed0916e85 Make w32 threads' stack-bottom alignment be like in thread.c
* 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.
2025-10-30 10:16:03 +02:00
Helmut Eller
e33ceabe6d * src/gc-handles.c: Explain advantages of GC handles 2025-10-29 15:10:54 +01:00
Helmut Eller
2f17f9a372 Move the attribute field of charsets to a separate vector
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.
2025-10-28 09:21:23 +01:00
Helmut Eller
988b4b6c5d * src/gc-handles.c (Fgc_handles_info): Include per-object refcounts 2025-10-27 14:39:25 +01:00
Helmut Eller
7e189d1504 Try to avoid alignment problems with 64 bit builds
* src/w32proc.c (timer_loop): Make stk_bot a pointer; that is more
likely word aligned than a DWORD.
* src/w32fns.c (w32_msg_worker): Idem.
2025-10-26 21:34:18 +01:00
Pip Cet
9395f76710 Remove 'glib_user_data'
* src/gtkutil.c (free_glib_user_data):
* src/gtkutil.h (glib_user_data, get_glib_user_data): Functions
removed.
2025-10-26 14:44:42 +00:00
Pip Cet
e1713417ab Remove glib_user_data in PGTK code
* 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'.
2025-10-26 14:42:27 +00:00
Pip Cet
9d0b537589 New function to count number of allocated gc handles
* src/gc-handles.c (Fgc_handles__refs): New function.
(syms_of_gc_handles): Define it.
2025-10-26 14:27:55 +00:00
Pip Cet
109306480e Don't leak objects through gc_handles
* src/gtkutil.c (xg_free_frame_widgets):
(unref_cl_data):
(xg_mark_data):
(xg_update_menu_item):
(find_icon_from_name):
(update_frame_tool_bar): Use 'free_gc_handle'.
(menuitem_highlight_callback): Use 'gc_handle_value'.
2025-10-26 13:57:29 +00:00
Pip Cet
cf53356c8b Use GC handles to store GTK callback 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.
2025-10-26 13:57:29 +00:00
Eli Zaretskii
31dd90d222 Register with MPS non-Lisp w32 threads that need to access Lisp data
* 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.
2025-10-26 12:28:16 +02:00
Helmut Eller
6595ee3a0a Fix Motif scrollbars using GC handles as for Athena
* src/xterm.c (xt_free_gc_handle): Renamed from xaw_free_gc_handle.
(x_create_toolkit_scroll_bar)
(x_create_horizontal_toolkit_scroll_bar) [MOTIF]: Create a GC handle.
(xm_scroll_callback): Adapt to GC handle.
2025-10-25 20:51:02 +02:00
Eli Zaretskii
a45ca7eeba * src/fns.c (strengthen_hash_table_for_dump): Fix a thinko (bug#79695). 2025-10-25 20:54:52 +03:00
Helmut Eller
33d9346348 Fix horizontal Athena scrollbars
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.
2025-10-25 18:39:39 +02:00
Helmut Eller
b33d0c5982 * src/gc-handles.{h,c}: Add license headers 2025-10-25 17:27:58 +02:00
Pip Cet
eac2799565 Introduce a GC handle type
* src/gc-handles.h: New file.
* src/gc-handles.c: New file.
* src/Makefile.in (base_obj): Add gc-handles.o.
* src/emacs.c (main): Call syms_of_gc_handles.
* src/xterm.c (xaw_jump_callback, xaw_scroll_callback)
x_create_toolkit_scroll_bar): Use GC handles.
(xaw_destroy_scrollbar_callback): New helper.

Co-authored-by: Helmut Eller <eller.helmut@gmail.com>
2025-10-25 17:10:38 +02:00
Gerd Möllmann
8e3cfab962 Fix duplicate root creation
* src/comp.c (load_comp_unit): Create the root for the
compilation unit once only.
2025-10-23 08:55:46 +02:00
Gerd Möllmann
2a2c46346d Check for overlapping roots if checking is enabled
* src/igc.c (check_root): New function.
(register_root): Call it.
2025-10-23 08:55:33 +02:00
Helmut Eller
8d49383f36 Avoid interior pointers into hash table vectors
Create a type alias Lisp_KV_Vector that is a struct Lisp_Vector* for
igc and a naked Lisp_Object* for the old GC.

* src/lisp.h (Lisp_KV_Vector): New typedef.
(kv_vector_data): New helper.
(struct Lisp_Obarray): Make buckets a Lisp_KV_Vector.
(struct Lisp_Hash_Table): Make key and value Lisp_KV_Vectors.
(hash_table_alloc_kv, hash_table_free_kv): Use Lisp_KV_Vector.
(obarray_iter_at_end, HASH_KEY, HASH_KEY, DOHASH, set_hash_key_slot)
(set_hash_value_slot): Adapt to Lisp_KV_Vector.
* src/alloc.c (hash_table_alloc_kv, hash_table_free_kv): Adapt to
Lisp_KV_Vector.
* src/fns.c (make_hash_table, copy_hash_table, maybe_resize_hash_table)
(hash_table_rehash): Adapt to Lisp_KV_Vector.
* src/igc.h (igc_make_hash_table_vec): Return a Lisp_Vector.
* src/igc.c (igc_make_hash_table_vec): Return a Lisp_Vector.
(fix_hash_table, fix_obarray): Use IGC_FIX12_PVEC for
Lisp_KV_Vectors.
* src/lread.c (intern_sym, Funintern, oblookup, make_obarray)
(grow_obarray, Fobarray_clear): Adapt to Lisp_KV_Vector.
* src/pdumper.c (hash_table_contents, hash_table_freeze, dump_hash_vec):
Adapt to Lisp_KV_Vector.
2025-10-22 13:03:58 +02:00
Helmut Eller
0235bf41fd * src/alloc.c (gc_in_progress): Add FIXME/igc 2025-10-19 21:09:51 +02:00
Helmut Eller
3c8f6102db Adjust module tests for igc
* test/src/emacs-module-tests.el (module--gc): New function.
(mod-test-globref-make-test,module--test-assertions--globref-invalid-free)
(module--test-assertion): Use it.
(module--test-assertions--call-emacs-from-gc): Expect this to fail.
(module/function-finalizer): Expect this to pass.
2025-10-19 21:04:58 +02:00
Pip Cet
3771f87703 ; * src/.gdbinit [defined_HAVE_MPS]: Don't print SIGSEGV messages. 2025-10-19 15:30:28 +00:00
Pip Cet
88f7f1c767 Weak hash tables: New test
* test/src/fns-tests.el (ft--test-puthash-types): New function.
(ft-puthash-types-weak): New test.
2025-10-19 14:35:54 +00:00
Pip Cet
93edfeb053 Weak hash tables: further key-or-value fixes
* src/fns.c (weak_hash_clear): Slow case for key-or-value weakness.
(Fputhash): Use the key in the table, not the (potentially different)
key we looked it up with.
(Fremhash): Destroy extra dependencies.
* src/igc.c (igc_xpointer):
(is_builtin_obj): New functions.
(scan_lispsym): Call 'dflt_scan_obj', which scans the extended header,
not 'fix_symbol' directly.
(igc_external_header): New 'is_builtin' argument.  Use it to avoid
crashes.
(find_dependency_replacement):
(remove_dependency_replacement):
(Figc__extra_dependency): New functions.
(Figc__add_extra_dependency): Simplify.  Use
'find_dependency_replacement'.
(Figc__remove_extra_dependency): Use 'find_dependency_replacement'.
Clean up when last dependency is removed.
(Vigc__dependency_replacements): New Lisp variable.
2025-10-19 14:30:29 +00:00
Helmut Eller
422336289b Merge branch 'master' into feature/igc 2025-10-18 21:00:08 +02:00
Helmut Eller
0525d4c033 Update HASH_thread_state 2025-10-18 20:58:45 +02:00
Pip Cet
ccbefa1c35 Weak hash tables: fix Fputhash bug
* src/fns.c (Fputhash): Use old value, not new value, when calling
Figc__remove_extra_dependency.
2025-10-18 18:38:20 +00:00
Pip Cet
4db43e40d6 Weak hash tables: fix long lines and whitespace
* src/fns.c (make_weak_hash_table, weak_hash_from_key)
(set_weak_hash_next_slot, set_weak_hash_hash_slot)
(set_weak_hash_index_slot, allocate_weak_hash_table)
(strong_copy_hash_table, make_weak_hash_table)
(maybe_resize_weak_hash_table, weak_hash_lookup_with_hash)
(weak_hash_put, weak_hash_remove_from_table): Whitespace and
formatting.
2025-10-18 18:23:33 +00:00
Pip Cet
7a7ddb9d8f Weak hash tables: allow small tables
* src/fns.c (make_weak_hash_table): Change lower size limit to 1 from
65.
2025-10-18 18:23:03 +00:00
Pip Cet
75bbe20dc8 Weak hash tables: copy only when necessary
Some changes suggested by Stefan Monnier in
https://lists.gnu.org/archive/html/emacs-devel/2025-10/msg00490.html

* src/fns.c (strong_copy_hash_table): Renamed from
'strengthen_hash_table'.
(strengthen_hash_table_for_dump): Return type changed to 'void'.
(make_weak_hash_table): Error for user-defined hash table tests.
(maybe_resize_weak_hash_table): Use local variable and add comment.
(Fcopy_hash_table): Avoid redundant copy.
(Fhash_table_count): Continue copying, so the count is always
accurate.
(Fhash_table_rehash_size):
(Fhash_table_rehash_threshold):
(Fhash_table_size):
(Fhash_table_test): Avoid creating copy.
(Fmaphash): Adjust API.
(Finternal__hash_table_histogram):
(Finternal__hash_table_buckets): Return nil.
(Finternal__hash_table_index_size):
* src/print.c (print_object): Adjust API.
2025-10-18 18:23:03 +00:00
Helmut Eller
48357dc612 Add a test for puthash
It's actually for a bug on the feature/igc branch.

* test/src/fns-tests.el (ft-puthash-weak): New test
(ft--puthash-weak): New helper.
2025-10-18 20:22:17 +02:00
Juri Linkov
08dc7d0c93 * lisp/minibuffer.el (completion--insert-strings): Use the correct frame.
Provide the 'frame-height' call with the frame of the window where
the *Completions* buffer is displayed for the case when the minibuffer
window uses a dedicated frame (bug#79635).
2025-10-18 20:53:44 +03:00
Alan Mackenzie
97b960ec6d Fix coding error in byte-run--strip-vector/record
* lisp/emacs-lisp/byte-run.el (byte-run--strip-vector/record):
Replace a symbol with position by its bare symbol, rather
than returning it unchanged.
2025-10-18 17:08:02 +00:00