* src/comp.c (gcc_jit_context_zero) [WINDOWSNT]: Define and define
the prototype of its function pointer.
(init_gccjit_functions) [WINDOWSNT]: Load 'gcc_jit_context_zero
from the DLL.
See the comment at the start of comp.h about this.
* src/comp.c (ABI_VERSION): Make it an integer, and increment.
(ABI_VERSION_SYM): New.
(hash_native_abi): Use it.
(emit_abi_version, check_abi_version): New functions.
(Fcomp__compile_ctxt_to_file0): Emit ABI_VERSION_SYM.
(load_comp_unit): Check ABI version.
* src/comp.c (comp_t): Add n_data_relocs and
n_data_relocs_ephemeral.
(obj_to_reloc): Use them, and handle case of using pointers to
constants.
(emit_static_object): Add FIXMEs.
(declare_imported_data_relocs): Handle case of pointers to
constants vectors differently.
(declare_imported_data): Set comp's number of constants.
(setup_constants): New function.
(load_comp_unit): Don't create roots, pin instead. Don't rely on
tricks to protect ephemeral vector.
(Fnative_elisp_load): Init pins.
* src/comp.h (USE_POINTER_TO_CONSTANT_VECTOR): New. If defined,
don't use vectors.
(Lisp_Native_Comp_Unit): Define data_relocs and data_eph_relocs
depending on USE_POINTER_TO_CONSTANT_VECTOR. Add pin ids
* src/igc.c (unpin): Add an eassert.
(root_create_exact_ptr, igc_root_create_exact_ptr):
Return root list node.
(maybe_destroy_rootI: Removed.
(igc_pin, igc_unpin): New functions.
(igc_root_destroy_comp_unit): Removed.
(igc_init_pin, igc_unpin_comp_unit): New function.
* src/igc.h: Declare new functions, remove old ones.
Keep the mpz_t field in the Lisp_Bignum struct and the indirection so
that we don't need to change the bignum_val function. However, the
value._mp_d fields always points right after the mpz_t.
This patch also changes the peak memory usage for the pidigits benchmark
with MPS:
| | max rss | elapsed time |
|--------+-----------+--------------|
| before | 702316 KB | 16.99 s |
| after | 81128 KB | 17.15 s |
* src/bignum.h (struct Lisp_Bignum): Add room for the limb array.
* src/bignum.c (make_bignum_from_mpz): New.
(make_bignum_bits, make_bignum_str): Use it.
* src/igc.h (fix_bignum): New, needed to adjust the _mp_d field.
(fix_vector): Call it.
(finalize_bignum): Deleted.
(finalize_vector, maybe_finalize): No more finalization for bignums.
* src/pdumper.c (dump_bignum, dump_do_dump_relocation, dump_cold_bignum):
Adapt to new bignums.
Without this, bignum allocations in the pidigits don't properly trigger
GC. This patch changes the peak memory usage for the pidigits benchmark
by a factor of 6. The benchmark also begins to spend much more time in
GC, as it should be:
| | max rss | elapsed time |
|--------+-----------+--------------|
| before | 392472 KB | 6.7 s |
| after | 58512 KB | 32.93 s |
* src/bignum.h (init_gmp_memory_functions): Declare new function.
* src/alloc.c (init_gmp_memory_functions): Implement it.
(xmalloc_for_gmp): New helper.
(xrealloc_for_gmp, xfree_for_gmp): Moved here from bignum.c.
* src/bignum.c (init_bignum): Call init_gmp_memory_functions.
This makes the output look like:
[81338818] GC start: Generation 0 of a chain has reached capacity: start
a minor collection.
[81344807] GC: condemned: 16802688 live: 417424 not_condemned: 58871808
The "[81338818]" part is the time when the message was posted.
* src/igc.c (enable_messages): Include mps_message_type_gc.
(process_one_message): Handler mps_message_type_gc and include the
timestamp.
This allocation point is only needed for the dump. It's simpler to
create and destroy this allocation point in igc_alloc_dump than to do it
for each thread.
* src/igc.c (struct igc_thread): Remove oldgen_ap.
(create_thread_aps): Delete code for oldgen_ap.
(igc_on_pdump_loaded): Create and destroy the allocation point here.
If FLAT_BIGNUMS is defined, Lisp_Bignums are a vector of GMP limbs
instead of a mpz_t (i.e. pointer to limb array).
The primary difficulty was the changed return type of the bignum_val
function. The idiom "*bignum_val (foo)" was used all over the place.
For the flat representation, it seems impossible to define bignum_val
such that it returns a pointer. I changed the return type to a struct,
but that made it necessary to change the idiom to "bignum_val (foo).z".
* src/bignum.h (FLAT_BIGNUMS): Define if HAVE_MPS.
(struct Lisp_Bignums): Define alternative representation.
(struct bignum_val): New helper struct.
(bignum_val): Change return type and define different version for flat
bignums.
(bignum_integer): Define a separate version for flat bignums.
(BIGNUM_VAL): New macro.
(init_gmp_memory_functions): New. Define the prototype here for a
function that is implemented in alloc.c.
(mpz_set_integer): Update for changed xbignum_val.
* src/bignum.c (init_bignum): Call init_gmp_memory_functions.
(make_bignum_from_mpz): New helper.
(make_bignum_bits, make_bignum_str): Adapted for flat bignums.
(bignum_to_double, bignum_to_uintmax, bignum_bufsize, bignum_to_c_string)
(get_random_bignum): Adapt to changed bignum_val.
* src/alloc.c (xmalloc_for_gmp): New.
(xrealloc_for_gmp, xfree_for_gmp): Moved here from bignum.c. Call
tally_consing.
(init_gmp_memory_functions): New.
(cleanup_vector): Adapt to flat bignums.
* src/data.c (Fnatnump, arithcompare, Fminus, integer_remainder)
(Flogcount, Fash, expt_integer, Fadd1, Fsub1, Flognot): Adapt to changed
bignum_val.
* src/emacs-module.c (module_extract_big_integer): Adapt to changed
bignum_val.
* src/floatfns.c (Fabs, Flogb): Adapt to changed bignum_val.
* src/fns.c (Frandom, Ftake, Fntake, Fnthcdr, Fmemql, Feql)
(internal_equal_1, value_cmp, sxhash_bignum): Adapt to changed
bignum_val.
* src/igc.c (finalize_bignum, finalize_vector, maybe_finalize): Adapt to
flat bignums.
* src/pdumper.c (dump_bignum): Define separate version for flat bignums.
(dump_cold_bignum, dump_do_dump_relocation): Adapt to changed
bignum_val.
* src/timefns.c (ztrillion, ticks_hz_to_timespec, ticks_hz_hz_ticks)
(lispint_arith): Adapt to changed bignum_val.
* lisp/vc/diff-mode.el (diff-apply-buffer): New 'no-save'
meaning for fourth optional argument. Reserve other non-nil
values for this argument. Use ngettext for one message.
(diff-apply-hunk): If the region is active, apply all hunks that
the region overlaps, like diff-apply-buffer.
* doc/emacs/files.texi (Diff Mode):
* etc/NEWS: Document the change to diff-apply-hunk.
* lisp/progmodes/cc-defs.el (c-version): Add a comment
encouraging maintainers to keep cc-mode.el's Version: header
the same.
* lisp/progmodes/cc-mode.el (top level): Update the Version:
header to 5.35.2.
* lisp/mouse.el (mouse-position-for-drag-line): New function;
return position of active touch screen tool if a sequence is
being translated into mouse movement events, and the last mouse
position otherwise.
(mouse-drag-line): Invoke `mouse-position-for-drag-line' rather
than reading the mouse position manually.
* lisp/touch-screen.el (touch-screen-current-tool): New 10th
field holding the frame-relative last attested position of this
tool.
(touch-screen-relative-xy): Clarify doc string.
(touch-screen-handle-point-update): Update the said field with
POSN's position relative to its frame.
(touch-screen-handle-touch): Initialize the 10th field of new
tool lists with such a position.
(touch-screen-last-drag-position): New function.
These references are already fixed by 'fix_vectorlike'. Fixing them a
second time is possibly unsafe because the forwarded pointers may have
a different summary.
* src/igc.c (fix_window): Remove explicit 'IGC_FIX12_OBJ' calls.
* lisp/emacs-lisp/package.el (package-dir-info, package-unpack):
Force Dired to return list of packages explicitly marked for
installation. Without the optional argument, Dired will return
the file under the current point if no files are selected.
* lisp/emacs-lisp/cond-star.el (cond*-convert-condition): Bind
unused values to fresh symbols, to avoid the compiler warning
that a symbol starting with an underscore is accessed later on.
This mirrors the behaviour of `if-let*' and family.
* lisp/replace.el (replace--push-stack): Add new args
'next-replacement' and 'match-again' and push them to the stack.
(perform-replace): Restore the previous already calculated values
of 'next-replacement' and 'match-again' from the stack for the
'backup' ('^') key (bug#79811).
* test/lisp/replace-tests.el (query-replace-tests): Add tests.
See https://github.com/editorconfig/editorconfig-emacs/issues/380
* lisp/editorconfig-core-handle.el (editorconfig-core-handle--parse-file):
Fix regexp to not inadvertently match LF. Remove an O(N²) complexity.
Use `line-number-at-pos`.
* lisp/editorconfig.el (editorconfig--get-coding-system): Don't let
errors propagate.
* java/org/gnu/emacs/EmacsNative.java (setEmacsParams): New arg
UIMODE.
(sendConfigurationChanged): New args DETAIL and UI_MODE.
* java/org/gnu/emacs/EmacsNoninteractive.java (main1): Provide
an undefined UI mode.
* java/org/gnu/emacs/EmacsService.java (EmacsService): New field
uiMode.
(onCreate): Initialize this field at start-up and provide the
same to setEmacsParams.
(onConfigurationChanged): If the UI mode has been altered,
generate a configuration changed event to match.
* src/android.c (android_ui_mode): New variable.
(setEmacsParams): New argument UI_MODE. Initialize the same
from this variable.
* src/androidgui.h (enum android_configuration_changed): New
enum.
(struct android_configuration_changed_event): New field
`DETAIL'. Convert fields providing specifics into a union of
display density information and a UI mode integer.
* src/androidterm.c (handle_one_android_event): Handle both
manners of configuration change events.
(android_term_init): Initialize Vtoolkit_theme from UI mode
provided at start-up.
* src/frame.c (syms_of_frame): Always define Vtoolkit_theme.
Define Qtoolkit_theme_set_functions.
* src/gtkutil.c (xg_update_dark_mode_for_all_displays):
* src/w32term.c (w32_read_socket): Generate special toolkit
theme events, rather than executing hooks directly within the
read_socket callback.
* src/keyboard.c (kbd_buffer_get_event)
<TOOLKIT_THEME_CHANGED_EVENT>: Run Qtoolkit_theme_set_functions
and set Vtoolkit_theme from event->ie.arg.
* src/termhooks.h (enum event_kind): New event
TOOLKIT_THEME_CHANGED_EVENT.
* lisp/vc/diff.el (diff-file-local-copy): Use proper coding-system
when writing a local copy of a non-file visiting buffer.
* lisp/misearch.el (coding-system--for-buffer-diff): New variable.
(multi-file-replace-as-diff): Bind it to 'utf-8-emacs'.
(multi-file-diff-no-select): Use proper coding-system when reading
output of Diff. (Bug#79761)
* lisp/vc/vc-dispatcher.el (auto-revert-buffers): Delete.
(vc-resynch-window): Always call vc-revert-buffer-internal.
Calling auto-revert-buffers will not necessarily revert the
current buffer, but we want it to happen synchronously.
As JD Smith <jdtsmith@gmail.com> said we had 3 paths:
1. macro has `autoload-macro expand` and is already loaded: expand
2. macro has `autoload-macro expand` but is /not/ yet loaded: shortcut
3. macro does not have `autoload-macro expand`: shortcut
and the co-existence of 1 and 2 is a problem because it means
that same macro is sometimes handled one way and sometimes
another, with different results.
Remove number 2 by removing from the shortcut all the remaining
macros that have `autoload-macro expand`.
The immediate effect is that `make autoloads` now (auto)loads three
more files:
[...]
loaddefs-gen: loading file frameset (for cl-defun)
Loading frameset...
INFO Scraping 1547 files for loaddefs...10%
INFO Scraping 1547 files for loaddefs...20%
loaddefs-gen: loading file semantic/analyze (for define-overloadable-function)
Loading semantic/analyze...
INFO Scraping 1547 files for loaddefs...30%
INFO Scraping 1547 files for loaddefs...40%
INFO Scraping 1547 files for loaddefs...50%
INFO Scraping 1547 files for loaddefs...60%
INFO Scraping 1547 files for loaddefs...70%
loaddefs-gen: loading file tramp-adb (for tramp--with-startup)
Loading tramp-adb...
INFO Scraping 1547 files for loaddefs...80%
loaddefs-gen: loading file grep (for define-compilation-mode)
Loading grep...
[...]
* lisp/emacs-lisp/loaddefs-gen.el (loaddefs--defining-macros):
Remove macros that are marked `autoload-macro expand`, even if they are
not predefined.
(loaddefs-generate--make-autoload): Simplify accordingly.