XEmacs -- Emacs: The Next Generation
English
German
Japanese
America
Asia
Australia
Europe
 
     Searching XEmacs
Quick Links About XEmacs Getting XEmacs Customizing XEmacs Troubleshooting XEmacs Developing XEmacs
      

XEmacs 21.5.37 "lettuce" is released

goto announcement, summary, changes

From: Aidan Kehoe <kehoea@parhasard.net>
To: kehoea@parhasard.net
Subject: XEmacs 21.5.37 "lettuce" is released.
Date: Thu, 24 Sep 2026 21:42:49 +0100
Organization: The XEmacs Project


*          XEmacs 21.5.37 "lettuce" is released.
      "lettuce" is the thirty-eighth in the VEGETABLE series.

This is a point release to allow packaging of XEmacs 21.5 on current Cygwin. 
Work to allow this was performed by Henry S. Thompson. Thank you Henry. Cygwin
requires a specific release be made to provide a package.

Apart from bug-fixing, most of the other work was on the dump infrastructure,
removing the need to rehash hash tables when loading after dumping, pushing to
dump time much code that had been done after normal startup, removing the need
to relocate data within the dump file if the dump file is dumped into the
executable on non-ASLR configurations, marking the dump-time only code with
__attribute__ (__cold__) (improving performance and locality of code reference
for normal run time), moving make-docfile.c to Lisp, a language much better
suited to manipulating text.

Other work that will be important for the long-term is the increase in bit
width of the lrecord TYPE field to 16 from 8 and, relatedly, moving
lrecord_implementations_table to being a dynamically-resizable array. This 
allows modules to create many more Lisp object types.

Alan Mackenzie prompted synch of regexp-opt.el to current GNU Emacs and dumping
of this file, which will make working with packages (and especially cc-mode)
much more reliable.

This is the development line.  The current series started with XEmacs
21.5.0 (an alias for XEmacs 21.4.0 "Solid Vapor", the first release in
the current stable line).  21.5 is the code base for introduction of
major new subsystems and fixes to design bugs that experience shows will
introduce instability.  So far the main effort has been on improved
support for Unicode, updates to the build infrastructure, and development
of new features in memory allocation.

For general information about XEmacs, the developers, and the user
community, see our home page,

		       http://www.xemacs.org/

* XEmacs 21.5.37 is "beta" software. 

The usual "no warranty" disclaimer (see etc/COPYING, sections 10 and 11)
applies.  At this point in time, it is the version that most developers
are using for their daily work.  However, it is certain that many bugs
remain and new ones will be introduced as development proceeds.  Be sure
to take care to save your work often and follow a regular backup regime.

* Availability

Anonymous ftp:

             ftp://ftp.xemacs.org/pub/xemacs/xemacs-21.5

See http://www.xemacs.org/Install/ for more information about building
from source.

Also, if you don't have the packages yet, see

        http://www.xemacs.org/Documentation/packageGuide.html.

Mercurial repository:

              https://foss.heptapod.net/xemacs/xemacs

This is a read-only Mercurial repository.  To check out XEmacs 21.5.37,
use the command

    hg clone -r r21-5-37 https://foss.heptapod.net/xemacs/xemacs

to create a new Mercurial workspace, or

                        hg pull -u -r r21-5-37

if you already have a local workspace from Mercurial.  To update to the
most recent commits to the official repository, use

                            hg pull -u tip

For more details, see

             http://www.xemacs.org/Develop/hgaccess.html

Changes in XEmacs 21.5.37 “leeks”

goto announcement, summary, changes

Major Features, Bugfixes, and Backward Incompatible Changes

  • Fix: Avoid OpenSSL header conflicts on windows, get Cygwin building (Henry S. Thompson
  • Fix: Get XEmacs building as C++ under Visual Studio (Aidan Kehoe
  • Fix: Handle -display correctly once more on X11 (Aidan Kehoe
  • Fix: Turn on -fno-strict-aliasing unconditionally with clang, avoid crashes (Aidan Kehoe, Mike Sperber
  • Fix: Don't crash when Fselected_window() returns nil. (Aidan Kehoe
  • Fix: Produce zero-length bit vectors without crashing, error-checking builds (Aidan Kehoe
  • Fix: Printing char tables respecting print-table-noreadably-length (Aidan Kehoe
  • Fix: Appropriate type checking with #'ephemeron-ref, avoid crashes (Aidan Kehoe
  • Fix: Avoid crashing when profiling with optimization and -flto (Aidan Kehoe
  • Fix: Get -unmapped working on Windows (Aidan Kehoe
  • Fix: Accept symbols naming charsets in MATCHSPEC, #'face-property-matching-instance (Aidan Kehoe, Martin Ward
  • Fix: Restore bugfix for progress bar crashes on X11 (Aidan Kehoe, Mats Lidell
  • Fix: Avoid a crash when encountering isolated trailing surrogates, UTF-16, UCS-4 (Aidan Kehoe, Stephen J. Turnbull
  • Fix: Restore some itimer variables used by buggy versions of gnus. (Aidan Kehoe
  • Improve: Synch regexp-opt.el with GNU. Dump it for now. (Aidan Kehoe, Alan Mackenzie
  • Improve: Increase the size of frob blocks on 64 bit architectures, speeding up allocation (Aidan Kehoe

User-Visible Bug Fixes and Improvements

  • Improve: Copy the selected rectangle properly if buffer read-only, #'kill-rectangle (Aidan Kehoe
  • Improve: Reduce heap allocation, flickering of the gutter tabs at redisplay (Aidan Kehoe
  • Improve: Correct behavior with uninterned handler arg name, #'backtrace-in-condition-handler-eliminating-handler (Aidan Kehoe
  • Improve: NAS audio slows startup, default to off unless specified on with configure (Aidan Kehoe
  • Fix: Some very rare crashes due to insufficient protection against garbage collection (Aidan Kehoe
  • Fix: Copy leading #! across to byte compiled output when dealing with scripts (Aidan Kehoe
  • Fix: Minor bugfixes of the modules implementation (Aidan Kehoe
  • Fix: Avoid creating multiple gnuclient instances on the same TTY (Aidan Kehoe

Build Infrastructure and Source Tree

  • Fix: Pass --embed-dir to the compiler with out of tree builds, meaning #embed succeeds (Henry S. Thompson, Aidan Kehoe
  • Fix: Allow builds --without-modules to succeed (Henry S. Thompson, Aidan Kehoe
  • Fix: Port make-docfile.c to Lisp, remove need for separate step in build, special docstring handling at dump time. (Aidan Kehoe
  • Fix: Get config.el working with current autoconf. (Aidan Kehoe
  • Fix: Avoid generating a lock file when generating custom-load.el, cus-dep.el (Aidan Kehoe
  • Improve: Update nt/xemacs.mak to remove mention of InfoDock, Mule (Aidan Kehoe
  • Improve: Remove FASTCALL option from nt/xemacs.mak, not actually faster, irrelevant with 64 bit Windows (Aidan Kehoe
  • Improve: Remove debug.h, debug.c, not actually used; rely on compile-time assertion (Aidan Kehoe

Documentation

  • Remove documentation of the old byte-char algorithm from the Internals manual (Aidan Kehoe
  • Move documentation of keyword arguments from CL to the Lispref (Aidan Kehoe
  • Extensive updates to the Internals manual to reflect current reality (Aidan Kehoe
  • Remove documentation of executing-macro from Lispref, executing-kbd-macro long preferred (Aidan Kehoe
  • Document `labels' beside `defun', encourage its use in the Lispref (Aidan Kehoe
  • Remove documentation of Blocktype, superseded by lcrecord lists (Aidan Kehoe
  • Update Lispref to reflect recent development (Aidan Kehoe
  • Extensive updates to the Lispref to reflect current reality (Aidan Kehoe

Lisp API

  • New: #'reduce-across-buffers, process all live buffers without consing (Aidan Kehoe
  • Improve: Remove visibility to Lisp of constants, subroutines, backquote.el (Aidan Kehoe
  • Improve: Remove visibility after dump of #'dump-emacs, #'run-emacs-from-temacs (Aidan Kehoe
  • Improve: Move #'decode-coding-string, #'encode-coding-string to C, respect NOCOPY (Aidan Kehoe
  • Improve: Make #'position, #'find, #'mismatch much cheaper for the common case (Aidan Kehoe
  • Improve: Increase the number of entries in tab-stop-list (Aidan Kehoe
  • Improve: Synch #'regexp-quote with GNU (Aidan Kehoe
  • Fix: Don't return the current buffer if passsed a fixnum or a character, #'decode-buffer (Aidan Kehoe

Internal API and Implementation

  • Improve: Port #'Snarf-documentation, #'Verify-documentation to Lisp, remove from dumped binary (Aidan Kehoe
  • Improve: Port ellcc.c to Lisp, avoid need for separate build infrastructure, any C-level bugs (Aidan Kehoe
  • Improve: Mark lrecord_implementations_table const, giving more correctness, tiny speedup (Aidan Kehoe
  • Improve: Make the TYPE field of a Lisp_Object sixteen bits wide rather than eight (Aidan Kehoe
  • Improve: Resize hash tables of count one or zero at dump time to be of size 3, leak less memory (Aidan Kehoe
  • Improve: Remove need to relocate dump data at normal startup, non-ASLR builds (Aidan Kehoe
  • Improve: Eliminate need to rehash dumped hash tables in normal use (Aidan Kehoe
  • Improve: Mark the dump infrastructure with __attribute__ (__cold__), improving locality of reference for normal runtime (Aidan Kehoe
  • Improve: Remove need for many reinit_vars_of_FILE() functions, normal startup (Aidan Kehoe
  • Improve: Move the lcrecord next pointer out of the Lisp object, reducing dump file size, improving locality of reference (Aidan Kehoe
  • Improve: Move #'when, #'unless to Lisp, no longer provide macros from C, simplifying C implementation (Aidan Kehoe
  • Improve: Make Vbuffer_alist into a normal list named Vbuffer_list, allowing a simple implementation for #'reduce-across-buffers (Aidan Kehoe

Testing and Debugging

  • Mark tests of coding cookies on the last page with Implementation-Incomplete-Expect-Errors (Aidan Kehoe, Mats Lidell
  • Test recent changes in #'call-interactively (Aidan Kehoe
  • Test #'decode-buffer errors correctly if passed a char or a fixnum (Aidan Kehoe
  • Check byte compiler warns appropriately when setting, binding constant symbols (Aidan Kehoe
  • Check that Lisp errors appropriately on dereferencing an unbound variable (Aidan Kehoe
  • Test the NOCOPY arguments to #'decode-coding-string, #'encode-coding-string (Aidan Kehoe
  • Check that all entries in DOC are picked up by #'built-in-symbol-file (Aidan Kehoe
  • Check that the names of interned dumped symbols are not modifiable from Lisp (Aidan Kehoe
  • Check that isolated trailing UTF-16 surrogates treated as error octets, UTF-16, UCS-4 (Aidan Kehoe
  • Merge regexp-opt-tests from GNU. (Aidan Kehoe
  • Check that #'ephemeron-ref errors correctly if supplied a non-ephemeron. (Aidan Kehoe
  • Test #'bury-buffer, #'record-buffer (Aidan Kehoe

ChangeLogs for XEmacs 21.5.37 "lettuce"

goto announcement, summary, changes

ChangeLog Entries from ChangeLog

goto announcement, summary, changes

2026-09-17  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac:
        Move identification of non-GCC compilers earlier in this
        file. Detect clang.
        * configure.ac:
        Unconditionally turn off strict aliasing for clang. Thank you Mike
        Sperber.

2026-09-02  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac (XE_COMPLEX_ARG):
        Remove documentation of modules as experimental.
        * configure: Regenerate.

2026-06-24  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac:
        Check for the size of max_align_t, helpful in changes today to
        avoid leaking a word of data for every lcrecord allocated.
        * configure: Regenerate.

2026-05-15  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac (have_aslr): New.
        Pass the information as to whether ASLR is present at configure
        time to C by means of a new HAVE_ASLR #define, to allow the dumper
        to avoid relocating dumped data on -nopie builds with DUMP_IN_EXEC.
        * configure: Regenerate.

2026-02-28  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac:
        If __has_embed and building out-of-tree, GCC and
        clang need --embed-dir=$blddir/src/ in CFLAGS.
        Check that this option works before adding it (don't specifically
        check for GCC or clang, in case other compilers end up accepting
        the same argument).
        Thank you Henry S. Thompson.
        * configure: Regenerate.

2026-02-28  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac (MAKE_DOCFILE): Remove this AC_SUBST() var, missed in
        7da6404f9317 .
        * configure: Regenerate.

2026-02-08  Aidan Kehoe  <kehoea@parhasard.net>

        * Makefile.in.in:
        Remove the dependency on lib-src for modules, now ellcc is in
        Lisp.
        * Makefile.in.in (install-arch-dep): Make a symbolic link for
        ellcc in ${bindir}, pointing at ${lispdir}/ellcc.elc.
        * Makefile.in.in (install-arch-indep):
        Give ellcc.elc executable permissions.

        * configure.ac (HAVE_SHLIB):
        Initialize MOD_CC as the XEmacs executable with
        -no-configured-paths --script ellcc.elc -- as arguments. Motivate
        this choice in a comment.
        * configure.ac:
        No further need to have lib-src/ellcc.h in ac_config_files.
        Correct spelling for config.values.el.
        * configure: Regenerate.

2026-01-26  Aidan Kehoe  <kehoea@parhasard.net>

        * configure: Regenerate.
        * configure.ac (AC_CONFIG_COMMANDS):
        Revert to appending those parameters defined with AC_DEFINE(),
        AC_DEFINE_UNQUOTED() to config.values at configure time, the
        approach of the last commit did not work.
        To this end, create a new awk(1) script by copying and appending
        to autoconf's defines.awk, just printing the hash table keys and
        values that autoconf created for them.

2026-01-25  Aidan Kehoe  <kehoea@parhasard.net>

        * Makefile.in.in (${srcdir}/lib-src/config.values.in):
        Update the rule to generate this to use config.values.elc,
        removing a needless dependency on Perl which the old
        config.values.sh had.
        * configure.ac:
        Remove code that attempted to add entries for parameters defined
        with AC_DEFINE() and AC_DEFINE_UNQUOTED() to
        lib-src/config.values, which has not worked since the move to
        autoconf 2.56 in 2005 with 3580ae2ce979 .
        This is now handled by config.values.el.
        * configure: Regenerate.

2026-11-24  Aidan Kehoe  <kehoea@parhasard.net>

        Get modules building on macOS Sequoia.
        * Makefile.in.in:
        Add src as a dependency of the various module subdirectories,
        current macOS refuses to build the modules in the absence of the
        XEmacs binary with parallel builds.
        * configure.ac:
        If we're on Darwin and building with module support, add -rdynamic
        to start_flags, necessary for -flto to work in my testing.
        Document the dependency needed within Makefile.in.in for parallel builds.
        * configure: Regenerate.

2026-01-02  Aidan Kehoe  <kehoea@parhasard.net>

        * configure: Regenerate.
        * configure.ac:
        Check for C99 before attempting to #define _XOPEN_SOURCE.
        Never #define _XOPEN_SOURCE_EXTENDED.
        Don't #define _XOPEN_SOURCE, _POSIX_C_SOURCE on FreeBSD, this is
        counterproductive.
        See
        https://lists.freebsd.org/pipermail/freebsd-standards/2004-March/000474.html ,
        https://gist.github.com/jperkin/b08f9108daf8d0ac695067d71f882a9d
        . Thank you Hauke Fath.

2025-10-26  Aidan Kehoe  <kehoea@parhasard.net>

        * Makefile.in.in (distclean):
        Add top-realclean-noconfig as a dependency of this, remove
        generated ELC files given we will be working on the byte compiler
        for the foreseeable future. Thank you for the bug report, Henry
        S. Thompson.

2025-09-04  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac: Fix autodetection of libpng with the C++ build,
        which requires a declaration for strcmp().
        * configure: Regenerate.

2025-08-11  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac: NAS slows startup significantly if no network
        audio server is available, as is usual these days. Default NAS
        sound to off, unless explicitly configured with it on.
        * configure: Regenerate.

2025-08-04  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac:
        .incbin was introduced into GNU AS July 2001.
        macOS pre clang used GNU code from before then quite late, and so
        there exist occasional machines still running that don't recognise
        .incbin. Detect this at ./configure time, default to
        --without-dump-in-exec if this is the case.
        * configure: Regenerate.

2025-07-09  Aidan Kehoe  <kehoea@parhasard.net>

        * configure.ac: Add a missing trailing \ to the Postgresql
        detection code, fix a bug introduced in d4c3f8ee1490 . Thank you
        Ulrich Müller and Leonid Kopylov of the Gentoo project, see
        https://bugs.gentoo.org/959683 .
        * configure: Regenerate.

2025-06-15  Aidan Kehoe  <kehoea@parhasard.net>

        * CHANGES-beta:
        Add new skeleton for 21.5.37.

ChangeLog Entries from etc/ChangeLog

goto announcement, summary, changes

None.

ChangeLog Entries from lib-src/ChangeLog

goto announcement, summary, changes

2025-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.37 "lettuce" is released.

2026-08-20  Aidan Kehoe  <kehoea@parhasard.net>

        * gnuslib.c (read_line):
        Fix a bug in this regarding DESTSIZE and where to put the zero
        termination, thank you GCC.

2026-04-12  Aidan Kehoe  <kehoea@parhasard.net>

        * pop.c:
        Declare POP_ERROR as big enough to hold ERROR_MAX chars plus a
        terminating zero, silence a warning regarding strncpy(), thank you
        gcc.

2026-02-28  Aidan Kehoe  <kehoea@parhasard.net>

        * config.values.in:
        Remove an entry for MAKE_DOCFILE from this, which is gone.

2026-02-10  Aidan Kehoe  <kehoea@parhasard.net>

        * etags.c (write_classname):
        Use snprintf() for its bounds checking here, avoid a warning from
        GCC regarding use of strncat().

2026-02-08  Aidan Kehoe  <kehoea@parhasard.net>

        * Makefile.in.in (PUBLIC_INSTALLABLE_EXES):
        Remove ellcc from this.
        * Makefile.in.in (PRIVATE_INSTALLABLE_EXES):
        Remove make-docfile from this.

        * Makefile.in.in (distclean-noconfig):
        Remove ellcc.h from this.
        * Makefile.in.in (ellcc_args): Removed.
        * Makefile.in.in (ellcc_deps): Removed.
        * Makefile.in.in (ellcc): Removed.
        All no longer necessary now ellcc is in Lisp.

        * Makefile.in.in (make-docfile): Removed.
        No longer necessary as a target now ellcc is in Lisp and core
        XEmacs no longer uses the C make-docfile.

        * ellcc.c: File removed.
        * ellcc.h.in: File removed.
        * make-docfile.c: File removed.
        All no longer needed, implemented in Lisp.

2026-01-26  Aidan Kehoe  <kehoea@parhasard.net>

        * config.values.in:
        Regenerate given changes to config.values.el.

2026-01-25  Aidan Kehoe  <kehoea@parhasard.net>

        * config.values.in:
        Regenerate this using lisp/config.values.elc.
        * config.values.sh: File removed.
        Replaced by ../lisp/config.values.el.

2025-12-13  Aidan Kehoe  <kehoea@parhasard.net>

        Revert to not printing the nil result of #'gnuserv-edit-files
        after gnuclient finishes up.
        * gnuserv.h:
        Document that SYSV_IPC hasn't worked since 1997. Wrap the
        INTERNET_DOMAIN_SOCKETS #define in #ifdef HAVE_SOCKET. Wrap the
        SYSV_IPC #define in #ifdef HAVE_SYSVIPC and !defined
        (INTERNET_DOMAIN_SOCKETS) and !defined (UNIX_DOMAIN_SOCKETS).
        * gnuserv.h (enum print_behavior):
        New enum, specifying print behaviour for
        disconnect_from_ipc_server(), disconnect_from_server
        * gnuclient.c:
        Counter an argument from Ben that gnuclient should be moved into
        the XEmacs binary. I agree with him that gnuserv should likely be
        in the XEmacs.
        * gnuclient.c (tell_emacs_to_resume):
        Pass PRINT_BEHAVIOR_NO_PRINT to disconnect_from{,_ipc}_server().
        * gnuclient.c (main):
        Ditto.
        * gnuslib.c (connect_to_ipc_server):
        Use snprintf() here now we have it.
        * gnuslib.c (disconnect_from_ipc_server):
        Implement that PRINT_BEHAVIOR_PRINT_NON_NIL value for ECHO.
        * gnuslib.c (disconnect_from_server):
        Ditto.

2025-12-06  Aidan Kehoe  <kehoea@parhasard.net>

        * gnuclient.c (main):
        gnuserv.el can now error with gnuclient -nw if we attempt to
        create a frame on a suspended console; print that error on
        disconnection.

2025-11-28  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.c (put_filename):
        Remove an assertion regarding the file name length, handled
        differently now DOC is generated in Lisp.

ChangeLog Entries from lisp/ChangeLog

goto announcement, summary, changes

2025-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.37 "lettuce" is released.

2026-09-02  Aidan Kehoe  <kehoea@parhasard.net>

        * code-files.el:
        * code-files.el (:compile-toplevel):
        Use #'globally-declare-fboundp for #'load-module, to suppress
        warnings at compile time if this build does not have module
        support.
        * code-files.el (load):
        Respect NOERROR when loading a module (though this is incomplete).

2026-08-07  Aidan Kehoe  <kehoea@parhasard.net>

        Minor further work, gutter-items.el.
        * gutter-items.el (buffers-tab-omit-some-buffers):
        Buffer names can never be non-zero in length, no need to check
        with this.
        No need for a #'load-time-value for the cache, the cache will
        never be initialized in normal runtime, and defvar will not set
        the value if it is currently bound.
        * gutter-items.el (update-tab-in-gutter):
        When calling #'set-glyph-image, pass a copy of INSTANTIATOR, which
        is a dumped constant that we shortly clear.

2026-07-25  Aidan Kehoe  <kehoea@parhasard.net>

        * gutter-items.el (buffers-tab-omit-some-buffers):
        Make this a bit more idiomatic, make the cache into a defvar with
        a private symbol name, call #'cdar on the result of
        #'set-weak-list-list.

        * gutter-items.el (buffers-tab-items):
        Be more conservative of memory in this function, called at
        practically every redisplay.
        Use #'reduce-across-buffers, only add entries to the list of
        buffers examined if they are not matched by
        buffers-tab-omit-function or a couple of other minor restrictions.
        Use #'delete-if-not rather than #'mapcan when checking
        buffers-tab-filter-function, since the #'mapcan conses a new list.
        Call #'map-into with the generated buffer list when constructing
        the list of vectors, don't cons a fresh list.

        * gutter-items.el (update-tab-in-gutter):
        Be more conservative of memory in this function. Examine the
        existing instantiator and only set the glyph image and mark the
        gutter dirty if it differs from the one we have determined to be
        up to date.
        
        * gutter-items.el (first-in-buffer-list): New label.
        * gutter-items.el (last-in-buffer-list): New label.
        * gutter-items.el (switch-to-next-buffer-in-group): Use
        #'first-in-buffer-list, #'last-in-buffer-list here to avoid
        needless consing.
        * gutter-items.el (switch-to-previous-buffer-in-group): Ditto.
        * modeline.el (modeline-update-buffer-names):
        Avoid noise in M-x profile-results RET, examine the buffers
        directly in the FUNCTION argument to #'reduce-across-buffers,
        don't use the key argument.

2026-07-21  Aidan Kehoe  <kehoea@parhasard.net>

        * gutter-items.el (buffers-tab-omit-some-buffers):
        Avoid creating garbage at every redisplay in this function, rather
        cache the result of (mapconcat #'concat buffers-tab-omit-list
        "\\|").
        If buffers-tab-omit-list is the default "\\` ", don't even fire up
        the regexp engine, just check if the first character of the name
        is space with aref.

2026-07-12  Aidan Kehoe  <kehoea@parhasard.net>

        * iso8859-1.el (ascii-case-table): Removed.
        * mule/english.el:
        * mule/english.el (ascii-case-table): New.
        Move ascii-case-table here from iso8859-1.el, a better home for it
        given #'ascii-text-p is also here.

2026-05-30  Aidan Kehoe  <kehoea@parhasard.net>

        * modeline.el (modeline-update-buffer-names):
        Implement this in terms of #'reduce-across-buffers, just added,
        reducing the need for heap allocation at every redisplay.

2026-05-16  Aidan Kehoe  <kehoea@parhasard.net>

        * ellcc.el (call-process-and-exit):
        Echo PROGRAM as well as ARGUMENTS when --mode=verbose, give
        clearer messages.

2026-04-23  Aidan Kehoe  <kehoea@parhasard.net>

        Revert 8943a7bad974 for now, restore support for old-eq and the
        version 19 bytecodes, pending wide diffusion packages built with a
        a recent change to 21.4 ( 0c8c47c51ac6 ) that fixed a bug in the
        byte compiler to not generate version 19 bytecodes.
        * bytecomp.el:
        * bytecomp.el (61):
        * bytecomp.el (154):
        * test-harness.el (test-harness-from-buffer):

2026-04-12  Aidan Kehoe  <kehoea@parhasard.net>

        * msw-init.el (make-device-early-mswindows-entry-point):
        Adjust the initial-frame-plist if initial-frame-unmapped-p as does
        the X11 code, aid in getting -unmapped working on Windows.

2026-04-07  Aidan Kehoe  <kehoea@parhasard.net>

        * subr.el (backtrace-in-condition-handler-eliminating-handler):
        This has never worked when HANDLER-ARG-NAME is an uninterned
        symbol, fix that. In passing write the backtrace to a stream made
        with #'make-string-output-stream rather than a buffer as
        #'with-output-to-string requires.

2026-04-06  Aidan Kehoe  <kehoea@parhasard.net>

        * dumped-lisp.el (preloaded-file-list):
        Add regexp-opt to this temporarily to make sure any package
        version of the file is not picked up; can be removed once
        xemacs-base packages without regexp-opt.el are widely deployed.
        The other file for which this might be an issue, easy-mmode.el, is
        already dumped.

2026-04-05  Aidan Kehoe  <kehoea@parhasard.net>

        * regexp-opt.el (regexp-opt):
        Synch API, doc string with GNU.
        Bind max-specpdl-size as we did previously and is still relevant
        pending lexical scope.
        * regexp-opt.el (regexp-opt-not-groupie*-re): Removed.
        * regexp-opt.el (subregexp-context-p): New. From GNU's subr.el;
        had previously been in the package copy of regexp-opt.el, which we
        never used in 21.5 because of the package-suppress infrastructure,
        which infrastructure is now gone. No further need for
        regexp-opt-not-groupie*-re.
        * regexp-opt.el (regexp-opt-depth):
        Use #'subregexp-context-p here.
        * regexp-opt.el (regexp-opt-group):
        Synch with GNU and with the packages copy of this code. Find
        shared suffixes as well as shared prefixes, recurse on both. Use
        (member* 1 (cdr strings) :key #'length) instead of GNU's #'any,
        which is an alias for #'member-if and does not accept a :key
        argument.
        * regexp-opt.el (regexp-opt-charset):
        Revise and simplify this drastically. The char-table
        implementation already finds the ranges for us, use that. Take a
        list of characters rather than a list strings of length one as the
        argument. Return a regexp that matches nothing if the argument is
        zero in length. 

2026-03-30  Aidan Kehoe  <kehoea@parhasard.net>

        * coding.el:
        Remove commented-out code that defined #'big5-coding-system-p,
        #'shift-jis-coding-system-p, etc, superseded by
        #'wrong-subtype-argument.
        * console.el:
        Remove code that defined #'console-x-p, #'console-tty-p, etc,
        superseded by #'wrong-subtype-argument.
        * cl-macs.el (wrong-subtype-argument): New.
        To be called from C in the very rare (currently nonexistent) event
        that a continuable error is to be signalled when a console,
        specifier, coding-system, etc of the wrong subtype is supplied.
        Provided in this file since #'cl-make-type-test is available here
        and this will be called rarely enough that it doesn't need to be
        dumped.

2026-03-22  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.el:
        Stupidly truncate compiled-function-annotations to avoid the need
        to reorganize the table after pdump_load(). Will be no longer
        needed once compiled_function_annotation() fishes the function
        name from DOC.

2026-03-19  Aidan Kehoe  <kehoea@parhasard.net>

        * simple.el (what-cursor-position):
        * subr.el:
        * subr.el (string-width):
        * unicode.el (decode-char):
        * mule/mule-cmds.el (init-mule-at-startup):
        * code-init.el (coding-system-variable-default-value):
        * faces.el:
        * faces.el (face-font-instance):
        * help.el (help-with-tutorial):
        * lib-complete.el (find-library):
        * lib-complete.el (find-library-other-window):
        * lib-complete.el (find-library-other-frame):
        Remove mention of non-Mule from docstrings for these functions.

        * setup-paths.el (paths-construct-load-path):
        Fix indentation for this in passing.

2026-03-19  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.el:
        Rephrase and simplify the check for dumping to just purify-flag,
        rather than (and purify-flag (member "dump" command-line-args)).
        Rename #'subusage to #'usage-1 for style consistence with the rest
        of our Lisp.

2026-03-16  Aidan Kehoe  <kehoea@parhasard.net>

        * coding.el:
        Add functions big5-coding-system-p, shift-jis-coding-system-p,
        etc. within this file as a comment. Motivate why, motivate while
        removing these predicates entirely is reasonable.
        * console.el (define-console-type-predicates):
        Provide console-tty-p, console-x-p and friends as
        predicates. Motivate why removing them completely is reasonable.
        * specifier.el:
        Remove carbon, add stream to the list of tags that should be
        defined as tags with an #'ignore device-predicate if they don't
        exist.

2026-02-21  Aidan Kehoe  <kehoea@parhasard.net>

        * ellcc.el (:init):
        Supply the argument list of the docs_of_MODULE_NAME() function
        definition as (void), silence a clang warning in the generated
        MODULE_NAME_i.c files.

2026-02-08  Aidan Kehoe  <kehoea@parhasard.net>

        * ellcc.el: New file.
        Move the implementation of ellcc to this file from
        ../lib-src/ellcc.c.  Use make-docfile.elc rather than
        ../lib-src/make-docfile.c (now gone) for init mode.

2026-02-08  Aidan Kehoe  <kehoea@parhasard.net>

        * cl-macs.el (process-stderr-filter): New defsetf for this.
        There are likely many more defsetfs missing for recently-added
        setters (e.g. #'compiled-function-documentation) and I will get to
        them another day.

2026-01-26  Aidan Kehoe  <kehoea@parhasard.net>

        * config.el (config-value-hash-table):
        No longer check for unexpanded AC_SUBST calls, will no longer
        happen.
        Accept non-string values in the hash table.
        * config.values.el (configure):
        No longer attempt (and fail) to deal with AC_DEFINE(),
        AC_DEFINE_UNQUOTED(), leave this to configure.ac as was done with
        older autoconf. See changes to configure.ac.

2026-01-25  Aidan Kehoe  <kehoea@parhasard.net>

        * config.el:
        Update copyright, authorship.
        * config.el (config-value-hash-table):
        Extensive changes to this function.
        1. Explicitly use #'intern with the relevant buffer substring for
        the key names, rather than #'read. E.g. KVM_GET_PROCESS_SIZE(k)
        cannot just be read.
        2. Use #'with-temp-buffer rather than re-implementing it.
        3. config.values.el ensures that keys are not multiple, no need to
        handle that.
        * config.el (expand-configuration-parameters): New label.
        4. Expand configuration parameters recursively, to make this
        useful to, e.g. ellcc.
        * config.values.el: New file.
        Port lib-src/config.values.sh to Lisp; update it to handle autoconf >= 2.56 

2026-01-24  Aidan Kehoe  <kehoea@parhasard.net>

        * faces.el (face-property-matching-instance):
        Don't pass non-symbol, non-charset objects to #'find-charset in
        this function, avoid an error with C-u C-x =.

2026-01-09  Aidan Kehoe  <kehoea@parhasard.net>

        * startup.el (command-line-do-help):
        Document the --script command line option.
        Update documentation of -nd, -sd, 
        * startup.el (Encoding options): Remove mention of -nui (which has
        been removed) and -eol (which is no longer useful, now support for
        non-mule is gone).
        * startup.el (command-line-do-script):
        Flesh out information on this.

2026-01-04  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.el (sanitize-C-command-line-arg):
        No need to parse the entire file when working out whether a C file
        has DEFUN(), DEFVAR_.*(), etc, return immediately on encountering
        the first. Use the fact that the OUTPUT-STREAM argument to
        #'scan-C-file can be a function to implement this.

2025-12-26  Aidan Kehoe  <kehoea@parhasard.net>

        Fix various bugs, further clean-ups. make-docfile.el.
        * make-docfile.el:
        Flesh out comments.
        * make-docfile.el (subusage, usage):
        Move this label up within the main (labels ...) form. No need for
        a further call within #'usage.
        * make-docfile.el (unquote-for-DOC): New.
        * make-docfile.el (read-symbol-soft): New.
        Provide these labels, necessary to fix bugs in
        #'Snarf-documentation.
        * make-docfile.el (Snarf-documentation): Call them.
        Delay the call to #'unintern on compiled-function-annotations
        until after #'Verify-documentation is done.
        * make-docfile.el (Verify-documentation): Warn if the
        documentation was lost for anonymous functions where their
        annotation is a string.
        * make-docfile.el:
        Remove obsolete special handling for NEEDTODUMP, .exe files.
        Remove string annotations from compiled-function-annotations after
        #'Verify-documentation was called; call unintern on the symbol
        once this is done.

2025-12-25  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.el (compiled-function<):
        New label, used to sort the anonymous compiled functions before
        writing their documentation and file information to DOC, and when
        loading that information in #'Snarf-documentation.
        * make-docfile.el (scan-C-file): No longer add a trailing newline
        to the file name provided.

        * make-docfile.el:
        Construct an alist mapping from file names to those anonymous
        compiled functions loaded from those file names, by mapping across
        COMPILED-FUNCTION-ANNOTATIONS.
        Use that alist to write docstrings and file information for
        anonymous functions to DOC, using the compiled function equal hash
        (which does not depend on pointer values and so will be stable
        from XEmacs invocation to XEmacs invocation) and then
        lexicographic sort on the documentation string to distinguish
        the compiled functions.
        No longer add a trailing newline to the file name provided,
        anywhere.

        * make-docfile.el (Snarf-documentation): Interpret
        "\037Sfile-name\037f#<compiled-function :hash..." entries in DOC,
        call #'set-compiled-function-documentation on those anonymous
        functions ultimately found by means of
        COMPILED-FUNCTION-ANNOTATIONS, saving space in the dump file and
        giving the dumper less work to do.

2025-12-20  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.el (Snarf-documentation):
        internal-doc-filename-buffer-size has been renamed to
        internal-doc-file-name-buffer-size, update this function
        accordingly.

2025-12-17  Aidan Kehoe  <kehoea@parhasard.net>

        * faces.el (face-property-matching-instance):
        Also accept symbols naming charsets as MATCHSPEC, for better
        compatibility with 21.4. Thank you Martin Ward.

2025-12-06  Aidan Kehoe  <kehoea@parhasard.net>

        * obsolete.el ('temporary-file-directory): New, GNU-compatible,
        alias for #'temp-directory.
        Remove an outdated comment in passing.
        * obsolete.el (max-char):
        Clarify the docstring for this function in passing.

2025-12-05  Aidan Kehoe  <kehoea@parhasard.net>

        Initialize internal-doc-file-name to something sensible at startup
        in the same way we do every other path, simplifying
        open_doc_file() in doc.c and simplifying testing.

        * make-docfile.el (Snarf-documentation): Don't initialize
        internal-doc-file-name here, leave it to vars_of_doc() and the
        startup code.
        * setup-paths.el:
        * setup-paths.el (paths-find-internal-doc-file-name): New.
        Return a workable value internal-doc-file-name at startup in the
        same way we do for e.g. doc-directory.
        * startup.el (startup-setup-paths): Use it.

        * loadup.el: In passing, don't manipulate load-history when
        dumping, this has a dump_mark_nil_lisp_object() in lread.c anyway
        so it is a waste of time.

2025-12-06  Aidan Kehoe  <kehoea@parhasard.net>

        * gnuserv.el (gnuserv-error-if-existing): New.
        * gnuserv.el (gnuserv-edit-files):
        Check if we have an existing gnuclient connection open to a given
        TTY, and error if so, before creating a new device on that
        TTY. Avoids problems with my own usage pattern of gnuclient, then
        C-z, then gnuclient once more on the same TTY, giving problems.
        Unfortunately can't just send SIGCONT to the existing process, the
        shell also has to restore tty modes that were in place when it was
        suspended, and there is no mechanism for XEmacs to prompt it to do
        this.

2025-11-30  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.el:
        Add a long comment documenting the format of DOC.

2025-11-28  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.el (Snarf-documentation):
        Set internal-doc-filename-buffer-size to the longest stretch from a
        symbol documentation's position back to the beginning of its file
        name encountered, then unintern it so Lisp can't modify it after
        pdump_load(). See changes to doc.c.

2025-11-26  Aidan Kehoe  <kehoea@parhasard.net>

        * cus-dep.el (Custom-make-dependencies-1):
        Use #'with-temp-buffer and #'insert-file-contents-internal when
        examining custom-load.el read-only for the old custom dependency
        hash table; there's no good reason to make for a lock file and
        Toralf Förster has recently reported Gentoo bug 966027 regarding
        unintended generation of one. Thank you Toralf.

        Mats Lidell also raises the issue that the previous
        #'find-file-noselect likely shouldn't be leaving a lock file like
        that, and there is likely an underlying bug provoking this. He is
        right, but this bug (in #'find-file-noselect) will be low on the
        priority list for the foreseeable future.

2025-11-25  Aidan Kehoe  <kehoea@parhasard.net>

        Minor bugfixes, lisp/. 

        * backquote.el:
        Substitute the definition of #'bq-process for the symbol within
        #'bq-process-2, missed in last commit.

        * loadhist.el (symbol-file):
        Use #'expand-file-name rather than #'concat when constructing a
        file name under source-directory. This will work if
        source-directory does not exist, thankfully.

        * make-docfile.el (output-args):
        Revert to reversing load-history and C-files before writing DOC,
        since later-encountered docstrings override earlier-encountered
        docstrings.

2025-11-24  Aidan Kehoe  <kehoea@parhasard.net>

        * backquote.el:
        * backquote.el (bq-backquote-marker):
        * backquote.el (bq-backtick-marker):
        * backquote.el (bq-comma-marker):
        * backquote.el (bq-at-marker):
        * backquote.el (bq-dot-marker):
        * backquote.el (bq-comma-flag):
        * backquote.el (bq-at-flag):
        * backquote.el (bq-dot-flag):
        * backquote.el (bq-process):
        * backquote.el (bq-process-2):
        * backquote.el (bq-comma):
        * backquote.el (bq-process-1):
        Remove visibility of these from user code (and remove the
        possibility of user code trivially modifying them or binding them)
        by means of a literal macro definition-and-call (cannot use
        #'symbol-macrolet or #'macrolet this early in bootstrap).

        Make #'bq-process-1, #'bq-comma inline, they are trivial.

        When loading the file as compiled code, do an #'nsubst with
        :descend-structures t on the other compiled functions, replacing
        the symbol names of #'bq-process-2, #'bq-process with their
        compiled function definitions. This is what #'labels would have
        done were it available this early in bootstrap.

2025-11-19  Aidan Kehoe  <kehoea@parhasard.net>

        * loadhist.el (symbol-file):
        Revise this, now the results of `built-in-symbol-file' are all
        either absolute or relative to source-directory
        (not yet for modules, but soon).
        * make-docfile.el (usage): If this function is called in a
        non-batch XEmacs, throw to top level and display the usage string
        in a help buffer, rather than killing XEmacs.
        * make-docfile.el (canonicalize-file-name-for-output):
        Always return either an absolute path, or a path relative to
        source-directory, simplify #'symbol-file.
        * make-docfile.el:
        When manipulating the local copy of the load-history, call
        #'file-truename if we haven't found the file on load-path, and if that
        works, update the file name appropriately. Fixes the path to loadup.el
        in DOC.
        No longer reverse load-history, C-files, not needed.

2025-11-18  Aidan Kehoe  <kehoea@parhasard.net>

        * cl-extra.el: Remove definitions for #'remassoc, #'remrassoc,
        #'remrassq, #'remassq from this file, move them to obsolete.el as
        was always the intention but as was previously not practical.
        * obsolete.el: Provide them here.

2025-11-18  Aidan Kehoe  <kehoea@parhasard.net>

        * loadup.el:
        Call #'unintern on 'dump-emacs, 'run-emacs-from-temacs as part of
        the dump process, avoid Lisp visibility of #'dump-emacs. This
        latter function just crashes XEmacs if called after successful
        pdump_load(), and the former function is not useful and would
        crash XEmacs except that it has a check that avoids this and
        refuses to run.

2025-11-17  Aidan Kehoe  <kehoea@parhasard.net>

        * byte-optimize.el (byte-optimize-encode-decode-string): New
        optimizer for #'encode-coding-string, #'decode-coding-string; pass
        the NOCOPY argument if STRING would otherwise be immediately GCed.
        * make-docfile.el (scan-C-file): Correct a spelling in the
        documentation for this function.

2025-11-15  Aidan Kehoe  <kehoea@parhasard.net>

        * coding.el (decode-coding-string): Moved to file-coding.c.
        * coding.el (encode-coding-string): Moved to file-coding.c.
        These Lisp implementations (using temporary buffers) were very
        expensive in terms of garbage collection for their many calls in
        make-docfile.el, and it was non-trivial to implement the NOCOPY
        arg, so it was never done.

2025-11-15  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecomp.el (byte-compile-output-as-comment):
        No longer quote zero bytes with ^A, hopefully easing parsing by
        doc.c:get_doc_string at some point in the future.
        * make-docfile.el:
        Extensive bugfixes, a significant performance enhancement to this
        file.
        Add a #! line in preparation for this file being called by ellcc
        as part of the build process.
        * make-docfile.el:
        Instead of calling #'with-temp-buffer for every C file that needs
        to be processed, use the same buffer, and call
        #'kill-all-local-variables, #'erase-buffer on it every time.
        * make-docfile.el (usage):
        Remove an extraneous colon in the usage message.
        * make-docfile.el (fatal): Only call #'kill-emacs if
        noninteractive, otherwise, just error, avoid killing XEmacs if the
        user just does M-x byte-compile-and-load-file RET out of habit.
        * make-docfile.el (response-file-as-list): Use BUFFER and clear it
        rather than calling #'with-temp-buffer.
        * make-docfile.el (write-escaping-as-C-string): Escape ?\" as well
        as ?\n, ?\\, fix a bug.
        * make-docfile.el (needs-quoting-for-DOC): New label, return
        non-nil if a character is ?\037 or ?\001.
        * make-docfile.el (quote-for-DOC): New label. If a string has
        ?\037 or ?\001, return it with those characters quoted using
        ?\001, as is interpreted by unparesseuxify_doc_string() in doc.c;
        otherwise return the string itself.
        * make-docfile.el (write-C-docstring): New, optional, QUOTE
        argument, meaning call #'quote-for-DOC on the string, as is
        appropriate when writing to DOC and as is not appropriate when
        writing module docstrings.
        * make-docfile.el (scan-C-file):
        Use BUFFER rather than #'with-temp-buffer. Pass
        #'write-C-docstring its new QUOTE arg.
        * make-docfile.el (Snarf-documentation):
        Use BUFFER rather than #'with-temp-buffer. Use #'quote-for-DOC as
        appropriate.
        * make-docfile.el: Kill BUFFER when finished with it.

2025-11-13  Aidan Kehoe  <kehoea@parhasard.net>

        * startup.el (command-line-do-script):
        If FILE contains a slash and is non-absolute, determine its
        truename using #'expand-file-name and use that, improving POSIX
        support for #!/usr/bin/env xemacs-script.

2025-11-10  Aidan Kehoe  <kehoea@parhasard.net>

        Move #'Snarf-documentation, #'Verify-documentation to
        make-docfile.el. Update calls to #'compiled-function-doc-string to
        call #'compiled-function-documentation instead, now its preferred
        name.

        * apropos.el (apropos-safe-documentation):
        Just call #'compiled-function-documentation explicitly within
        this, we do not need to be portable to other implementations.
        * files.el (and):
        Call #'compiled-function-documentation, the preferred name, rather
        than #'compiled-function-doc-string.
        * loadup.el:
        Delegate calling #'Snarf-documentation, #'Verify-documentation to
        make-docfile.elc.
        * make-docfile.el:
        * make-docfile.el (weird-doc): New label. Ported from doc.c.
        * make-docfile.el (Snarf-documentation): New label. Ported from
        doc.c.
        * make-docfile.el (kludgily-ignore-lost-doc-p): New label. Ported
        from doc.c.
        * make-docfile.el (Verify-documentation): New label. Ported from
        doc.c.
        * make-docfile.el:
        When dumping, call #'Snarf-documentation, #'Verify-documentation,
        as did loadup.el previously, but use the labels within this file,
        so there is no need to have those functions available (and
        useless) in a dumped XEmacs.
        * misc.el (:load-toplevel):
        Call #'compiled-function-documentation instead of
        #'compiled-function-doc-string now the former is the preferred name.
        * modeline.el (make-modeline-command-wrapper):
        Ditto.

2025-11-10  Aidan Kehoe  <kehoea@parhasard.net>

        * cl-macs.el (defstruct):
        Give a docstring for cl-struct-STRUCT-NAME-tags, silence a lost
        docstring warning from #'Verify-documentation (which should have
        complained about this already, but was buggy.)
        * paths.el (initialize-xemacs-paths):
        Don't store the dump-time value of the paths examined in symbols
        interned in obarray, instead use (eval-when-compile) to create an
        alist, and modify the cdr of that.
        Fix a bug, this function examined mh-libs, while the symbol of
        interest is mh-lib.
        * window-xemacs.el (__buffer-dedicated-frame): Removed.
        Replace this with an uninterned symbol by means of
        #'symbol-macrolet, silence a lost docstring warning.
        * window-xemacs.el (buffer-dedicated-frame): Initialize this
        function using #'defalias rather than #'defun, to allow the
        #'symbol-macrolet to do its work.
        * window-xemacs.el (set-buffer-dedicated-frame): Ditto.

2025-11-06  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecomp.el (byte-compile-from-buffer):
        * bytecomp.el (byte-compile-insert-header):
        Copy any #! hash bang interpreter specification across to the
        output file, facilitating compilation of XEmacs Lisp scripts.
        To this end, increase byte-compile-checks-and-comments-space by
        the length of any initial #! line encountered before compiling a
        file.
        * bytecomp.el (byte-compile-output-file-form):
        Add a missing parenthesis in a comment here in passing.

2025-11-06  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.el (sanitize-C-command-line-arg):
        Generalise handling of files without any DEFVAR_*, DEFUN() or
        DEFINE_LISP_OBJECT() when checking whether DOC is out of date at
        dump time.

2025-10-27  Aidan Kehoe  <kehoea@parhasard.net>

        * loadup.el (source-directory):
        Correct this when configured --srcdir; if this is the case, on
        POSIX source-lisp is actually a symbolic link pointing to lisp/
        within the actual source directory, and so (expand-file-name ".."
        (file-truename source-lisp)) gives the right answer.
        As far as I can see this has never worked at any point since Ben's
        introduction of separate build and source directories in
        4542b72c005e of 2003-02-08 (at that point the relevant variable
        was source-root). Fixing it today gets aaf28990a2bd building with
        --srcdir.
        
2025-10-25  Aidan Kehoe  <kehoea@parhasard.net>

        Get aaf28990a2bd building on Cygwin and Visual Studio.

        * make-docfile.el (build-obj): New local variable.
        Reflects build-directory/nt/obj on a native Windows build,
        build-src on a non-Windows build.
        * make-docfile.el (sanitize-C-command-line-arg):
        Avoid checking whether dump-id.c is out of date, since Visual
        Studio regenerates it with every build.
        If being called when dumping, only scan a putative C file (given a
        .o file) if it exists, since on Cygwin there are also many .o files in
        src/ without a corresponding .c file, compare the stupid rules of
        my last ChangeLog entry.
        * make-docfile.el:
        If there are no putative C files when dumping give a fatal error,
        since that suggests the relevant directory is wrong.
        No longer remove "TopLevelEmacsShell.o" "TransientEmacsShell.o"
        from the list of files we're interest in.
        * update-elc.el (lisp-files-needing-early-byte-compilation):
        Clarify a comment regarding make-docfile.
        * update-elc.el:
        If DOC doesn't exist, we need to dump, set
        dump-target-out-of-date-wrt-dump-files appropriately.

2025-10-25  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.el:
        Kludge around a couple of stupid rules in ../src/Makefile.in.in
        that do mv EmacsShell-sub.o TransientEmacsShell.o and mv
        EmacsShell-sub.o TransientEmacsShell.o, fix the X11 build.

2025-10-25  Aidan Kehoe  <kehoea@parhasard.net>

        * files.el (convert-standard-filename):
        Use #'defalias rather than #'fset for our munging of
        #'convert-standard-file-name on non-windows-nt platforms, so it
        gets an entry in the load history.
        * loadup.el (member):
        Check for DOC being out of date and generate it directly at the
        time of dump, if necessary, now the data-segment-full-of-GCed
        memory problem of unexec is gone.

2025-10-24  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.el:
        * make-docfile.el (usage): New label.
        * make-docfile.el (fatal): New label.
        * make-docfile.el (sanitize-C-command-line-arg): New label.
        * make-docfile.el (canonicalize-file-name-for-output): New label.
        * make-docfile.el (response-file-as-list): New label.
        * make-docfile.el (scan-C-file): New label.

        Port the C implementation of make-docfile to this file.

        #'load the relevant files and examine load-history after the fact
        rather than parsing compiled Lisp in a very fragile manner.
        For the C files there is no alternative to loading them and
        parsing them; do this using #'re-search-forward, #'skip-chars and
        friends, do the same manipulation of the docstrings and the
        C strings in the modules output that make-docfile.c did.

        If purify-flag is non-nil and we are being called when dumping
        XEmacs, examine the C sources corresponding to the object files in
        build-src rather than checking the command line arguments for C
        sources. Plan is to call this from loadup.el when dumping; not yet
        possible for other, fixable, reasons.

        Handle -o, -a, -E, -i, @RESPONSE-FILE, NEEDTODUMP, *.exe, *.elc?
        as did the C implementation if those are passed as command line
        arguments. Accept -o - to mean to write to standard output. New
        -?, --help options, both meaning to print a usage message.

        Write the coding system detected for the source C files when -E
        passed (meaning to generate output appropriate for modules).

        * bytecomp.el (byte-compile-output-file-form):
        Update comment here, now make-docfile is no longer so amazingly
        stupid.
        * loadup.el:
        Remove related comment here.
        * raw-process.el: Removed. Had been used by make-docfile.el, no
        longer needed.
        * site-load.el:
        Remove cautions regarding syntax in site-packages.
        * unicode.el:
        Remove a comment that is no longer relevant here.
        * update-elc-2.el (update-elc-ignored-files):
        Remove make-docfile.el from this.
        * update-elc.el (lisp-files-needing-early-byte-compilation):
        Add it to this.
        * update-elc.el (unbytecompiled-lisp-files):
        Remove raw-process.el from this.
        * update-elc.el (additional-dump-dependencies):
        Add make-docfile.el to this.

2025-10-24  Aidan Kehoe  <kehoea@parhasard.net>

        * loadup.el:
        Make #'run-emacs-from-temacs function for my purposes; only call
        #'Snarf-documentation, #'Verify-documentation if dumping, set
        purify-flag to nil if non-dumping, only clear the load history and
        the match strings' extent info if dumping.

2025-10-24  Aidan Kehoe  <kehoea@parhasard.net>

        * loadup.el:
        Remove manipulation of the undo list for *scratch*, irrelevant
        with pdump.
        Also no longer any need for a garbage collection here, #'dump-emacs
        will call that itself and the data-segment-full-of-GCed memory
        problem of unexec is not present.

2025-10-18  Aidan Kehoe  <kehoea@parhasard.net>

        * buffer.el (buffer-file-name): New. Moved here from buffer.c.
        * buffer.el (set-buffer-major-mode): New. Moved here from
        buffer.c. Change from previous (which is compatible with GNU):
        always error if BUFFER is not live.

2025-10-11  Aidan Kehoe  <kehoea@parhasard.net>

        * startup.el (find-init-file-1):
        Quiet a warning about an empty body to #'when. In passing, use the
        implicit (block nil ...) of dolist rather than an explicit throw
        and catch, use a better regexp when checking whether the init file
        ends in .el, use an error message that is a bit more readable with
        a normal home directory path.

2025-10-04  Aidan Kehoe  <kehoea@parhasard.net>

        * make-docfile.el (process-args):
        Pass OBJ to #'match-string here, fix the Visual Studio build.

2025-10-01  Aidan Kehoe  <kehoea@parhasard.net>

        * indent.el (tab-stop-list):
        * indent.el (tab-to-tab-stop):
        * indent.el (move-to-tab-stop):
        Add more entries to TAB-STOP-LIST, up to 256 columns. Revise
        #'tab-to-tab-stop, #'move-to-tab-stop to process it in a more
        idiomatic way.

2025-09-27  Aidan Kehoe  <kehoea@parhasard.net>

        Move the specifier subtype predicates to Lisp, it adds nothing but
        potential bugs to have them in C.

        * fontcolor.el (font-specifier-p): Moved from fontcolor.c.
        * fontcolor.el (color-specifier-p): Moved from fontcolor.c.
        * fontcolor.el (face-boolean-specifier-p): Moved from fontcolor.c.
        * fontcolor.el (face-background-placement-specifier-p):
        Moved from fontcolor.c.
        * glyphs.el (image-specifier-p): Moved from glyphs.c.
        * gutter.el (gutter-specifier-p): Moved from gutter.c.
        * gutter.el (gutter-size-specifier-p): Moved from gutter.c.
        * gutter.el (gutter-visible-specifier-p): Moved from gutter.c.
        * specifier.el (integer-specifier-p): Moved from specifier.c.
        * specifier.el (boolean-specifier-p): Moved from specifier.c.
        * specifier.el (natnum-specifier-p): Moved from specifier.c.
        * specifier.el (generic-specifier-p): Moved from specifier.c.
        * specifier.el (display-table-specifier-p): Moved from specifier.c.

2025-09-27  Aidan Kehoe  <kehoea@parhasard.net>

        * keymap.el (synthesize-unicode-codepoint):
        Moved here from keymap.el, allowing use of #'read-function-key-map
        within it.
        Revise to give help in the same way that `read-char' and
        `read-quoted-char' do, don't choke when supplied code points where
        ISPRINT() in keymap.c is zero.
        * keymap.el (function-key-map-parent):
        Add a binding that will work on TTYs for
        #'synthesize-unicode-codepoint. Move its definition to keymap.el.

2025-09-25  Aidan Kehoe  <kehoea@parhasard.net>

        Move a few further simple type predicates to Lisp from C, missed
        in 57e95bb80443.

        * fontcolor.el (font-instance-p): New.
        * fontcolor.el (color-instance-p): New.
        Move these from fontcolor.c.
        * misc.el:
        * misc.el (range-table-p): New.
        Move this from rangetab.c.
        * misc.el (char-table-p): New.
        Move this from chartab.c.
        * misc.el (:compile-toplevel):
        Improve syntax for byte compiler in passing.
        * process.el (processp): New. Move this from process.c.

2025-09-22  Aidan Kehoe  <kehoea@parhasard.net>

        Move #'when, #'unless to Lisp. Revise bootstrapping code to deal
        with this.

        * bytecomp.el (byte-compile-initial-macro-environment):
        Add entries for #'when, #'unless here, to allow the byte compiler
        to warn if the macros have an empty BODY (as does GNU).

        * dumped-lisp.el (preloaded-file-list):
        Change (when ...) to (if ...) now when is moved to subr.el
        * loadup.el:
        Same changes within this file.
        * make-docfile.el:
        Same changes within this file.
        * subr.el:
        * subr.el (when): New. Moved here from eval.c, it simplifies the C
        implementation if we remove the C-level option to make subrs into
        macros.
        * subr.el (unless): New. Moved here from eval.c.
        * update-elc.el:
        Change (when ...) to (if ...) now when is moved to subr.el

2025-09-19  Aidan Kehoe  <kehoea@parhasard.net>

        Add bytecodes for #'puthash, #'gethash.
        * bytecomp.el:
        * bytecomp.el (gethash):
        * byte-optimize.el (byte-compile-side-effect-free-ops):
        Add byte-gethash here.

2025-09-19  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecomp.el (byte-last-low-packed-opcode): New. Fixnum value of
        the greatest opcode seen where its offset is encoded in the bits
        of the opcode, and the opcode is not byte-constant or
        byte-constant2.
        * bytecomp.el (byte-compile-report-ops): Use it, no longer check <
        byte-nth.
        * byte-optimize.el (disassemble-offset):
        Use it, no longer check < byte-nth.

2025-09-08  Aidan Kehoe  <kehoea@parhasard.net>

        Silence all but one of the byte compiler warnings extant.
        * font-mgr.el:
        Don't warn about redefinition as a subr as a function in this
        file, since that is the entire point of it.
        * mwheel.el (mwheel-install): Add an autoload for this, for the
        sake of behavior-defs.el.
        * pcase.el: Make the byte compiler aware of #'debug in this file,
        silence a warning.
        * x-faces.el (:compile-toplevel):
        Requre font-mgr as well as fontconfig at compile time.
        * x-font-menu.el:
        Ditto.

2025-09-08  Aidan Kehoe  <kehoea@parhasard.net>

        Remove byte-compiler handling of the v18 and v19 old-X opcodes,
        long obsolete.
        * bytecomp.el:
        Comment out byte-defop for old-eq, old-memq, old-equal,
        old-member, old-assq.
        Remove the byte-defop-compiler calls for old-equal, old-member,
        old-assq.
        * test-harness.el (test-harness-from-buffer): Add a comment
        motivating retention of the Ignore-Ebola macro.

2025-09-06  Aidan Kehoe  <kehoea@parhasard.net>

        * cl-macs.el (labels):
        * cl-macs.el (flet):
        Revise the docstrings for `labels', `flet'. Fix bugs with the
        provided arguments: strings, encourage use of `labels', document
        more clearly in the docstring that `labels' supports closures and
        that it is tightly integrated with the byte compiler.

2025-08-25  Aidan Kehoe  <kehoea@parhasard.net>

        * startup.el (command-line-args-left): defvar moved to emacs.c.
        * x-init.el:
        Remove declaration for x-initial-argv-list.
        * x-init.el (make-device-early-x-entry-point):
        Remove manipulation of x-initial-argv-list.
        * x-init.el (make-device-late-x-entry-point):
        Ditto.

2025-08-14  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecomp.el:
        * bytecomp.el (byte-compile-self-evaluating-symbol-p): New.
        Better name for the old byte-compile-constant-symbol-p; it returns
        non-nil for keywords, nil and t, and ignores various constant
        built-in variables.
        * bytecomp.el (byte-compile-constant-symbol-p): New. Return
        non-nil if SYMBOL reflects a const-object, const-integer, etc.
        * bytecomp.el (byte-compile-constp):
        Add a (correct) docstring here, that the macro returns non-nil if
        form is a *self-evaluating* constant form.
        * bytecomp.el (byte-compile-lambda):
        Warn if an arglist entry is one of the constant built-in variables
        as well as if it is a keyword, nil, or t.
        * bytecomp.el (byte-compile-out-toplevel):
        Call byte-compile-self-evaluating-symbol-p here,
        byte-compile-constant-symbol-p no longer appropriate.
        * bytecomp.el (byte-compile-form): Ditto.
        * bytecomp.el (byte-compile-variable-ref): Ditto.
        Also warn if attempting to set or bind one of the built in
        constant symbols.

2025-08-08  Aidan Kehoe  <kehoea@parhasard.net>

        * mule/digit.el:
        * mule/uni-case-conv.el:
        Update both these files to reflect version 16.0.0 of
        UnicodeData.txt.

2025-08-12  Aidan Kehoe  <kehoea@parhasard.net>

        * loadup.el:
        No longer need to set load-always-display-messages to nil, recent
        infrastructure added to the dumper takes care of this more
        systematically.

2025-07-10  Aidan Kehoe  <kehoea@parhasard.net>

        Remove the restriction on autoload cookies for forms not at
        top-level, needed for recent changes to cl-macs.el.
        * autoload.el (generate-autoload-cookie):
        Put a \ before ;;;#autoload in this docstring so build doesn't
        choke.
        * autoload.el (generate-lisp-file-autoloads-1):
        Comment out a (forward-sexp) here, add a comment with motivation
        as to why.
        * mwheel.el: Remove explicit autoloads from this file, no longer
        needed.

2025-07-10  Aidan Kehoe  <kehoea@parhasard.net>

        * cl-macs.el (define-setf-method values):
        Move this beside multiple-value-setq and friends given it now
        needs to use the xemacs-nth-values lambda.

2025-07-09  Aidan Kehoe  <kehoea@parhasard.net>

        Remove visiblity of #'multiple-value-list-internal from Lisp, a
        step in the direction of further work which will avoid heap
        allocation and reduce the impact on Lisp runtime funcalls of the
        multiple values infrastructure. 
        
        * bytecomp.el:
        * bytecomp.el (byte-compile-no-shadow):
        Add #'multiple-value-setq, #'multiple-value-bind, #'nth-value
        here.

        * bytecomp.el (byte-compile-multiple-value-list-internal-wrapper):
        New. Uninterned symbol now used to indicated to the byte compiler that
        the multiple-value-value-list-internal bytecode should be used.
        * bytecomp.el (byte-compile-initial-macro-environment):
        Use it in the compile-time implementations of #'multiple-value-setq,
        #'multiple-value-bind, #'nth-value.
        * bytecomp.el:
        Revise the byte-defop-compiler for multiple-value-list-internal to
        use the new uninterned symbol.

        * cl-macs.el:
        * cl-macs.el (multiple-value-bind):
        * cl-macs.el (multiple-value-setq):
        * cl-macs.el (multiple-value-list):
        * cl-macs.el (nth-value):
        Move all these macros later in the file given they use the
        #'check-type infrastructure, not available where they previously
        were. No longer implement them in terms of
        #'multiple-value-list-internal, pass a lambda to
        #'multiple-value-call.

2025-07-03  Aidan Kehoe  <kehoea@parhasard.net>

        * obsolete.el (executing-macro):
        Use #'define-obsolete-variable-alias for this, not
        #'make-obsolete-variable, given C no longer supplies the variable
        alias.

2025-07-01  Aidan Kehoe  <kehoea@parhasard.net>

        * update-elc.el (target-extension):
        Correct and fill-out a comment here.

2025-06-19  Aidan Kehoe  <kehoea@parhasard.net>

        * fontconfig.el:
        Inappropriate to just (require 'font-mgr) here, since that
        routinely loads font-mgr.el which just errors when any of the
        relevant functions are called at run time.
        Wrap this call with (eval-when (:compile-toplevel) ...), document
        that doing this fixes needless test failure in face-tests.el.

2025-06-16  Aidan Kehoe  <kehoea@parhasard.net>

        * rect.el (kill-rectangle):
        In the event that the buffer is read-only, the intention of this
        function has always been to copy the selected rectangle (to make
        killed-rectangle reflect it) and then to error.  This has never
        worked with interactive calls (the main point of the code) since
        the ?* in the string interactive spec calls
        barf_if_buffer_read_only().
        GNU has this change, among others.

2025-06-16  Aidan Kehoe  <kehoea@parhasard.net>

        nnheaderxm.el binds itimer-timer-last-wakeup , very uncleanly, on
        loading the file.
        If gnus is loaded early in one's init file this gives a race
        condition with other itimers which now encounter a nil
        itimer-timer-last-wakeup with a non-nil itimer-timer.
        Address this (to a certain extent) by initializing
        itimer-timer-last-wakeup to 1970-01-01 00:00:00. Restore a
        function and a variable used by that gnus code.
        Thank you for the bug report, Henry S. Thompson.

        * itimer.el:
        * itimer.el (itimer-timer-last-wakeup):
        Initialize this to '(0 0 0) to make similar bugs less likely going
        forward, though the underlying solution is for non-core code to
        leave itimer-timer-last-wakeup alone.

        * itimer.el ('itimer-driver-start): New. Restore this as an
        obsolete alias for 'itimer-timer-start.
        * itimer.el (itimer-process): New. Restore this as a variable,
        mark it obsolete.

2025-08-11  Aidan Kehoe  <kehoea@parhasard.net>

        Use byte-type-of for the bulk of simple type predicates for
        built-in types. Move as many as possible of them to Lisp.

        * bytecomp.el:
        * bytecomp.el (byte-compile-simple-type-predicate): New. Use the
        byte-type-of bytecode for type checking for simple type checks, if
        there is not an existing byte opcode for this type check.
        * bytecomp.el: Use it for various built-in type predicates.

        * buffer.el (bufferp): New. Move this here from buffer.c
        * cl-extra.el:
        * cl-extra.el (floatp): New. Move this here from data.c
        * cl-extra.el (bignump): No need for this to be a defsubst*, it is
        now compiled using byte-compile-simple-type-predicate.
        * cl-extra.el (ratiop): Ditto.
        * cl-extra.el (bigfloatp): Ditto.
        * coding.el (coding-system-p): New. Move this here from
        file-coding.c.
        * console.el (consolep): New. Move this here from console.c.
        * device.el (devicep): New. Move this here from device.c
        * dumped-lisp.el:
        * dumped-lisp.el (preloaded-file-list): #'consp no longer
        available in this file, use its implementation.
        * events.el (eventp): New. Move this here from events.c.
        * extents.el (extentp): New. Move this here from extents.c.
        * faces.el (facep): New. Move this here from faces.c.
        * frame.el (framep): New. Move this here from frame.c.
        * glyphs.el (glyphp): New. Move this here from glyphs.c.
        * glyphs.el (image-instance-p): New. Ditto.
        * hash-table.el (hash-table-p): New. Move this here from elhash.c.
        * make-docfile.el (docfile-out-of-date): #'fixnump no longer
        available in this file, use #'numberp.
        * misc.el (weak-list-p): New. Move this here from data.c.
        * mule/mule-category.el (category-table-p): New. Move this here
        from chartab.c.
        * mule/mule-charset.el (charsetp): New. Move this here from
        mule-charset.c. 
        * post-gc.el:
        * post-gc.el (ephemeronp): New. Move this here from data.c.
        * post-gc.el ('ephemeron-p): New. Provide an alias for the old
        name; old name does not fit with XEmacs coding conventions.
        * specifier.el (specifierp): New. Move this here from specifier.c.
        * subr.el (consp): New. Move this here from data.c.
        * subr.el (symbolp): New. Ditto.
        * subr.el (stringp): New. Ditto.
        * subr.el (vectorp): New. Ditto.
        * subr.el (bit-vector-p): New. Ditto.
        * subr.el (fixnump): New. Ditto.
        * subr.el (markerp): New. Ditto.
        * subr.el (characterp): New. Ditto.
        * subr.el (subrp): New. Ditto.
        * subr.el (compiled-function-p): New. Move this here from
        byte-code.c.
        * window.el (windowp): New. Move this here from window.c.

2025-06-15  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecomp.el (169):
        * bytecomp.el (type-of):
        New bytecode for type-of, given it is now very cheap on the C
        level.

ChangeLog Entries from lwlib/ChangeLog

goto announcement, summary, changes

None.

ChangeLog Entries from man/ChangeLog

goto announcement, summary, changes

2025-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.37 "lettuce" is released.

2026-07-14  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (The header):
        Update this to reflect current reality.
        * internals/internals.texi (Reloading phase):
        Rearrange this to reflect the order things are currently done.

2026-06-27  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Allocation from Frob Blocks):
        Update documentation of the size of frob blocks, just changed.

2026-06-25  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Introduction to Writing C Code):
        Remove guidance regarding naming of Lisp_Subr structures,
        irrelevant with the current implementation.
        * internals/internals.texi (Discussion -- Incremental Collector):
        Remove mention of the Lisp_Subr objects as static C data, which is
        no longer the case.

2026-06-25  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (lrecords):
        Update the documentation regarding lcrecords, which no longer have
        a struct old_lcrecord_header at their beginning.

        * internals/internals.texi (Top):
        * internals/internals.texi (Garbage Collection - Step by Step):
        * internals/internals.texi (compact_string_chars):
        * internals/internals.texi (sweep_strings):
        * internals/internals.texi (pdump_objects_unmark): New.
        Document this in passing, never previously documented.

2026-06-12  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Introduction to Allocation):
        I had planned to change this to reflect changes to the size of
        struct lrecord.type and to the implementation of
        lrecord_implementations_table as a Dynarr, but that turns out not
        to be necessary.
        Corrected documentation of the type of the name of the object,
        changed spelling of "through" from "thru" throughout the
        document.

2026-06-06  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Dumping and restoring hash tables):
        Update this reflecting changes today.

2026-05-31  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Buffer Lists):
        Document Vbuffer_list, remove documentation of Vbuffer_alist.

2026-05-26  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Pointers dumping):
        * internals/internals.texi (Reloading phase):
        Rename XD_OPAQUE_DATA_CONVERTIBLE to XD_SERIALIZE_DATA,
        XD_OPAQUE_PTR_CONVERTIBLE to XD_SERIALIZE_PTR.

2026-05-21  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Object inventory): Add a missing
        preposition to a paragraph here.
        * internals/internals.texi (Reloading phase): Update documentation
        for the approach to dump-in-exec, to reflect that the code now
        handles the DWORD alignment of Window's FindResourceA() .

2026-05-15  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Top):
        * internals/internals.texi (Dumping):
        Add menu entries for the new node, Dumping and restoring hash
        tables.
        * internals/internals.texi (Overview):
        Remove mention of a desire to change the name of the dump file, no
        longer a priority given DUMP_IN_EXEC is the default.
        Update documentation of systems where DUMP_IN_EXEC is impractical
        and that turning it off can be attractive for development.
        * internals/internals.texi (Object inventory):
        Update and correct the roots used for the object
        inventory. Correct documentation of possible problems with weak
        lists and hash tables.
        * internals/internals.texi (Address allocation):
        Correct the spelling of pdump_block_list_elt. Correct the
        documentation of the offset used after the pdump header, no longer
        256.
        * internals/internals.texi (The header):
        Update and flesh out documentation of the header fields.
        * internals/internals.texi (Data dumping):
        Document some special handling for hash tables here.
        * internals/internals.texi (Pointers dumping):
        Flesh out and update the documentation of what these are,
        mentioning the XD_OPAQUE_DATA_CONVERTIBLE,
        XD_OPAQUE_PTR_CONVERTIBLE objects. Remove mention of
        pdump_weak_object_chains, no longer handled at this point.
        * internals/internals.texi (Reloading phase):
        Update documentation of the Windows resource handling with
        DUMP_IN_EXEC, which should be removed.
        Document that relocation is not needed or done if DUMP_IN_EXEC and
        !HAVE_ASLR. Document handling of XD_OPAQUE_DATA_CONVERTIBLE,
        XD_OPAQUE_PTR_CONVERTIBLE.
        * internals/internals.texi (Dumping and restoring hash tables):
        New node, documenting the optimizations that mean that hash tables
        do not, normally, need to be reorganized after dump, and the
        special handling for #'eq, #'eql tables where the size is less
        than the page size. Document that
        pdump_reorganize_hash_tables() is call from main_1() if needed.

2026-05-06  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Top):
        * internals/internals.texi (Garbage Collection - Step by Step):
        * internals/internals.texi (Invocation):
        * internals/internals.texi (garbage_collect):
        * internals/internals.texi (mark_object):
        * internals/internals.texi (gc_sweep):
        * internals/internals.texi (sweep_lcrecords):
        * internals/internals.texi (lrecords):
        * internals/internals.texi (Evaluation):
        Rename garbage_collect_1(), sweep_lcrecords_1() to their new names
        without the trailing _1 in this file.

2026-05-04  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Top):
        Remove reference to the node documenting sweep_bit_vectors_1(),
        which function is long gone.
        * internals/internals.texi (Authorship of XEmacs):
        No longer mention mark methods in this, gone with KKCC.
        * internals/internals.texi (Internal Modules for Other Aspects of
        the Lisp Interpreter and Object System):
        Opaque objects can no longer have a mark method, remove mention of
        this.
        * internals/internals.texi (Introduction to Allocation):
        Bit vectors are no longer a special case, remove mention of this.
        * internals/internals.texi (Garbage Collection):
        Vectors are just lcrecords, no need to mention them specially.
        * internals/internals.texi (Garbage Collection - Step by Step):
        * internals/internals.texi (mark_object):
        Remove documentation of the mark method.
        * internals/internals.texi (gc_sweep):
        Remove mention of sweep_bit_vectors_1().
        * internals/internals.texi (sweep_lcrecords_1):
        Correct some syntax here.
        * internals/internals.texi (sweep_strings):
        Remove reference to sweep_bit_vectors_1() here, long gone.
        * internals/internals.texi (sweep_bit_vectors_1): Removed, bit
        vectors are just lcrecords, they are not handled specially.
        * internals/internals.texi (Vector):
        Vectors are not marked strangely during garbage collection.
        * internals/internals.texi (Bit Vector):
        * internals/internals.texi (Symbol):
        * internals/internals.texi (Marker):

2026-04-05  Aidan Kehoe  <kehoea@parhasard.net>

        * lispref/searching.texi (Syntax of Regexps):
        Document that #'regexp-quote may return the supplied string.

2026-03-19  Aidan Kehoe  <kehoea@parhasard.net>

        * lispref/mule.texi (Internationalization Terminology):
        * lispref/mule.texi (Charset Properties):
        * lispref/mule.texi (MULE Characters):
        * lispref/mule.texi (Coding System Types):
        * lispref/mule.texi (Charset Unification):
        Remove mention of non-Mule from this. Add a certain amount of
        documentation of --with-unicode-internal. Update a certain amount
        otherwise, e.g. documenting that the fixed-width 16-bit Unicode
        encoding is now called UCS-2.

2026-02-21  Aidan Kehoe  <kehoea@parhasard.net>

        * emodules.texi:
        * emodules.texi (Top):
        * emodules.texi (Introduction):
        Revert to using @value{emacs} (which expands to XEmacs) rather
        than @value{xemacs} (which doesn't exist) within this file.

        * internals/internals.texi (Top):
        * internals/internals.texi (Introduction):
        * internals/internals.texi (Authorship of XEmacs):
        * internals/internals.texi (Authorship of some of the modules): Removed.
        * internals/internals.texi (Authorship of some of the internal modules): New.
        * internals/internals.texi (XEmacs from the Perspective of Building):
        * internals/internals.texi (Build-Time Dependencies):
        * internals/internals.texi (The Internal Modules of XEmacs):
        * internals/internals.texi (A Summary of the Various XEmacs Internal Modules):
        * internals/internals.texi (Internal Modules for Building XEmacs):
        * internals/internals.texi (Internal Modules for Build Configuration):
        * internals/internals.texi (Internal Modules for Compiling XEmacs):
        * internals/internals.texi (Internal Modules for Preloading Lisp):
        * internals/internals.texi (Low-Level Internal Modules):
        * internals/internals.texi (Basic Lisp Internal Modules):
        * internals/internals.texi (Internal Modules for Standard Editing Operations):
        * internals/internals.texi (Internal Modules for Interfacing with the File System):
        * internals/internals.texi (Internal Modules for Other Aspects of the Lisp Interpreter and Object System):
        * internals/internals.texi (Internal Modules for Interfacing with the Operating System):
        * internals/internals.texi (Rules When Writing New C Code):
        * internals/internals.texi (Introduction to Writing C Code):
        * internals/internals.texi (Writing New Internal Modules):
        * internals/internals.texi (Working with Lisp Objects):
        * internals/internals.texi (Writing Lisp Primitives):
        * internals/internals.texi (Writing Good Comments):
        * internals/internals.texi (Adding Global Lisp Variables):
        * internals/internals.texi (Regression Testing XEmacs):
        * internals/internals.texi (How to Regression-Test):
        * internals/internals.texi (Low-Level Allocation):
        * internals/internals.texi (Stack Allocation):
        * internals/internals.texi (Dynamic Arrays):
        * internals/internals.texi (GCPROing):
        * internals/internals.texi (Multilingual Support):
        * internals/internals.texi (CCL):
        * internals/internals.texi (Random other Windows I18N docs):
        * internals/internals.texi (Internal Modules for Internationalization):
        * internals/internals.texi (Consoles; Devices; Frames; Windows):
        * internals/internals.texi (Window Hierarchy):
        * internals/internals.texi (The Window Object):
        * internals/internals.texi (Internal Modules for the Basic Displayable Lisp Objects):
        * internals/internals.texi (Creating a Window-System Type):
        * internals/internals.texi (The Redisplay Mechanism):
        * internals/internals.texi (Redisplay Piece by Piece):
        * internals/internals.texi (pixel_to_glyph_translation):
        * internals/internals.texi (Internal Modules for the Redisplay Mechanism):
        * internals/internals.texi (Events and the Event Loop):
        * internals/internals.texi (Dispatching Events; The Command Builder):
        * internals/internals.texi (Focus Handling):
        * internals/internals.texi (Editor-Level Control Flow Internal Modules):
        * internals/internals.texi (Interface to MS Windows):
        * internals/internals.texi (Windows Build Flags):
        * internals/internals.texi (Windows I18N Introduction):
        * internals/internals.texi (Internal Modules for Interfacing with MS Windows):
        * internals/internals.texi (Interface to the X Window System):
        * internals/internals.texi (Tab Controls):
        * internals/internals.texi (Internal Modules for Interfacing with X Windows):
        * internals/internals.texi (Future Work -- General Suggestions):
        * internals/internals.texi (Better Rendering Support -- Review Criteria):
        * internals/internals.texi (Better Rendering Support -- Implementation):
        * internals/internals.texi (Old Future Work -- A Portable Unexec
        Replacement):
        Avoid using the unqualified term "module" within this file to
        refer to anything but those modules implemented using
        emodules.c. Use the term "internal modules" for built-in subsystems
        of XEmacs, previously termed "modules".
        Add anchors for the various section names that now use "internal
        module", which anchors use the old names.
        Preserve index entries using the old terminology.

2026-02-08  Aidan Kehoe  <kehoea@parhasard.net>

        * emodules.texi:
        * emodules.texi (Top):
        * emodules.texi (Introduction):
        Document that ellcc is written in XEmacs Lisp.
        * emodules.texi (emodule_coding):
        Document that this is set automatically by ellcc.
        * emodules.texi (Initialization Mode):
        Update the documentation fo the current build-time approach to
        docstrings.
        Mention make-docfile.elc rather than make-docfile.
        * emodules.texi (Environment Variables):
        Remove mention of ELLMAKEDOC from here, now always
        make-docfile.elc.
        * emodules.texi (Defining Functions):
        Update this to reflect the normal approach of make-docfile.elc.
        * lispref/loading.texi (Autoload):
        Correct loaddefs.el, now auto-autoloads.el.
        Update documentation of the backslash and trailing newline.

2026-01-09  Aidan Kehoe  <kehoea@parhasard.net>

        * lispref/os.texi (Batch Mode):
        Document the --script command line argument, and the special
        handling if argv[0] is xemacs-script, helpful for POSIX systems.

2025-12-06  Aidan Kehoe  <kehoea@parhasard.net>

        * lispref/buffers.texi (The Buffer List):
        * lispref/buffers.texi (Indirect Buffers):
        * lispref/building.texi (Building XEmacs):
        * lispref/building.texi (Garbage Collection):
        * lispref/commands.texi (Command Overview):
        * lispref/commands.texi (Command Loop Info):
        * lispref/commands.texi (Events):
        * lispref/commands.texi (Peeking and Discarding):
        * lispref/commands.texi (Waiting):
        * lispref/compile.texi (Byte Compilation):
        * lispref/compile.texi (Compilation Options):
        * lispref/compile.texi (Default): Removed.
        * lispref/compile.texi (Docs and Compilation):
        * lispref/compile.texi (Eval During Compile):
        * lispref/compile.texi (many keyboard commands often has that usage pattern): Removed.
        * lispref/control.texi (Signaling Errors):
        * lispref/control.texi (Error Symbols):
        * lispref/display.texi (Truncation):
        * lispref/display.texi (Display Table Format):
        * lispref/display.texi (Active Display Table):
        * lispref/faces.texi (Face Convenience Functions):
        * lispref/files.texi (Unique File Names):
        * lispref/frames.texi (Visibility of Frames):
        * lispref/frames.texi (Raising and Lowering):
        * lispref/glyphs.texi (Image Instantiator Formats):
        * lispref/glyphs.texi (Image Instance Types):
        * lispref/glyphs.texi (Using Glyphs):
        * lispref/glyphs.texi (External Glyphs):
        * lispref/glyphs.texi (Primitive Widgets):
        * lispref/glyphs.texi (Glyph Types):
        * lispref/hash-tables.texi (Working With Hash Tables):
        * lispref/intro.texi (Caveats):
        * lispref/keymaps.texi (Format of Keymaps):
        * lispref/keymaps.texi (Functions for Key Lookup):
        * lispref/lispref.texi (Top):
        * lispref/lists.texi (Association Lists):
        * lispref/lists.texi (Weak Lists):
        * lispref/loading.texi (Named Features):
        * lispref/macros.texi (Backquote):
        * lispref/macros.texi (Problems with Macros):
        * lispref/minibuf.texi (Object from Minibuffer):
        * lispref/minibuf.texi (Minibuffer Misc):
        * lispref/objects.texi (Lisp Data Types):
        * lispref/objects.texi (Comments):
        * lispref/objects.texi (Primitive Types):
        * lispref/objects.texi (Integer Type):
        * lispref/objects.texi (Floating Point Type):
        * lispref/objects.texi (Character Type):
        * lispref/objects.texi (Array Type):
        * lispref/objects.texi (String Type):
        * lispref/objects.texi (Bit Vector Type):
        * lispref/objects.texi (Function Type):
        * lispref/objects.texi (Macro Type):
        * lispref/objects.texi (Char Table Type):
        * lispref/objects.texi (Hash Table Type):
        * lispref/objects.texi (Weak List Type):
        * lispref/objects.texi (Extent Type):
        * lispref/objects.texi (Window Configuration Type):
        * lispref/objects.texi (Stream Type):
        * lispref/objects.texi (Keymap Type):
        * lispref/objects.texi (Syntax Table Type):
        * lispref/objects.texi (Display Table Type):
        * lispref/objects.texi (Window-System Types):
        * lispref/objects.texi (Image Instance Type):
        * lispref/objects.texi (Toolbar Button Type):
        * lispref/objects.texi (Type Predicates):
        * lispref/objects.texi (Equality Predicates):
        * lispref/objects.texi (NOTE): Removed.
        * lispref/os.texi (Timers):
        * lispref/os.texi (Terminal Output):
        * lispref/positions.texi (Screen Lines):
        * lispref/positions.texi (Excursions):
        * lispref/searching.texi (Syntax of Regexps):
        * lispref/streams.texi (Output Variables):
        * lispref/strings.texi (String Basics):
        * lispref/strings.texi (Creating Strings):
        * lispref/strings.texi (Predicates for Characters):
        * lispref/strings.texi (Character Codes):
        * lispref/strings.texi (String Conversion):
        * lispref/strings.texi (Character Case):
        * lispref/strings.texi (Char Tables):
        * lispref/strings.texi (Char Table Types):
        * lispref/strings.texi (Working With Char Tables):
        * lispref/syntax.texi (Syntax Basics):
        * lispref/text.texi (Near Point):
        * lispref/text.texi (Insertion):
        * lispref/text.texi (Text Properties):
        * lispref/text.texi (Substitution):
        * lispref/tips.texi (Style Tips):
        * lispref/tips.texi (Documentation Tips):
        * lispref/windows.texi (Window Configurations):
        * lispref/x-windows.texi (X Selections):

        A certain amount of updating of the Lispref, which has been
        under-maintained for decades. More to do.
        In particular, replace FSF Emacs with GNU Emacs to reduce needless
        aggravation of GNU-enthusiasts reading the documentation a
        little.
        Remove most mentions of XEmacs 19 (most of the relevant contexts
        can easily be replaced by mentioning GNU Emacs).
        Mention that allocating memory means more garbage collection is
        done, which can have a performance impact.
        Remove mention of dynamic loading of the instructions of compiled
        functions now that is gone.
        Remove mention of characteristics of XEmacs 19.14 and GNU Emacs
        19.28 and earlier, long-obsolete.
        Document that a display table is just a generic char table. Update
        examples dealing with display tables to call #'put-display-table.
        Document the (format "CONTROL-STRING") option for display table
        entries, added 2022.
        Document that GNU have #'temporary-file-directory.
        Remove mention of subwindow, x-resource, window-configuration,
        integer as primitive types. Extend the list of internal primitive
        types.
        Clean up documentation of the subwindow image instances;
        implemented.
        Correct advice regarding the HASH-FUNCTION argument to
        #'define-hash-table-test.
        Clarify that despite names like ASSOC, KEY-ASSOC for the TYPE
        argument to #'make-weak-list, equality is with #'eq, not #'equal.
        Document that #! is treated by the Lisp reader as a comment if
        they are the first to characters of a file.
        Remove documentation of characteristics of non-Mule.
        Document the total size limit constants for the array types.
        Update documentation of the window configuration type to reflect
        its implementation using defstruct.
        Document #'make-string-output-stream, #'get-output-stream-string
        in the stream node.
        Cross reference to the list of primitive types in the
        documentation for #'type-of rather than repeating it.
        Document that GNU has a #'characterp that behaves as does our
        #'char-int-p.
        Document #'char-table-default, #'set-char-table-default. Update
        documentation of #'map-char-table and the other char-table
        functions.
        Remove advice to keep the name of Lisp source files short, no
        longer relevant.
        Clarify that the object allocation and
        garbage-collection characteristics of lists are better than that
        of vectors.
        Correct a poor command of verbal morphology in advice for writing
        docstrings.
        No good reason to limit line width to 60 characters, 78 is fine.

2025-11-30  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Top):
        New node, Old Future Work -- Keyword Parameters.
        * internals/internals.texi (Low-Level Modules):
        Document that #'dump-emacs, #'run-emacs-from-temacs are not
        visible from Lisp in a normal post-pdump_load() XEmacs.
        * internals/internals.texi (Proper Use of Unsigned Types):
        Give a couple of extra situations where unsigned types are
        necessary, since behavior of unsigned arithmetic on overflow is
        specified by C while that of signed arithmetic is not.

        * internals/internals.texi (Great Integral Type Renaming):
        Correct this, EMACS_INT is guaranteed to be the same size of Lisp
        objects of type fixnum. List 64-bit word sizes first. Update the
        listed declaration of Hashcode.
        * internals/internals.texi (The Text in a Buffer):
        Update the description of Ichar.
        Remove mention of non-Mule. Mention unicode-internal.
        * internals/internals.texi (Byte-Char Position Conversion):
        Give some context on previous overuse of this, some guidance on
        how to avoid performance pitfalls when writing C code.
        * internals/internals.texi (Internal String Encoding):
        Document that we provide --with-unicode-internal here.
        * internals/internals.texi (Working With Character and Byte
        Positions):
        Update a couple of example to be more idiomatic. Caution against
        use of bytecount_to_charcount(), charcount_to_bytecount() if possible.
        * internals/internals.texi (Conversion to and from External Data):
        Remove mention of non-Mule.
        * internals/internals.texi (An Example of Mule-Aware Code):
        Update this. Correct an example function that is gone.
        * internals/internals.texi (Mule-izing Code):
        * internals/internals.texi (Modules for Internationalization):
        Update this, remove mention of files that are gone.
        * internals/internals.texi (Future Work -- Keyword Parameters):
        Move the bulk of this to Old Future Work. Describe
        PARSE_KEYWORDS() and friends. Motivate work for a better
        implementation of keywords for compiled function.
        * internals/internals.texi (Old Future Work -- Keyword
        Parameters): Move the old Future Work -- Keyword Parameters here.

        * lispref/building.texi (Building XEmacs):
        Remove now-inaccurate information on the system-specificity of the
        dump process.
        Update documentation of #'dump-emacs, #'run-emacs-from-temacs.
        * lispref/help.texi (Documentation Basics):
        Update details regarding the name of DOC.
        * lispref/help.texi (Accessing Documentation):
        Correct documentation of the format of dynamic docstring
        markers. Remove mention of sorted-doc.c and digest-doc.c
        Remove a caution that the VERBATIM argument to
        #'substitute-command-keys exists only as of Emacs 19.
        Remove documentation of #'Snarf-documentation.
        * lispref/os.texi (Command Line Arguments):
        Remove obsolete documentation of the possibility of redumping
        XEmacs.

2025-11-06  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Writing Lisp Primitives): Update
        documentation regarding the now-much-reduced fragility of
        make-docfile and the associated format of Lisp strings. Update
        documentation of what DEFUN(), DEFSUBR() do in passing.

2025-10-24  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Build-Time Dependencies):
        * internals/internals.texi (Writing Lisp Primitives):
        Update documentation regarding make-docfile here.

2025-10-12  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Allocation by Blocks):
        Remove documentation of Blocktype, superseded by lcrecord_list.

2025-10-06  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (gc_sweep):
        * internals/internals.texi (lrecords):
        * internals/internals.texi (Low-level allocation):
        Update documentation related to lcrecords,
        DECLARE_*_LISP_OBJECT(), DEFINE_*_LISP_OBJECT(),
        OBJECT_HAS_METHOD(), and GNU malloc's memory warning facilities,
        now removed.

2025-09-22  Aidan Kehoe  <kehoea@parhasard.net>

        * lispref/control.texi (Control Structures):
        * lispref/control.texi (Conditionals):
        * cl.texi (Conditionals):
        Move document of `when', `unless' to the Lispref from cl.texi.

2025-09-06  Aidan Kehoe  <kehoea@parhasard.net>

        * lispref/functions.texi (Defining Functions):
        Document `labels' beside `defun' with a view to encouraging its use.

2025-07-03  Aidan Kehoe  <kehoea@parhasard.net>

        * lispref/commands.texi (Keyboard Macros):
        * lispref/edebug-inc.texi (Checking Whether to Stop):
        Remove mention of executing-macro here, executing-kbd-macro has
        long been preferred.

2025-07-01  Aidan Kehoe  <kehoea@parhasard.net>

        * lispref/functions.texi (Mapping Functions):
        Mention #'mapcar* rather than #'mapcar here.
        * lispref/lists.texi (List-related Predicates):
        Document #'list-length, #'safe-length here. Clarify a bit further
        regarding the reliability of  #'true-list-p vis #'listp.
        * lispref/sequences.texi (Sequence Functions):
        Move documentation of the keyword arguments to the sequence
        functions here from cl.texi. Give a better example for equivalence
        of #'remove* vs. #'remove-if.

        * internals/internals.texi (XEmacs from the Perspective of
        Building):
        Correct some voice-recognition errors in this section. Update to
        list 64-bit systems first.
        * internals/internals.texi (Debugging and Testing):
        Remove mention of limitations that were unexec-specific. Document
        that Quantify and Purify should now work but that they have not
        recently been tested.
        Remove mention of the --with-mule configure option, now it is
        gone (it is the default).
        * internals/internals.texi (XEmacs from the Inside):
        The C initialization is no longer complete after initializing
        temacs, since some of it depends on Lisp code, remove a sentence
        asserting this.
        Update documentation to be more pdump-focused.
        * internals/internals.texi (The XEmacs Object System (Abstractly
        Speaking)):
        Lead with precision information for 64-bit systems.
        * internals/internals.texi (Introduction to Allocation):
        Document that string relocation is rare, and the pitfall with this.
        * internals/internals.texi (GCPROing):
        Mention that GNU has implemented a conservative garbage collector
        and potential benefits (and problems) with this.
        * internals/internals.texi (Invocation): Remove mention of
        #'dump-emacs-data, long gone. Correct a poor translation of
        beziehungsweise (which means "or, relatedly" but which the
        dictionaries document as meaning "respectively").
        * internals/internals.texi (mark_object):
        Remove mention of UNMARKABLE_RECORD_HEADER_P(), gone.
        * internals/internals.texi (gc_sweep):
        Remove mention of the window-configuration object, now in C.

        * cl.texi (Sequence Basics):
        * cl.texi (Sequence Functions):
        * cl.texi (List Functions):
        Move much documentation from this file to lispref.texi, now it is
        built-in.
        * emodules.texi (Defining Variables):
        Remove mention of purespace from here, long gone.

2025-06-18  Aidan Kehoe  <kehoea@parhasard.net>

        * internals/internals.texi (Byte-Char Position Conversion):
        The old byte-char algorithm is not coming back, remove detailed
        documentation of it from the internals manual.

ChangeLog Entries from modules/ChangeLog

goto announcement, summary, changes

2026-04-11  Aidan Kehoe  <kehoea@parhasard.net>

        * postgresql/postgresql.c:
        * ldap/eldap.c:
        * canna/canna_api.c:
        Restore declarations for vars_of_MODULE(), syms_of_MODULE(), now
        they have been removed from the core code.

2026-02-28  Aidan Kehoe  <kehoea@parhasard.net>

        * zlib/Makefile (CC): Update this to reflect ellcc.elc rather than
        ../../lib-src/ellcc.
        * zlib/Makefile (zlib_i.c):
        Remove mention of the ELLMAKEDOC environment var in this, no
        longer observed by ellcc.elc.

        * sample/internal/Makefile.in.in (MAKE_DOCFILE): Removed, missed
        in 7da6404f9317 .
        * sample/internal/Makefile.in.in ($(MODNAME)_i.c):
        Remove mention of ELLMAKEDOC here.
        * sample/internal/configure.ac:
        Remove the AC_SUBST() for MAKE_DOCFILE.

        * sample/external/Makefile.in.in:
        * sample/external/Makefile.in.in ($(MODNAME)_i.c):
        Remove mention of ELLMAKEDOC here.

        * postgresql/configure:
        * ldap/configure: Regenerate these, given changes to
        common/configure-post.ac

        * common/Makefile.common (MAKE_DOCFILE): Remove, missed in
        7da6404f9317 .
        * common/configure-post.ac:
        Remove its AC_SUBST().

        * canna/configure.ac: Remove mention of the MAKE_DOCFILE
        AC_SUBST() from this.
        * canna/configure: Regenerate.
        * base64/Makefile (CC): Update this to reflect ellcc.elc rather than
        ../../lib-src/ellcc.
        * base64/Makefile (base64_i.c):
        Remove use of the ELLMAKEDOC environment variable here, no longer
        observed by ellcc.elc.

2026-02-08  Aidan Kehoe  <kehoea@parhasard.net>

        * README:
        Update this now that (unload-module FILE) is less horrendously
        unreliable. 
        * common/Makefile.common ($(MODNAME)_i.c):
        Ignore ELLMAKEDOC here, now always the make-docfile.elc of the
        installed XEmacs.

2026-02-08  Aidan Kehoe  <kehoea@parhasard.net>

        Add docstrings to DEFVAR() calls in canna_api.c; some other
        housekeeping.

        * canna/canna_api.c (Fcanna_key_proc):
        Correct some English in this docstring.
        * canna/canna_api.c (Fcanna_set_bunsetsu):
        Ditto.
        * canna/canna_api.c (Fcanna_finalize):
        Ditto.
        * canna/canna_api.c (Fcanna_set_width):
        Shorten this docstring, helpful for hyper-apropos.
        * canna/canna_api.c (Fcanna_change_mode):
        Give information on useful values for NUM in this docstring.
        * canna/canna_api.c (Fcanna_do_function):
        Give information on useful values for NUM in this docstring.
        * canna/canna_api.c (modules_of_canna_api):
        Remove some needless boilerplate here.
        * canna/canna_api.c (vars_of_canna_api):
        Add docstrings for all the Canna DEFVAR() calls, in preparation
        for make-docfile.elc rejecting empty docstrings.
        * canna/canna_api.c (unload_canna_api):
        Remove some needless boilerplate here.

ChangeLog Entries from nt/ChangeLog

goto announcement, summary, changes

2026-05-23  Aidan Kehoe  <kehoea@parhasard.net>

        Minor cleanups, nt/.
        * README:
        Remove mention of MULE as an option, always on.
        * xemacs.mak:
        Update copyright.
        * xemacs.mak (INFODOCK): Removed, long gone.
        * xemacs.mak (CONFIG_ERROR): Remove check for InfoDock with this.
        * xemacs.mak (XEMACS_VERSION_STRING): Remove check for InfoDock
        with this.
        * xemacs.mak (INFODOCK_VERSION_STRING): Removed.
        * xemacs.mak (PROGRAM_DEFINES): Remove check for InfoDock with this.
        * xemacs.mak (INSTALL_DIR): Ditto.
        * xemacs.mak (PATH_PREFIX): Ditto.
        * xemacs.mak (OPTFLAG): Document that we should use link time
        optimization by default when optimizing.
        * xemacs.mak (  Building XEmacs using):
        When echoing the build configuration, don't use extra double
        quotes; this makes it needlessly difficult to copy and paste from
        the cmd.exe window. Print the various options on their own lines
        instead.

2026-05-23  Aidan Kehoe  <kehoea@parhasard.net>

        Remove FASTCALL as a suggested build option, Windows Native;
        irrelevant with 64 bit Windows, not actually faster, needlessly
        complicates the implementation (functions passed to qsort() need
        to be marked as STDCALL).

        * config.inc.samp:
        * config.inc.samp (USE_FASTCALL): Removed.
        * xemacs.mak:
        * xemacs.mak (OPTIMIZED_BUILD):
        * xemacs.mak (USE_FASTCALL): Removed.
        * xemacs.mak (OPTFLAGS_FASTCALL): Removed.
        * xemacs.mak (OPTFLAGS_CDECL): Removed.
        * xemacs.mak (OPTFLAGS): Always initialized to what was previously
        OPTFLAGS_FASTCALL.
        * xemacs.mak (CFLAGS_CDECL_NO_LIB): Removed.
        * xemacs.mak (CFLAGS_CDECL): Removed.
        * xemacs.mak (TEMACS_CPP_CDECL_FLAGS): Removed.

2026-02-08  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.mak (LIB_SRC_TOOLS):
        Remove mention of make-docfile.exe, no longer needed, implemented
        in Lisp.

2025-10-25  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.mak:
        * xemacs.mak (DOC): Removed, now generated in Lisp as part of the
        dump process.
        * xemacs.mak ($(DUMP_TARGET)): Remove a dependency on it.
        * xemacs.mak (docfile): Remove this variable.
        * xemacs.mak ($(LISP)/finder-inf.el):
        Re-number targets.

2025-10-23  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.mak ($(DOC)):
        Update rule to call make-docfile.el using --script and using
        $(run_temacs_args).

2025-10-12  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.mak (TEMACS_COMMON_OBJS):
        Remove mention of blocktype.obj, now blocktype.c is gone.

2025-09-04  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.mak (OPT_OBJS): Remove debug.obj from OPT_OBJS, now
        debug.c is gone.

ChangeLog Entries from src/ChangeLog

goto announcement, summary, changes

2025-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.37 "lettuce" is released.

2026-09-24  Aidan Kehoe  <kehoea@parhasard.net>

        * emodules.h:
        * emodules.h (EMODULES_HDR):
        * xemacs.def.in.in:
        87f0716c0cef broke the build --with-modules
        --with-unicode-internal; this wasn't provoked on Mats Lidell's
        buildbots, unfortunately.
        Correct this, remove handling of the EMODULES_GATHER_VERSION
        #define, which had been used by ellcc.c and is no longer relevant
        with ellcc in Lisp, rely on lisp.h to #include compiler.h. Thank
        you for the bug reports, Mats Lidell and Steve Turnbull.

2026-09-20  Aidan Kehoe  <kehoea@parhasard.net>

        Revise calling convention for define_lisp_object() in anticipation
        of future changes that will be incompatible with the existing
        calling convention (my plan is to separate out finalizable
        vs. non-finalizable lcrecords using separate linked lists rather
        than keeping them both on all_lcrecords), and define_lisp_object()
        will need to know whether a record is finalizable for that).

        Doing this now given I plan to release soon and the convention for
        calling define_lisp_object() should be stable after today's
        change.

        * compiler.h (STRINGIZE):
        * compiler.h (EXPAND_AND_STRINGIZE):
        New macros, support for changes to definition of EMODULES_VERSION.
        * emodules.h (EMODULES_MINOR):
        Update this to 1.
        * emodules.h (EMODULES_VERSION): Construct this from
        EMODULES_MAJOR, EMODULES_MINOR, EMODULES_PATCH rather than typing
        it out.
        * alloc.c (define_lisp_object):
        Take PRINTER, FINALIZER, EQUAL, HASH, SIZE_IN_BYTE_METHOD
        arguments, initialize the corresponding entry in
        lrecord_implementations accordingly.
        * lrecord.h:
        Update declaration for define_lisp_object().
        * lrecord.h (MAKE_LISP_OBJECT):
        Call define_lisp_object() with its new calling convention.

2026-09-14  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (sweep_lcrecords):
        Make HEAD into a union, reduce likely issues with strict aliasing,
        thank you Michael Sperber.
        * file-coding.c (coding_finalizer):
        Recognize that this finalizer, like any finalizer, can be called
        multiple times, remove an assertion.

2026-09-02  Aidan Kehoe  <kehoea@parhasard.net>

        Fix the build --without-modules, thank you Henry S. Thompson.

        * alloc.c:
        * alloc.c (unstaticpro_nodump): Make this available even on
        --without-modules builds, though shouldn't be much need for it.
        * alloc.c (unstaticpro_memory_usage_stats): Wrap this with #ifdef
        HAVE_SHLIB, fix the --without-modules build.
        * emacs.c (initialize_temacs):
        Wrap call to vars_of_module() with #ifdef HAVE_SHLIB.
        * emodules.c:
        * emodules.c (make_module):
        Fix some indentation here.
        * emodules.c (vars_of_module): No longer check for HAVE_SHLIB
        here, since this file will not be linked if it is not defined.
        * lisp.h:

2026-08-22  Aidan Kehoe  <kehoea@parhasard.net>

        * Makefile.in.in ($(RAW_EXE)):
        Look for xemacs.dmp.in in the source tree, not the build tree,
        thank you Stephen Turnbull. Fixes out-of-tree builds.

2026-08-20  Aidan Kehoe  <kehoea@parhasard.net>

        * buffer.c (push_buffer_list):
        No longer take NAME as an argument to this, missed in
        a5dabb8d55ec.
        * buffer.c (finish_init_buffer):
        No longer pass push_buffer_list() NAME as an argument.

2026-08-12  Aidan Kehoe  <kehoea@parhasard.net>

        Mark the names of dumped, interned symbols Lisp-readonly. 

        * alloc.c:
        * alloc.c (finalize_obarray_mapper): Rename
        finalize_functions_in_obarray() to this. Mark it with
        ATTRIBUTE_COLD.
        As well as marking subrs and prompts C-readonly, mark the names of
        interned symbols as Lisp-readonly, reducing run-time corruption if
        Lisp attempts to modify them.
        * alloc.c (disksave_object_finalization):
        Call the function with its new name. No need for a local variable
        to store the hash table for interned prompts.

2026-08-07  Aidan Kehoe  <kehoea@parhasard.net>

        * sequence.c (Freduce):
        Always GCPRO accum in this function, avoid a crash I just provoked.

2026-08-06  Aidan Kehoe  <kehoea@parhasard.net>

        * specifier.c (setup_charset_initial_specifier_tags):
        Add a needed GCPRO() here, call_charset_tag_predicate() can GC and
        CHARSET_TAG_LIST is not otherwise reachable.

2026-08-03  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (allocate_lisp_storage):
        * alloc.c (ALLOCATE_FIXED_TYPE_1):
        Add assertions that we are either not in GC or that we are
        in_debug_print if allocating a Lisp object, since allocating Lisp
        objects in GC will lead to use-after-free issues down the line.

2026-07-25  Aidan Kehoe  <kehoea@parhasard.net>

        * specifier.c (call_validate_method):
        * specifier.c (check_valid_instantiator):
        * specifier.c (call_validate_matchspec_method):
        * specifier.c (check_valid_specifier_matchspec):
        Revert this part of my last change, Matsl has demonstrated with
        the buildbot that the not very exotic platform of g++ on AMD64 can
        have one-byte aligned function pointers. (Odd, I was developing
        today on clang on AMD64.)

        * alloc.c (free_managed_lcrecord):
        Use another approach to the same problem; just decrease the cons
        counter when we free a managed lcrecord, in the same way that
        free_cons() and friends decrease the cons counter for a frob block
        object.

2026-07-25  Aidan Kehoe  <kehoea@parhasard.net>

        * specifier.c (call_validate_method):
        * specifier.c (check_valid_instantiator):
        * specifier.c (call_validate_matchspec_method):
        * specifier.c (check_valid_specifier_matchspec):
        Avoid some GC noise when profiling in these functions, use
        STORE_VOID_IN_LISP(), GET_VOID_FROM_LISP() rather than
        make_opaque_ptr(), get_opaque_ptR() when passing around the C
        function pointer.

2026-07-20  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (LCHEADER_LHEADER_NO_ASSERT):
        Fix this on macOS, add three missing parentheses.
        * alloc.c (init_alloc_once_early):
        Add an assertion to ensure that this works.

2026-07-19  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.def.in.in:
        Update this to reflect recent changes, get Cygwin and Visual
        Studio building. Right thing to do is to use a similar export
        infrastructure on Linux, which will also reduce startup times on
        that platform (and other ELF platforms).

2026-07-19  Aidan Kehoe  <kehoea@parhasard.net>

        * regex.c (struct reg_match_info_data): Don't needlessly
        create a one-element array of this when declaring the structure,
        thank you clang++-11.

2026-07-14  Aidan Kehoe  <kehoea@parhasard.net>

        Remove alloc_automanaged_c_readonly_lcrecord(),
        clear_c_readonly_record_header().
        * alloc.c:
        * alloc.c (old_alloc_sized_lcrecord_1): Remove this, avoid special
        handling for c_readonly lcrecords.
        * alloc.c (old_alloc_sized_lcrecord): Use the old implementation
        here.
        * alloc.c (alloc_managed_lcrecord_1): Remove this, avoid special
        handling for c_readonly lcrecords.
        * alloc.c (alloc_managed_lcrecord): Use the old implementation.
        * alloc.c (alloc_automanaged_lcrecord): Call
        alloc_managed_lcrecord() here.
        * alloc.c (alloc_automanaged_c_readonly_lcrecord): Remove this.
        * alloc.c (clear_c_readonly_record_header): Remove this.
        * lrecord.h:
        Update some comments.
        * lrecord.h (ALLOC_C_READONLY_LISP_OBJECT): Remove this.
        * lrecord.h (struct lrecord_header):
        Give a bit more info on the C_READONLY flag.
        Remove unneeded forward declaration for struct lrecord_implementation.
        * lrecord.h (set_lheader_implementation):
        Update this to avoid multiple evaluation of the IMP argument.
        * lrecord.h (CLEAR_C_READONLY_RECORD_HEADER):
        Revert to previous implementation of this. Remove declaration for
        clear_c_readonly_record_header().
        Remove mention of the reinit_vars_of_*() functions, now gone.
        Re-order documentation of dumped data to prioritise root block
        pointers.
        Remove declaration for alloc_automanaged_c_readonly_lcrecord().
        * symeval.h (DEFVAR_SYMVAL_FWD_NON_LISP):
        No longer call ALLOC_C_READONLY_LISP_OBJECT() here, call
        ALLOC_NORMAL_LISP_OBJECT() and SET_C_READONLY().

2026-07-11  Aidan Kehoe  <kehoea@parhasard.net>

        XCASE_TABLE_UPDATE() can allocate fresh Lisp_Objects, and if this is
        done late in GC they may not be unmarked appropriately, leading to
        them not being traced appropriately at next GC, giving a crash
        with access to free memory.

        Avoid this by calling CASE_TABLE_CANON (XCASE_TABLE (casetab)),
        CASE_TABLE_EQV (XCASE_TABLE (casetab) in
        case_table_memory_usage().

        Thank you for the bug report, Henry S. Thompson. Longstanding bug
        that happened to make itself known after my change of 5dbab3b8c408
        in a specific configuration he uses.

        * casetab.c (case_table_memory_usage):
        As above.

        * casetab.h (XCASE_TABLE_UPDATE):
        Add a gc_checking_assert (!gc_in_progress) to this function.
        Update comments for XCASE_TABLE_CANON(), XCASE_TABLE_EQV().

        * alloc.c (sweep_lcrecords):
        Mark H (an lrecord_header) as free rather than HEADER (which is an
        LCRECORD_HEADER) in passing

2026-06-27  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c:
        Update comment regarding the size of a frob block.
        * alloc.c (TYPE_ALLOC_SIZE):
        No longer hard-code 2048 as the size of a frob block, use sizeof
        (Lisp_Object) << 9, which will give the same behaviour on 32 bit
        builds, but better locality of reference (with, yes, more memory
        usage) for 64 bit builds.
        * gc.h:
        Add a comment regarding MALLOC_OVERHEAD on glibc.

2026-06-25  Aidan Kehoe  <kehoea@parhasard.net>

        Move Lisp_Subr to being an lcrecord, now the NEXT pointer is not
        leaked when dumping. It is not an object that is allocated with
        sufficient frequency to merit having a frob block.

        * alloc.c (make_subr): Removed. Callers should just call
        ALLOC_NORMAL_LISP_OBJECT() instead.
        * alloc.c (sweep_subrs): Removed.
        * alloc.c (gc_sweep): No longer call sweep_subrs().
        * eval.c (syms_of_eval):
        Define it with DEFINE_DUMPABLE_LISP_OBJECT() rather than
        DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT().
        * lisp.h:
        Remove declaration for make_subr().
        * symbols.c (defsubr):
        Call ALLOC_NORMAL_LISP_OBJECT() instead of make_subr().

2026-06-25  Aidan Kehoe  <kehoea@parhasard.net>

        * lrecord.h:
        Update documentation regarding headers for Lisp_Objects, now there
        is no further need for a distinct struct lcrecord_header.
        * lrecord.h (LISP_OBJECT_HEADER): New #define.

        * lrecord.h (NORMAL_LISP_OBJECT_HEADER): #define this to
        LISP_OBJECT_HEADER, which should ease porting of modules.
        * lrecord.h (FROB_BLOCK_LISP_OBJECT_HEADER): Ditto.
        * lrecord.h (IF_OLD_GC): Remove this in passing, no longer needed.

        * alloc.c (struct lcrecord_list):
        * buffer.h (struct buffer):
        * bytecode.h (struct Lisp_Compiled_Function):
        * casetab.h (struct Lisp_Case_Table):
        * charset.h (struct Lisp_Charset):
        * chartab.h (struct Lisp_Char_Subtable):
        * chartab.h (struct Lisp_Char_Table):
        * chartab.h (struct Lisp_Category_Table):
        * console-impl.h (struct console):
        * console-msw-impl.h (struct Lisp_Devmode):
        * console-msw-impl.h (struct mswindows_dialog_id):
        * database.c (struct Lisp_Database):
        * device-impl.h (struct device):
        * elhash.c (struct Hash_Table_Test):
        * elhash.c (struct Lisp_Hash_Table):
        * emodules.c (struct Lisp_Module):
        * events.h (struct Lisp_Timeout):
        * events.h (struct Lisp_Event):
        * events.h (struct low_level_timeout):
        * events.h (struct command_builder):
        * extents-impl.h (struct extent):
        * extents-impl.h (struct extent_auxiliary):
        * extents-impl.h (struct extent_info):
        * faces.h (struct Lisp_Face):
        * file-coding.c (syms_of_file_coding):
        * file-coding.h (struct Lisp_Coding_System):
        * file-coding.h (struct detection_state):
        * font-mgr.h:
        * font-mgr.h (struct fc_pattern):
        * font-mgr.h (struct fc_config):
        * fontcolor-impl.h (struct Lisp_Color_Instance):
        * fontcolor-impl.h (struct Lisp_Font_Instance):
        * frame-impl.h (struct frame):
        * glyphs.h (struct Lisp_Image_Instance):
        * glyphs.h (struct Lisp_Glyph):
        * glyphs.h (struct expose_ignore):
        * gui.h (struct Lisp_Gui_Item):
        * keymap.c (struct Lisp_Keymap):
        * lisp.h (struct Lisp_Cons):
        * lisp.h (struct Lisp_Vector):
        * lisp.h (struct Lisp_Bit_Vector):
        * lisp.h (DECLARE_INLINE_LISP_BIT_VECTOR):
        * lisp.h (struct Lisp_Symbol):
        * lisp.h (struct Lisp_Subr):
        * lisp.h (struct Lisp_Marker):
        * lisp.h (struct Lisp_Float):
        * lisp.h (struct ephemeron):
        * lisp.h (struct weak_list):
        * number.h (struct Lisp_Bignum):
        * number.h (struct Lisp_Ratio):
        * number.h (struct Lisp_Bigfloat):
        * opaque.h:
        * opaque.h (Lisp_Opaque):
        * opaque.h (Lisp_Opaque_Ptr):
        * procimpl.h (struct Lisp_Process):
        * rangetab.h (struct Lisp_Range_Table):
        * scrollbar.h (struct scrollbar_instance):
        * specifier.h (struct Lisp_Specifier):
        * symeval.h:
        * symeval.h (SYMBOL_VALUE_MAGIC_P):
        * symeval.h (struct symbol_value_forward_fixnum_magic):
        * symeval.h (struct symbol_value_forward_boolint_magic):
        * toolbar.h (struct toolbar_button):
        * tooltalk.c (struct Lisp_Tooltalk_Message):
        * tooltalk.c (struct Lisp_Tooltalk_Pattern):
        * ui-gtk.h:
        * unicode.h (struct precedence_array):
        * window-impl.h (struct window):
        * window-impl.h (struct window_mirror):
        Change FROB_BLOCK_LISP_OBJECT_HEADER, NORMAL_LISP_OBJECT_HEADER to
        LISP_OBJECT_HEADER in all these structures.

2026-06-25  Aidan Kehoe  <kehoea@parhasard.net>

        Fix my last change, no longer leak an extra sizeof (void *) of
        memory per lcrecord at runtime.

        * alloc.c:
        * alloc.c (assert_proper_sizing):
        Take IMPLEMENTATION as an argument, rather than assuming it is
        available in the current function.
        * alloc.c:
        Move the typedef and Lisp object boilerplate, memory description
        for Lisp_Free earlier in this file, now it is used by the
        lcrecord_list implementation.

        * alloc.c (struct lcheader):
        Revise this type, just include NEXT.
        New structures, lcheader_max_align_t_aligned,
        lcheader_void_ptr_aligned, reflecting differing header sizes
        depending on header alignment need.
        * alloc.c (LCHEADER_OVERHEAD_VOID_PTR_ALIGNED):
        * alloc.c (LCHEADER_OVERHEAD_MAX_ALIGN_T_ALIGNED):
        New constants, determined from the above new structures.
        * alloc.c (LCHEADER_MAX_ALIGNEDP): New macro.
        * alloc.c (SET_LCHEADER_MAX_ALIGNEDP): New macro.
        * alloc.c (LCHEADER_LHEADER_NO_ASSERT):
        Take the lcheader argument twice to avoid multiple evaluation. Two
        implementations, depending on whether we can implement it without
        branching or not.
        * alloc.c (SET_LCHEADER_NEXT_NO_ASSERT): New macro, set an
        lcheader's next field preserving its MAX_ALIGNEDP bit.
        * alloc.c (LCHEADER_NEXT_NO_ASSERT): New macro, access an
        lcheader's next field ignoring its MAX_ALIGNEDP bit.
        * alloc.c (GC_CHECK_LCHEADER_INVARIANTS) New inline function on
        ERROR_CHECK_GC builds, analagous to GC_CHECK_LHEADER_INVARIANTS.
        * alloc.c (LCHEADER_NEXT_1): Function using it on ERROR_CHECK_GC
        builds.
        * alloc.c (LCHEADER_NEXT): #define for this, using LCHEADER_NEXT_1
        on ERROR_CHECK_GC builds.
        * alloc.c (SET_LCHEADER_NEXT_1): New inline function used
        on ERROR_CHECK_GC builds, does consistency checking.
        * alloc.c (SET_LCHEADER_NEXT): #define for this, using
        SET_LCHEADER_NEXT_1 on ERROR_CHECK_GC builds.
        * alloc.c (LCHEADER_LHEADER_1, LCHEADER_LHEADER): Same approach
        with an inline function, assertions.
        * alloc.c (OBJECT_LCHEADER_1): Use GC_CHECK_LCHEADER_INVARIANTS()
        here.
        * alloc.c (MARK_LCRECORD_AS_FREE):
        New macro.
        * alloc.c (old_alloc_sized_lcrecord_1):
        Examine implementation->lcheader_overhead, pass IMPLEMENTATION to
        assert_proper_sizing(). Call SET_LCHEADER_MAX_ALIGNEDP() as
        appropriate. Call LCHEADER_LHEADER() with its new calling
        convention.
        * alloc.c (free_normal_lisp_object):
        Move the implementation of old_free_lcrecord() into this. Remove
        the latter's declaration.
        * alloc.c (lcrecord_list):
        Move the declaration for this struct and the boilerplate for the
        Lisp_Object here from lrecord.h, no need to expose it to other
        files. Declare FREE as a Lisp_Free * rather than a Lisp_Object,
        for better compatibility with the frob block free lists.
        Remove the declaration for struct free_lcrecord_header, no longer
        needed.
        * alloc.c (disksave_lcrecord_list):
        Remove a comment that is no longer true. Set the free pointer to
        NULL rather than Qnil.
        * alloc.c (make_lcrecord_list):
        Set the free pointer to NULL rather than Qnil.
        * alloc.c (alloc_managed_lcrecord_1):
        Examine list->free as a pointer rather than a Lisp_Object. Call
        SET_LCHEADER_MAX_ALIGNEDP() as appropriate. Use
        LCHEADER_LHEADER_NO_ASSERT(), call zero_sized_lisp_object() using
        the implementation's lcheader_overhead.
        * alloc.c (print_lcrecord_list):
        Examine list->free as a pointer rather than a Lisp_Object.
        * alloc.c (free_managed_lcrecord):
        Manipulate list->free as a pointer rather than a Lisp_Object. Call
        MARK_LCRECORD_AS_FREE().
        * alloc.c (compare_lcrecord_lists): Give this a better name in
        passing.
        * alloc.c (find_lcrecord_list):
        Take a new argument, lcheader_overhead. Call
        compare_lcrecord_lists() with its new name.
        * alloc.c (get_lcrecord_list): Take a new argument,
        lcheader_overhead.
        * alloc.c (old_free_lcrecord): Removed, implementation moved to
        free_normal_lisp_object().
        * alloc.c (clear_c_readonly_record_header):
        Update this to accept frob block objects.
        * alloc.c (define_lisp_object):
        New argument, ALIGNMENT. Store this in the
        lrecord_implementation. Calculate lcheader_overhead from this,
        initialize it. Call get_lcrecord_list() with its new name.
        No need now for bootstrap handling of the FREE slot of the created
        lcrecord_list.
        * alloc.c (sweep_lcrecords):
        Call LCHEADER_LHEADER with its new calling convention. Manipulate
        the beginning of the list slightly differently.
        * alloc.c (gc_sweep):
        Traverse the FREE slot of the lcrecord_lists as a pointer rather
        than a Lisp_Object.
        * alloc.c (disksave_object_finalization_1):
        Call LCHEADER_LHEADER() with its new convention.
        * alloc.c (init_alloc_once_early):
        Update the call to DEFINE_NODUMP_INTERNAL_LISP_OBJECT() using
        struct Lisp_Free as the structure argument.
        * config.h.in:
        Make SIZEOF_MAX_ALIGN_T available here.
        * gc.h (GC_CHECK_LHEADER_INVARIANTS):
        Declare GCLI_lh as const, placate callers in alloc.c.
        * lrecord.h:
        * lrecord.h (struct lrecord_implementation):
        Declare ALIGNMENT, LCHEADER_OVERHEAD as slots in this.
        * lrecord.h (DEFINE_DUMPABLE_LISP_OBJECT):
        * lrecord.h (DEFINE_DUMPABLE_SIZABLE_LISP_OBJECT):
        * lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_LISP_OBJECT):
        * lrecord.h (DEFINE_DUMPABLE_FROB_BLOCK_SIZABLE_LISP_OBJECT):
        * lrecord.h (DEFINE_DUMPABLE_SIZABLE_INTERNAL_LISP_OBJECT):
        * lrecord.h (DEFINE_NODUMP_LISP_OBJECT):
        * lrecord.h (DEFINE_NODUMP_SIZABLE_LISP_OBJECT):
        * lrecord.h (DEFINE_NODUMP_FROB_BLOCK_LISP_OBJECT):
        * lrecord.h (DEFINE_NODUMP_FROB_BLOCK_SIZABLE_LISP_OBJECT):
        Update all these to pass the structtype to MAKE_LISP_OBJECT().
        * lrecord.h (MAKE_LISP_OBJECT):
        Pass ALIGNOF (structtype) to define_lisp_object().
        Update declaration for define_lisp_object().
        * lrecord.h (struct lcrecord_list):
        Move the declaration of this to alloc.c, no need to expose it to
        other code. Update some comments.
        Update declaration of get_lcrecord_list().
        * lstream.c:
        * lstream.c (sizeof_lstream):
        SIZE slot of lcrecord_list is no longer exposed, revert to the
        previous implementation of this.
        * lstream.h (DEFINE_LSTREAM_IMPLEMENTATION_WITH_DATA):
        * lstream.h (DEFINE_LSTREAM_IMPLEMENTATION):
        Call get_lcrecord_list() with its new argument in these macros.

2026-06-24  Aidan Kehoe  <kehoea@parhasard.net>

        No longer allocate low level timeouts as C readonly, in
        preparation for further work which interacted poorly with this.
        * event-stream.c:
        Update a comment here.
        * event-stream.c (add_low_level_timeout):
        Call ALLOC_NORMAL_LISP_OBJECT() for the timeout.
        * events.h (struct low_level_timeout):
        Update the header to be NORMAL_LISP_OBJECT_HEADER.
        * event-tty.c (vars_of_event_tty):
        * signal.c (syms_of_signal):
        Make the dumper and GC aware of a couple of queues using
        staticpro_dump_nil() rather than dump_add_root_lisp_object().

2026-06-12  Aidan Kehoe  <kehoea@parhasard.net>

        Move old_lcrecord_header->next out of the Lisp_Object, remove the
        need for distinct NORMAL_LISP_OBJECT_HEADER vs
        FROB_BLOCK_LISP_OBJECT object headers (distinction maintained in
        macros for now), and no longer leak old_lcrecord_header->next in
        the dump file.

        This is a first draft and uses an extra sizeof (void *) of memory
        per lcrecord at runtime; I plan to address this shortly.
        * alloc.c:
        * alloc.c (struct lcheader): Rename struct old_lcrecord_header to
        this for clarity. Move the structure declaration here, no need for
        it to be in lrecord.h.
        * alloc.c (LCHEADER_LHEADER_NO_ASSERT):
        * alloc.c (LCHEADER_LHEADER_1):
        * alloc.c (LCHEADER_LHEADER):
        * alloc.c (LCHEADER_NEXT):
        * alloc.c (SET_LCHEADER_NEXT):
        New macros to access the fields of struct lcheader, in preparation
        for further work that will make direct access to structure fields
        less practical. Add some error checking to them.

        * alloc.c (OBJECT_LCHEADER_1):
        * alloc.c (OBJECT_LCHEADER):
        New macro to access the LCHEADER of a Lisp_Object that has been
        allocated as an lcrecord.

        * alloc.c (old_alloc_sized_lcrecord_1):
        Now that lcheader.next is no longer in the Lisp_Object, increase
        the amount of memory allocated by that needed for it in this
        function. Use the accessor macros above.

        * alloc.c (very_old_free_lcrecord):
        Update this to use the accessor macros, and to free the lcrecord
        rather than the lrecord.
        * alloc.c (copy_lisp_object):
        No need to handle frob block vs. lcrecords differently here.
        * alloc.c (zero_sized_lisp_object):
        Ditto.
        * alloc.c (c_readonly): Modernize type for this in passing.
        * alloc.c (lisp_readonly): Ditto.
        * alloc.c (struct free_lcrecord_header):
        Move this declaration here. Update it to reflect that
        lcheader.next has been moved outside the Lisp_Object.
        * alloc.c (alloc_managed_lcrecord_1):
        Use XRECORD_LHEADER() here, now we can.
        * alloc.c (free_managed_lcrecord):
        Rename the record to be freed to OBJECT from LCRECORD.  Use
        XRECORD_LHEADER(), then cast to a free_lcrecord_header as a more
        idiomatic thing.  If the object is C_READONLY(), add it to
        all_lcrecords if needed.
        * alloc.c (clear_c_readonly_record_header): New.
        De-inline this, since it now needs to access all_lcrecords.
        * alloc.c (sweep_lcrecords_1):
        Update type for the PREV arg. Use the accessor macros.
        * alloc.c (disksave_object_finalization_1):
        Update type for the HEADER local variable. Use the accessor macros.
        * emodules.c (add_module_loadhist_elt):
        Remove some now-inaccurate commentary.
        * emodules.h (EMODULES_VERSION):
        Increase the version number here, now the memory layout for
        Lisp_Objects has changed significantly.
        * lisp.h: Modernize type for declarations of c_readonly(),
        lisp_readonly() here.
        * lrecord.h:
        * lrecord.h (NORMAL_LISP_OBJECT_HEADER):
        #define this to be struct lrecord_header, same as
        FROB_BLOCK_LISP_OBJECT_HEADER.
        Remove declaration for lrecord_type_index(), not defined anywhere
        and equivalent to examining the lrecord_type_index field of an
        implementation.
        * lrecord.h:
        Remove declarations for struct old_lcrecord_header, struct
        free_lcrecord_header from here.
        Declare clear_c_readonly_record_header() here, use it in the
        CLEAR_C_READONLY() macro.
        * symeval.h:
        * symeval.h (struct symbol_value_magic):
        Remove documentation of the abuse of the NEXT pointer of struct
        old_lcrecord_header, now gone.
        * symeval.h (SYMBOL_VALUE_MAGIC_P):
        * symeval.h (struct symbol_value_forward_fixnum_magic):
        No longer abuse the NEXT pointer of struct old_lcrecord_header.
        * symeval.h (struct symbol_value_forward_boolint_magic):
        Ditto.
        * symeval.h (struct symbol_value_buffer_local):
        Remove obsoleted comment here.

2026-06-12  Aidan Kehoe  <kehoea@parhasard.net>

        Get the last change working on non-C++ compilers. In passing add
        assertions to lisp_object_has_method_1(),
        lisp_object_has_property_1() that the existing fields in the
        lrecord_implementation are zero.
        * alloc.c (get_unused_lrecord_type):
        Cast appropriately for C here.
        * alloc.c (lisp_object_has_method_1):
        Check existing method is NULL.
        * alloc.c (lisp_object_has_property_1):
        Check existing property is zero.
        * alloc.c (init_alloc_once_early):
        Correct a cast, call Dynarr_new2 appropriately.

2026-06-12  Aidan Kehoe  <kehoea@parhasard.net>

        Mark the entries in lrecord_implementations_table,
        lrecord_memory_descriptions const, only modify them via the
        Dynarrs.
        * alloc.c:
        Update declarations for lrecord_implementations_table,
        lrecord_memory_descriptions.
        * alloc.c (lisp_object_has_method_1): New. De-inlined implementation
        of the bulk of OBJECT_HAS_METHOD(), wrapping write access to
        lrecord_implementations.
        * alloc.c (lisp_object_has_property_1): New. De-inlined
        implementation of the bulk of OBJECT_HAS_PROPERTY, wrapping write
        access to lrecord_implementations. Handle the description
        specially.
        * alloc.c (undef_lisp_object):
        * alloc.c (init_alloc_once_early):
        * file-coding.c:
        * file-coding.c (initialize_detector_description):
        Use OBJECT_HAS_PROPERTY() here when setting the 
        * lisp.h:
        Move the typedef of lisp_fn_t before #include of lrecord.h, now it
        uses it.
        * lisp.h (struct Lisp_Subr):
        * lrecord.h:
        Declare lrecord_implementations_table as a pointer to a const
        table of const struct lrecord_implementation *, avoid modification
        of it beyond the sanctioned way.
        Declare lisp_object_has_method_1(), lisp_object_has_property_1()
        here. Revise OBJECT_HAS_METHOD(), OBJECT_HAS_PROPERTY() and
        friends to use them.

2026-06-09  Aidan Kehoe  <kehoea@parhasard.net>

        Implement lrecord_implementations_table using a Dynarr, remove
        unneeded limits on the number of Lisp_Object types created by
        modules.

        * alloc.c:
        * alloc.c (struct):
        * alloc.c (static const struct sized_memory_description
        lrecord_implementations_description): New.
        * alloc.c (static const struct sized_memory_description
        lrecord_implementations_table_description): New.
        * alloc.c (static const struct sized_memory_description
        memory_description_dynarr_description): New. 
        * alloc.c (static const struct sized_memory_description
        lrecord_memory_descriptions_description): New. 
        * alloc.c (static struct sized_memory_description
        lrecord_uid_counter_description): New. 
        * alloc.c (static const struct sized_memory_description
        lrecord_stats_elt_description): New. 
        * alloc.c (static const struct sized_memory_description
        lrecord_stats_elt_dynarr_description): New.
        * alloc.c (clear_lrecord_stats):
        Manipulate lrecord_stats as a Dynarr within this function.
        * alloc.c (tick_lrecord_stats):
        Ditto.
        * alloc.c (finish_object_memory_usage_stats):
        Ditto.
        * alloc.c (COPY_INTO_LRECORD_STATS):
        Ditto.
        * alloc.c (object_memory_usage_stats):
        Ditto.
        * alloc.c (garbage_collection_statistics):
        Ditto.
        * alloc.c (disksave_finalize_memusage_stats):
        Ditto.
        * alloc.c (init_memory_usage_stats):
        Manipulate the memusage stats list using the Dynarr rather than
        lrecord_implementations_table.
        * alloc.c (uninit_memory_usage_stats):
        Ditto.
        * alloc.c (get_unused_lrecord_type): New.
        Now creating a new lrecord_type may lead to realloc() of
        lrecord_implementations_table,
        init_lrecord_type_NEW_OBJECT_TYPE_NAME() cannot just tick
        lrecord_type_count. This function does the book-keeping for this,
        called from init_lrecord_type_NEW_OBJECT_TYPE_NAME().
        * alloc.c (define_lisp_object):
        Manipulate the Dynarr rather than lrecord_implementations_table.
        * alloc.c (undef_lisp_object):
        Ditto. Use opaque_description rather than an identical
        empty_memory_description_1. Only decrement lrecord_type_count if
        consing_since_gc is zero, which fixes a separate bug.
        * alloc.c (init_alloc_once_early):
        Initialize the Dynarrs, use dump_add_root_block_ptr()
        appropriately on them.
        * file-coding.c:
        * file-coding.c (struct):
        Be a little clearer with naming here.
        * file-coding.c (static const struct sized_memory_description
        memory_description_dynarr_description): Removed. 
        * file-coding.c (static const struct sized_memory_description
        struct_memory_description_dynarr_description): New. 
        Ditto.
        * file-coding.c (initialize_detector_description):
        Use the new name for the memory description.
        * lrecord.h:
        Update a comment here.
        * lrecord.h (LRECORD_TYPE_MAX):
        New #define, equivalent to UINT_16_BIT max.
        Declare lrecord_uid_counter as a pointer rather than an array.
        * lrecord.h (enum lrecord_type):
        Give a better value for lrecord_type_last_built_in_type.
        Declare get_unused_lrecord_type().
        Declare lrecord_implementations_table as a pointer rather than an
        array.
        * lrecord.h (DECLARE_MODULE_LISP_OBJECT):
        Call get_unused_lrecord_type() in the init_lrecord_type_##c_name
        function.
        * opaque.c:
        Define opaque_description as non-static.
        * opaque.h:
        Declare opaque_description as extern.

2026-06-07  Aidan Kehoe  <kehoea@parhasard.net>

        Fselected_window() can return Qnil, respect this more consistently
        in the C code, avoid crashes very early and very late where there
        may not be a selected window.

        * cmdloop.c (Frecursive_edit):
        Don't call XWINDOW_XBUfFER() on the result of Fselected_window().
        * event-stream.c (execute_command_event):
        Use decode_window (Qnil) rather than XWINDOW (Fselected_window
        ()); other calls within this function can error so this won't
        complicate anything.
        * redisplay.c (decode_mode_spec):
        Don't do an XWINDOW() on the result of Fselected_window().
        * scrollbar.c (scrollbar_reset_cursor):
        Ditto.
        * scrollbar.c (Fscrollbar_to_top):
        Ditto. Be more careful to pass the decoded window to
        Fcenter_to_window_line(), scrollbar_reset_cursor(),
        set_window_point().
        * scrollbar.c (Fscrollbar_to_bottom):
        Ditto.
        * scrollbar.c (Fscrollbar_vertical_drag):
        Don't do an XWINDOW() on the result of Fselected_window().
        * specifier.c (decode_domain):
        Revise this to understand that Fselected_window() can return Qnil.
        * window.c (decode_window):
        Ditto.
        * window.c (Fwindow_point):
        Don't do XWINDOW() on the result of Fselected_window().
        * window.c (unshow_buffer):
        Ditto.
        * window.c (Fdelete_window):
        Call CHECK_WINDOW() on the result of Fselected_window().
        * window.c (Fscroll_up):
        Pass the result of decode_window() to window_scroll().
        * window.c (Fscroll_down):
        Ditto.
        * window.c (Fother_window_for_scrolling):
        Only call XWINDOW() if selected_window is non-nil.
        * window.c (Fscroll_left):
        Pass the result of decode_window() to Fset_window_scroll().
        * window.c (Fscroll_right):
        Ditto.

2026-06-06  Aidan Kehoe  <kehoea@parhasard.net>

        Move the decision-making about whether
        pdump_reorganize_hash_tables() is needed entirely to
        pdump_load_finish().

        * dumper.c:
        #include sysdep.h here, now needed for qxegetpagesize().
        * dumper.c (pdump_load_finish):
        If we have allocated the dump file using xnew_array(), set
        page_size_reorganize_threshold to the new constant
        REORGANIZE_THRESHOLD_MAX_ALIGN_T_ALIGNED.
        Otherwise, call qxegetpagesize(), compare it to
        page_size_reorganize_threshold, and if its greater than or equal
        to the latter, set pdump_hash_table_reorganize_count to zero.
        * elhash.c:
        Flesh out documentation of page_size_reorganize_threshold.
        * elhash.c (disksave_hash_table):
        Use new constant REORGANIZE_THRESHOLD_ALWAYS_REORGANIZE.
        * elhash.c (pdump_reorganize_hash_tables):
        Check for REORGANIZE_THRESHOLD_MAX_ALIGN_T_ALIGNED in this
        function.
        * elhash.h:
        * elhash.h (REORGANIZE_THRESHOLD_ALWAYS_REORGANIZE):
        * elhash.h (REORGANIZE_THRESHOLD_MAX_ALIGN_T_ALIGNED):
        New constants.
        * emacs.c (main_1):
        Just check pdump_hash_table_reorganize_count is non-zero when
        deciding on whether to call pdump_reorganize_hash_tables().

2026-06-06  Aidan Kehoe  <kehoea@parhasard.net>

        Don't dump reloc table for non-Lisp_Objects if !HAVE_ASLR and
        DUMP_IN_EXEC. Various other dump cleanups.

        * alloc.c:
        Rename pdump_rt_list to pdump_relocation_table (it is not a list),
        declare it here since it is used at runtime during GC.
        * alloc.c (static const struct sized_memory_description
        pdump_reloc_table_description): New. Description for it, so it
        does not need special handling by pdump_load_finish().
        * alloc.c (enum lrecord_alloc_status):
        Move this declaration here, no longer needed to have it in a
        header file now pdump_objects_unmark() is in this file.
        * alloc.c (pdump_objects_unmark):
        Move this to this file. Be more careful about alignment when
        traversing pdump_relocation_table.
        * alloc.c (vars_of_alloc):
        Call dump_add_root_block_ptr () on &pdump_relocation_table, to
        allow it to be restored in the normal way without special
        handling.
        * dumper.c:
        Move the structure declaration for pdump_reloc_table to dumper.h,
        now it is used in alloc.c.
        * dumper.c (pdump_objects_unmark): Move to alloc.c.
        Update the documentation of the layout of the dump file.
        Rearrange the real header.
        * dumper.c (pdump_initialize_root_block_ptr_very_late): New. Now
        pdump_relocation_table is a dumped object initialized very late in
        the same way as was pdump_hash_tables_for_reorganize, implement
        this using a separate function.
        * dumper.c (pdump_allocate_offset_rtables):
        No longer process pdump_desc_table if we are no-ASLR and
        DUMP_IN_EXEC, not needed.
        * dumper.c (pdump_dump_rtables):
        Ditto.
        * dumper.c (pdump):
        Store block_ptrs_offset in the header. No need to seek to
        header.rtab_offset (or, now, header.block_ptrs_offset).
        * dumper.c (pdump_load_finish):
        Restore the root_block_ptrs first, now pdump_relocation_table is
        dumped as a root_block_ptr. Then relocate the Lisp_Objects and the
        non-Lisp_Object blocks; turns out to be faster to do this here
        than later. Then restore the root blocks, and the serialized
        objects. 
        * dumper.h:
        Remove declaration for pdump_objects_unmark() from here, now
        static to alloc.c.
        * dumper.h (struct):
        Declare pdump_reloc_table as a structure here, now used by
        alloc.c. Declare pdump_relocation_table here, now used by
        alloc.c.
        * elhash.c:
        * elhash.c (static const struct sized_memory_description
        pdump_hash_tables_for_reorganize_description): Removed.
        * elhash.c (vars_of_elhash):
        Pass &lisp_object_description as the description for
        pdump_hash_tables_for_reorganize, no need for a separate
        description.
        * lrecord.h:
        Remove declarations for enum lrecord_alloc_status,
        tick_lrecord_stats() from here, now local to alloc.c
        * symbols.c (init_symbols_once_early):
        Document that it would be possible to make Qnil constant at
        compile time for no-PIE DUMP_IN_EXEC builds.
        * sysdep.h:
        Remove declaration for pdump_read_file(), which doesn't exist.

2026-06-04  Aidan Kehoe  <kehoea@parhasard.net>

        Silence warnings regarding the C++ one definition rule on Cygwin,
        struct textual_run.

        * redisplay-msw.c (msw_textual_run): Rename struct textual_run to this.
        * redisplay-msw.c (separate_textual_runs): Use the new type name.
        * redisplay-msw.c (mswindows_text_width_single_run): Ditto.
        * redisplay-msw.c (mswindows_output_string): Ditto.
        * redisplay-msw.c (mswindows_text_width): Ditto.
        * redisplay-x.c (struct x_textual_run): Rename struct textual run
        to this.
        * redisplay-x.c (separate_textual_runs_xft_mule): Use the new type
        name.
        * redisplay-x.c (separate_textual_runs_mule): Ditto.
        * redisplay-x.c (separate_textual_runs): Ditto.
        * redisplay-x.c (x_text_width_single_run): Ditto.
        * redisplay-x.c (x_text_width): Ditto.
        * redisplay-x.c (x_output_string): Ditto.

2026-06-03  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (make_bit_vector):
        Correct an assertion here, if length is zero NUM_LONGS will be
        zero, giving a divide by zero. Thank you Paul Dietz and his
        ansi-tests suite.
        I had previously asked him if I could incorporate these tests into
        XEmacs without a response; I note now that he has added an MIT
        licence to his github repository, so this should be reconsidered.

2026-06-03  Aidan Kehoe  <kehoea@parhasard.net>

        * sequence.c (mismatch_string_string):
        The vast majority of times #'mismatch is called on two strings
        with the test being #'eq. In this case (similar to 37a35bc7967c of
        2025-11-14), avoid the checks that Lisp hasn't relocated the
        string data for comparison, just compare the itext_ichar of both
        string offsets.

2026-06-02  Aidan Kehoe  <kehoea@parhasard.net>

        * buffer.c:
        * buffer.c (record_buffer_1):
        No bug in list_position_cons_before(), the issue was that I had
        been passing the wrong value for the TEST_NOT_UNBOUNDP
        arg. Restore the revised algorithm of 2026-06-01, correct the
        TEST_NOT_UNBOUNDP.
        * lisp.h:
        Document this pitfall at the declaration of
        list_position_cons_before().

2026-06-01  Aidan Kehoe  <kehoea@parhasard.net>

        * buffer.c (record_buffer_1):
        Revert to the previous algorithm in this, avoid infinite loop in
        switch-to-previous-buffer-in-group in region-tests.el. Needs
        further investigation to get to the root of this;
        list_position_cons_before() may theoretically be buggy despite
        Paul Dietz' excellent test suite used at the time of its
        implementation.

2026-05-31  Aidan Kehoe  <kehoea@parhasard.net>

        Change Vbuffer_alist, Lisp_Frame.buffer_alist into simple
        lists. Simplify #'reduce-across-buffers accordingly, avoid the
        need to stack-allocate a vector.
        Simplify the implementation of other functions too, remove the
        need to suppress warnings.

        * buffer.c:
        Rename Vbuffer_alist to Vbuffer_list. Update its documentation.

        * buffer.c (cleanup_buffer_undo_lists):
        Loop across it as a normal list.
        * buffer.c (decode_buffer_list): New. Given FRAME_IN_OUT, either
        Qt, Qnil (for the selected frame), or a frame object, return
        Vbuffer_list or the frame's buffer list. Set FRAME_IN_OUT to a
        frame object if it was non-Qt.
        * buffer.c (Fbuffer_list):
        Use it. Just call Fcopy_list on its result.
        * buffer.c (Freduce_across_buffers):
        Greatly simplify this.
        * buffer.c (get_buffer):
        Loop across Vbuffer_list as a normal list.
        * buffer.c (Fget_file_buffer):
        Ditto.
        * buffer.c (push_buffer_list): Rename push_buffer_alist() to
        this. Update its body accordingly.
        * buffer.c (delete_from_buffer_list): Rename
        delete_from_buffer_alist() to this. Simplify its implementation
        accordingly.
        * buffer.c (finish_init_buffer):
        Call push_buffer_list() with its new name.
        * buffer.c (Fgenerate_new_buffer_name):
        Loop across Vbuffer_list as a normal list.
        * buffer.c (Frename_buffer): No longer a need to modify the alist
        when we do this.
        * buffer.c (Fother_buffer):
        Use decode_buffer_list() here. GC-protect the elements of the list
        using GC_EXTERNAL_LIST_LOOP_2(); we should have been doing this
        all along, but have yet to be bitten by it since frames'
        buffer-predicates are so rare.
        * buffer.c (Fkill_buffer):
        Call delete_from_buffer_list() with its new name.
        * buffer.c (record_buffer_1): New. Implement the body of
        Frecord_buffer() using list_position_cons_before(). Respect the
        new format of Vbuffer_list.
        * buffer.c (Frecord_buffer):
        Call record_buffer_1() on Vbuffer_list, f->buffer_list.
        * buffer.c (bury_buffer_1):
        Rename the BUFFER_ALIST argument to BUFFER_LIST. Respect its new
        format.
        * buffer.c (Fbury_buffer):
        Call bury_buffer_1() on &Vbuffer_list,
        &selected_frame()->buffer_list.
        * buffer.c (vars_of_buffer):
        Initialize, staticpro() Vbuffer_list with its new name.
        * fileio.c (Fdo_auto_save):
        Use the new name, format for Vbuffer_list.
        * filelock.c (unlock_all_files):
        Ditto.
        * frame.c:
        * frame.c (allocate_frame_core):
        Use the new names for f->buffer_list, Vbuffer_list.
        * frameslots.h:
        Rename relevant slots to old_buffer_list, buffer_list.
        * lisp.h:
        Update the declaration for Vbuffer_list.
        Declare list_position_cons_before(), now non-static.
        * redisplay.c (redisplay_frame):
        Use the new names for the frame slots.
        * sequence.c (list_position_cons_before):
        Make this non-static now it's used from buffer.c
        * symbols.c (set_default_buffer_slot_variable):
        Use the new name, format for Vbuffer_list.
        * unicode.c (free_precedence_array):
        Ditto.
        * unicode.c (recalculate_unicode_precedence):
        Ditto.

2026-05-30  Aidan Kehoe  <kehoea@parhasard.net>

        Add #'reduce-across-buffers, allow Lisp to examine all live
        buffers without consing.
        Added because (profile-expression '(hanoi 8)) was dominated by the
        GC from #'modeline-update-buffer-names.

        * buffer.c: Declare Q_frame.
        * buffer.c (Freduce_across_buffers): New.
        * buffer.c (syms_of_buffer):
        Add a DEFSUBR() 
        * general-slots.h: Move Q_from_end, Q_initial_value here, now they
        are used in buffer.c.
        * lisp.h:
        Declare Freduce() as an EXFUN.
        * sequence.c:
        * sequence.c (syms_of_sequence):
        Move declaration, definition of Q_from_end, Q_initial_value from
        this file now they are in general-slots.h.

2026-05-21  Aidan Kehoe  <kehoea@parhasard.net>

        Get tip building as C++ under Visual Studio.

        * emacs.c:
        Declare Frun_emacs_from_temacs() as EXFUN_NORETURN.
        * event-stream.c:
        Use portable_offsetof() within the initialization of
        event_stream_description_1, avoid spurious errors that
        "error C2615: 'offsetof' cannot be applied to non-class type
        'event_stream *'"; struct event_stream is indeed not a class, we
        are not using a pointer at any point within this definition. Event
        renaming the global variable event_stream to the_event_stream does
        not silence this.
        * lisp.h:
        max_align_t can be made available in <cstddef> but not <stddef.h>;
        this is stupid, but work around it if _MSC_VER is defined.

2026-05-26  Aidan Kehoe  <kehoea@parhasard.net>

        Rename XD_OPAQUE_DATA_CONVERTIBLE to XD_SERIALIZE_DATA,
        XD_OPAQUE_PTR_CONVERTIBLE to XD_SERIALIZE_PTR (we use OPAQUE as a
        concept for multiple unrelated things, so the previous name was
        confusing); rename the functions that deal with them accordingly.

        * dumper.c:
        * dumper.c (struct):
        * dumper.c (pdump_get_serialize_info): Renamed from
        pdump_get_cv_info().
        * dumper.c (pdump_get_serialize_ptr_info): Renamed from
        pdump_get_cv_ptr_info().
        * dumper.c (pdump_convert_free_serialize_infos): Renamed from
        pdump_convert_free_cv_infos().
        * dumper.c (pdump_store_new_pointer_offsets):
        * dumper.c (pdump_register_sub):
        Rename XD_OPAQUE_DATA_CONVERTIBLE to XD_SERIALIZE_DATA,
        XD_OPAQUE_PTR_CONVERTIBLE to XD_SERIALIZE_PTR.

        * dumper.c (pdump_reloc_one):
        * dumper.c (pdump_dump_serialize_info): Renamed from
        pdump_dump_cv_info().
        * dumper.c (pdump):
        * dumper.c (pdump_load_finish):
        * lrecord.h:
        * lrecord.h (enum memory_description_type):
        * lrecord.h (union memory_contents_description):
        * lrecord.h (struct serialize_convert_functions): Changed name of
        this from opaque_convert_functions.
        * number.c:
        * number.c (static const struct opaque_convert_functions
        bignum_opc): Removed.
        * number.c (static const struct serialize_convert_functions
        bignum_scf): New.

2026-05-21  Aidan Kehoe  <kehoea@parhasard.net>

        Increase the bit width of struct lrecord_header.type to 16 from 8,
        with a view to relaxing future pressure on the modules regarding
        the number of types they can define.
        * lisp.h (struct Lisp_String):
        Increase the width of TYPE to 16 bits from 8, decrease
        NUM_ASCII_END_BITS to 12 from 20.
        * lisp.h (struct Lisp_Symbol):
        Increase the width of TYPE to 16 bits, decrease first_package_id
        bits to 11 from 19.
        * lrecord.h (struct lrecord_header):
        Increase the width of TYPE to 16 bits, decrease the width of UID
        to 13 bits from 21 bits.

2026-05-21  Aidan Kehoe  <kehoea@parhasard.net>

        Support 4-byte (DWORD) alignment with DUMP_IN_EXEC, in preparation
        for getting the hash table dump-time relocation support working on
        Microsoft Windows.

        * dump-data.c:
        * dump-data.c (INCBIN_ALIGNMENT_INDEX):
        Request four byte, rather than sixteen byte alignment for the dump
        file, with a view to flushing out any alignment issues that the
        native Windows build would encounter, even if building on POSIX.

        * dumper.c:
        Declare initial_offset as a static, top-level variable, now it is
        needed by pdump_align_stream().
        * dumper.c (pdump_align_stream):
        Align the stream based on the current file position plus
        initial_offset, which allows detection of the actual alignment of
        the dumped data with DUMP_IN_EXEC.
        * dumper.c (PDUMP_SIGNATURE_LEN):
        This always was 8, but declare it explicitly as such for clarity.
        * dumper.c (struct): Separate out pdump_header into
        pdump_signature_header (which is happy with four byte alignment)
        and pdump_real_header (which will require eight byte alignment on
        64-bit machines). Motivate this in a comment.
        * dumper.c (pdump):
        Declare the signature header here. Change the type of header to
        pdump_real_header. Remove the declaration of initial_offset from
        this function.
        Initialize the signature header appropriately, then determine the
        offset for the pdump_real_header based on the alignment needed
        after the signature header.
        Determine cur_offset after setting header appropriately.
        Write signature_header first to the dump file, then do an aligned
        write for header.
        * dumper.c (pdump_load_check):
        Cast pdump_start to a pdump_signature_header as is now
        appropriate. Check the length of the dump file in this function
        and error appropriately, rather than in pdump_resource_get(),
        pdump_file_get().
        * dumper.c (pdump_load_finish):
        Use the values in the pdump_real_header for relocation,
        determining its offset within the dump file using ALIGN_PTR().
        * dumper.c (pdump_resource_get):
        Remove the length check from here, leave that to
        pdump_load_check().
        * dumper.c (pdump_file_get):
        Ditto.

2026-05-16  Aidan Kehoe  <kehoea@parhasard.net>

        * buffer.h:
        Remove R_ALLOC_DECLARE() as a #define, not used, and calls
        r_alloc_declare(), which does not exist.
        * ralloc.c:
        * ralloc.c (PAGE): #define this as qxegetpagesize() if emacs is
        defined, otherwise as getpagesize().
        * ralloc.c (ALIGNED):
        Use size_t in this, a better type than unsigned long int.
        * ralloc.c (ALIGNED): Ditto.
        * ralloc.c (ROUNDUP): Ditto.
        * ralloc.c (MEM_ALIGN): Use sizeof (max_align_t) here.
        * ralloc.c (r_alloc_size_in_use): Removed, not used.
        * ralloc.c (reorder_bloc): Removed, long #if 0'd out.
        * ralloc.c (r_alloc_sbrk): Make this static. Don't check for
        r_alloc_initialized, not necessary since we do this very early in
        XEmacs.
        * ralloc.c (r_alloc):
        Don't check for r_alloc_initialized, not necessary since we do
        this very early in XEmacs.
        * ralloc.c (r_alloc_free): Ditto.
        * ralloc.c (r_re_alloc): Ditto.
        * ralloc.c (r_alloc_freeze): Make this static.  Don't check for
        r_alloc_initialized, no need.
        * ralloc.c (r_alloc_thaw): Ditto.
        * ralloc.c (PAGES_FOR): Redefine this in terms of size_t.
        * ralloc.c (ROUNDUP): Ditto.
        * ralloc.c (new_mmap_handle):
        No need to call init_MHASH_table() here.
        * ralloc.c (init_MHASH_table): Remove this, it just set the
        elements of MHASH_HITS to all zero, which the static
        default initialization does anyway; no need to reinitialize now
        unexec is gone.
        * ralloc.c (MHASH): Simplify this.
        * regex.c:
        DOUG_LEA_MALLOC is long gone, no need to check for this when
        deciding not to use REL_ALLOC for the failure stack.

2026-05-15  Aidan Kehoe  <kehoea@parhasard.net>

        * chartab.c (struct ptemap):
        Change the type of NUM_PRINTED, MAX to fixnum, given the latter is
        initialised from Vprint_table_nonreadably_length, and the former
        is compared against the latter.
        Change the type of FIRST to Boolint, which is clearer.
        * chartab.c (print_char_table):
        Initialize NUM_PRINTED, MAX appropriately, silence a
        read-of-uninitialized-data warning from valgrind, thank you
        valgrind.

2026-05-15  Aidan Kehoe  <kehoea@parhasard.net>

        Remove the need to relocate the dumped data on a no-ASLR,
        DUMP_IN_EXEC build.

        * config.h.in:
        New entry here, HAVE_ASLR.

        * dumper.c:
        * dumper.c (struct pdump_header):
        Rename stab_offset to rtab_offset, now it indicates where the
        beginning of the relocation table is.
        New field, rtab_end, used with DUMP_IN_EXEC and -no-pie. Move
        nb_cv_info earlier in the structure for clarity.
        If DUMP_IN_EXEC and !HAVE_ASLR, #define pdump_reloc_c_func(),
        pdump_reloc_c_data, pdump_reloc_lisp_object(),
        pdump_reloc_lisp_data() as identity (cast to the appropriate
        type), helpful within pdump_load_finish(). #define
        pdump_reloc_one() as just marking its arguments as
        used. Otherwise, keep the existing definitiion.
        * dumper.c (pdump_allocate_offset_rtables): New function. Work out
        the offsets needed for the relocation table. Initialize
        pdump_hash_tables_for_reorganize at dump time rather than at load time.
        * dumper.c (pdump_prune_weak_object_chain_prefixes):
        Call pdump_register_object() on *address here in passing, missed
        on previous work of mine to that function.
        * dumper.c (pdump):
        Move pdump_sort_hash_tables_for_reorganize() earlier, which should
        give better locality of reference at loadup that small minority of
        times that pdump_reorganize_hash_tables() is called.
        Set header.rtab_end after calling pdump_allocate_offset_rtables.
        * dumper.c (pdump_load_finish):
        Don't relocate anything if DUMP_IN_EXEC and !HAVE_ASLR. Assert
        that dump_delta, c_code_delta, c_data_delta are all zero.

        * elhash.c: Make hash_table_description static once more.
        * elhash.c (static const struct sized_memory_description
        pdump_hash_tables_for_reorganize_description): New. Needed now
        pdump_hash_tables_for_reorganize is restored in the normal way.
        * elhash.c (vars_of_elhash): Do a dump_add_root_block_ptr() on
        &pdump_hash_tables_for_reorganize.
        * elhash.h:
        Remove the declaration for hash_table_description, no longer
        needed.

2026-05-09  Aidan Kehoe  <kehoea@parhasard.net>

        Move the serialized XD_OPAQUE_DATA_CONVERTIBLE,
        XD_OPAQUE_PTR_CONVERTIBLE objects after the dumped data.
        De-serialize them explicitly in pdump_load_finish(), removing a
        barrier to avoiding relocation of heap objects in a non-PIC
        binary.

        * dumper.c:
        * dumper.c (struct pdump_cv_data_info): Simplify this structure.
        * dumper.c (struct pdump_cv_load_info): New structure, data
        necessary to restore a serialized XD_OPAQUE_DATA_CONVERTIBLE.
        * dumper.c (struct pointer_offset_pair): New structure, used at
        dump time for XD_OPAQUE_PTR_CONVERTIBLE.
        * dumper.c (struct pointer_offset_pair_dynarr): New structure.
        * dumper.c (struct pdump_cv_ptr_info): Revise this structure,
        comment it.
        * dumper.c (struct pdump_cv_load_ptr): New structure, used in
        pdump_load_finish() for XD_OPAQUE_PTR_CONVERTIBLE.
        * dumper.c (struct pdump_cv_info): New structure, for generalized
        handling of XD_OPAQUE_DATA_CONVERTIBLE, XD_OPAQUE_PTR_CONVERTIBLE,
        keyed by the relevant opaque_convert_functions.
        * dumper.c (struct pdump_cv_info_dynarr): New structure, a Dynarr
        of previous.
        * dumper.c (struct pdump_cv_load_info): New structure, used in
        pdump_load_finish() for XD_OPAQUE_DATA_CONVERTIBLE,
        XD_OPAQUE_PTR_CONVERTIBLE.
        * dumper.c (struct pdump_header): Update this to reflect
        XD_OPAQUE_DATA_CONVERTIBLE and XD_OPAQUE_PTR_CONVERTIBLE are
        treated together.
        * dumper.c (pdump_get_cv_info): New function. Return a
        pdump_cv_info reflecting a specific struct
        opaque_convert_functions pointer, creating one if it doesn't
        exist.
        * dumper.c (pdump_get_cv_ptr_info): Renamed from
        pdump_find_in_cv_ptr_dynarr(). Return a pdump_cv_ptr_info pointer
        reflecting OBJECT, creating one if needed.
        * dumper.c (pdump_convert_free_cv_infos): New. Called from
        pdump(), calls the convert_free() method on
        XD_OPAQUE_DATA_CONVERTIBLE and XD_OPAQUE_PTR_CONVERTIBLE objects
        if needed.
        * dumper.c (pdump_register_sub):
        Change handling of XD_OPAQUE_DATA_CONVERTIBLE and
        XD_OPAQUE_PTR_CONVERTIBLE here to fit with changes above.
        * dumper.c (pdump_store_new_pointer_offsets):
        Change handling of XD_OPAQUE_DATA_CONVERTIBLE and
        XD_OPAQUE_PTR_CONVERTIBLE.
        * dumper.c (pdump_reloc_one):
        Remove handling of XD_OPAQUE_DATA_CONVERTIBLE and
        XD_OPAQUE_PTR_CONVERTIBLE from this function.
        * dumper.c (pdump_dump_cv_data): Removed.
        * dumper.c (pdump_dump_cv_ptr): Removed.
        * dumper.c (pdump_allocate_offset_cv_data): Removed.
        * dumper.c (pdump_allocate_offset_cv_ptr): Removed.
        No need for these with the current implementation.
        * dumper.c (pdump_scan_by_alignment):
        No need for the function arguments that deal with
        XD_OPAQUE_DATA_CONVERTIBLE and XD_OPAQUE_PTR_CONVERTIBLE,
        removed.
        * dumper.c (pdump_dump_cv_data_info): Removed.
        * dumper.c (pdump_dump_cv_info): New. Dump metadata and serialized
        XD_OPAQUE_DATA_CONVERTIBLE and XD_OPAQUE_PTR_CONVERTIBLE objects.

        * dumper.c (pdump):
        Create pdump_cv_infos here. Set header.nb_cv_info
        appropriately. Update calls to pdump_scan_by_alignment().
        Call pdump_dump_cv_info() after pdump_dump_rtables().
        Call pdump_convert_free_cv_infos() after we're done with the 
        XD_OPAQUE_DATA_CONVERTIBLE and XD_OPAQUE_PTR_CONVERTIBLE objects.
        * dumper.c (pdump_load_finish):
        Deserialize the XD_OPAQUE_DATA_CONVERTIBLE and
        XD_OPAQUE_PTR_CONVERTIBLE objects explicitly within this.
        * lrecord.h:
        Update documentation of XD_OPAQUE_DATA_CONVERTIBLE here, now we
        want its size as well as its offset.
        * number.c:
        Specify the size of the data field in the memory description for
        bignums.

2026-05-10  Aidan Kehoe  <kehoea@parhasard.net>

        In the unlikely event that both DUMP_IN_EXEC is not defined and
        mmap() is unavailable or failed, force reorganization of hash
        tables at runtime.
        * dumper.c:
        Declare pdump_free(), pdump_file_free() early in this file.
        * dumper.c (pdump_load_finish):
        If we are DUMP_IN_EXEC and pdump_free is pdump_file_free (meaning
        we have used xnew_array() for the dumped data), force
        reorganization of the hash tables by setting
        page_size_reorganize_threshold to MOST_POSITIVE_FIXNUM.
        * elhash.c (pdump_reorganize_hash_tables):
        Check page_size_reorganize_threshold against MOST_POSITIVE_FIXNUM,
        if it use ALIGNOF (max_align_t) to compare against, otherwise use
        qxepagesize().

2026-05-08  Aidan Kehoe  <kehoea@parhasard.net>

        Move the relocation tables to just after the dumped objects,
        making that section of the dumped file that is completely unused
        after dump contiguous, giving better locality of reference for
        GC.

        * dumper.c:
        Update the documentation of the structure of the dump file.
        * dumper.c (pdump):
        Move pdump_dump_rtables() just after
        pdump_sort_hash_tables_for_reorganize().
        * dumper.c (pdump_load_finish):
        Move handling of the relocation table earlier in this function.

2026-05-06  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (sweep_lcrecords): Rename sweep_lcrecords_1() to
        this. No longer take any arguments, just examine all_lcrecords
        explicitly; the USED pointer argument was never actualy used in
        our callers.
        * alloc.c (gc_sweep): Rename gc_sweep_1 to this. Call
        sweep_lcrecords() with its new name.
        * alloc.c (disksave_object_finalization):
        Call garbage_collect() with its new name. Correct documentation
        before call to disksave_object_finalization_1().
        * alloc.c (Fgarbage_collect):
        Call garbage_collect() with its new name.
        * emacs.c (initialize_temacs):
        Ditto.
        * eval.c (Feval):
        Ditto.
        * eval.c (Ffuncall):
        Ditto.
        * gc.c (garbage_collect):
        Define this function with its new name. Call gc_sweep() rather
        than gc_sweep_1().
        * gc.h:
        Declare gc_sweep() with its new name.
        * lisp.h:
        Declare garbage_collect() with its new name.
        * redisplay.c:
        Update a comment.

2026-05-04  Aidan Kehoe  <kehoea@parhasard.net>

        * data.c:
        Declare Qephemeronp here.
        * data.c (Fephemeron_ref):
        Check the type of the supplied EPHEMERON argument, avoid crashes
        with error checking.
        * data.c (syms_of_data):
        Do a DEFYSMBOL() for Qephemeronp.

2026-05-04  Aidan Kehoe  <kehoea@parhasard.net>

        Remove the redundant FREE bit from lrecord_header, just check 
        TYPE against lrecord_type_free instead.
        * alloc.c (alloc_managed_lcrecord_1):
        Remove assertion that LHEADER->FREE is non-zero. Retain check that
        LHEADER->TYPE is equal to lrecord_type_free.
        No longer set LHEADER->FREE to zero when taking an object off the
        free list.
        * alloc.c (free_managed_lcrecord):
        Assert that LHEADER is not already free using !LRECORD_FREE_P
        (lcrecord).
        Update a comment here. No longer set LHEADER->FREE.
        * alloc.c (tick_lcrecord_stats):
        Check for freeness using LRECORD_FREE_P()
        * alloc.c (sweep_lcrecords_1):
        Ditto.
        * alloc.c (disksave_object_finalization_1):
        Ditto.
        * gc.c (GC_CHECK_NOT_FREE):
        Ditto.
        * lisp.h (struct Lisp_String):
        Update a comment here.
        * lrecord.h:
        Remove declaration for lrecord_type_index() from this file, which
        function does not exist.
        * lrecord.h (struct lrecord_header):
        Remove the FREE bit from this structure. Remove the comment
        documenting it. Update the bit width of the UID.
        * lrecord.h (struct lrecord_implementation):
        Correct the documentation of the disksave method. Edit
        documentation of memusage_stats_list.
        * lrecord.h (set_lheader_implementation):
        No longer zero the FREE bit in the header when initializing an
        object.

2026-04-23  Aidan Kehoe  <kehoea@parhasard.net>

        Revert 8943a7bad974 for now, restore support for old-eq and the
        version 19 bytecodes, pending wide diffusion packages built with a
        a recent change to 21.4 ( 0c8c47c51ac6 ) that fixed a bug in the
        byte compiler to not generate version 19 bytecodes.
        * bytecode-ops.h:
        * bytecode-ops.h (OPCODE):
        * bytecode.c (UNUSED):
        * bytecode.h (struct Lisp_Compiled_Function):
        * config.h.in:
        * config.h.in (SUPPORT_CONFOUNDING_FUNCTIONS):
        * data.c:
        * data.c (decode_weak_list_type):
        * fns.c:
        * fns.c (plists_differ):
        * fns.c (internal_old_equal):
        * fns.c (Fold_assoc):
        * fns.c (Fold_assq):
        * fns.c (Fold_rassq):
        * fns.c (Fold_rassoc):
        * fns.c (Special kludge): New.
        * fns.c (syms_of_fns):
        * lisp.h:
        * lread.c:
        * lread.c (ebolify_bytecode_constants):
        * lread.c (load_force_doc_string_unwind):
        * lread.c (Fload_internal):
        * lread.c (read_compiled_function):

2026-04-22  Aidan Kehoe  <kehoea@parhasard.net>

        * elhash.c (disksave_hash_table):
        Resize very small hash tables that do not need to be reorganized
        to be of size 3, disksave_hash_table(), giving less memory usage
        both for tables that will not be resized and tables that will, and
        faster lookups in my testing.
        * elhash.c: (pdump_reorganize_hash_tables):
        Mention this in the documentation for
        pdump_reorganize_hash_tables().

2026-04-22  Aidan Kehoe  <kehoea@parhasard.net>

        Fix a couple of infelicities Makefile.in.in, elhash.c.
        * Makefile.in.in ($(RAW_EXE)):
        Quote DUMP_FILE_NAME correctly when echoing the initial size.
        * elhash.c:
        * elhash.c (pdump_reorganize_at_dump_time):
        No need to do an wrap_pointer_1 (XPNTRVAL(...)) with the new
        htentry keys, can just use them as-is.
        In passing mention that disksave_hash_table() makes many hash
        tables smaller, so increased memory usage is not guaranteed.

2026-04-21  Aidan Kehoe  <kehoea@parhasard.net>

        Avoid noise when putting a breakpoint on xmalloc() at startup.

        * emacs.c (check_compatible_window_system):
        In passing, terminate the supported_window_systems array with NULL
        and check against this when processing it.
        * emacs.c (sort_args):
        Allocate new_argv, options, priority using alloca_array() since we
        know from the pdump code that doing this early is fine.
        * minibuf.c:
        New static variables, reflecting the Lisp strings " *Minibuf-0*"
        and " *Echo Area*".
        * minibuf.c (vars_of_minibuf):
        Initialize them.
        * minibuf.c (init_minibuf):
        Use them, on the model of init_buffer_1().
        Remove a comment regarding fixing up the call "so that gettext()
        gets called at runtime instead of load time"; these are internal
        hidden buffers, inappropiate to localise them at all.

2026-04-20  Aidan Kehoe  <kehoea@parhasard.net>

        GCC with -flto can make access to BACKTRACE_LIST incorrect when
        current_profile_function() is called from sigprof_handler(),
        giving a crash; mark it as a volatile pointer, avoid this. Mark
        IN_PROFILING as volatile also, from an abundance of prudence.
        * backtrace.h:
        Update declaration of backtrace_list.
        * backtrace.h (PUSH_BACKTRACE):
        Cast it to a (struct backtrace *) when accessing it.
        * eval.c:
        Update definition of backtrace_list.
        * eval.c (internal_catch):
        Cast when accessing it.
        * eval.c (unwind_to_catch):
        Ditto.
        * eval.c (condition_case_1):
        Ditto.
        * eval.c (Finteractive_p):
        Ditto.
        * eval.c (Fbacktrace_debug):
        Ditto.
        * eval.c (Fbacktrace):
        Ditto.
        * eval.c (Fbacktrace_frame):
        Ditto.
        * gc.c (gc_mark_root_set):
        Ditto.
        * print.c (debug_short_backtrace):
        Ditto.
        * profile.c:
        Mark in_profiling as volatile.
        * profile.c (current_profile_function):
        Cast when accessing backtrace_list.
        * profile.c (profile_record_unwind):
        Update its declaration to take a volatile pointer, since it is
        usually called on backtrace_list itself.
        * profile.c (Fstart_profiling):
        Cast &in_profiling to (int *) when binding a new value.
        * profile.c (Fstop_profiling):
        Cast when accessing backtrace_list.
        * profile.c (Fget_profiling_info):
        Ditto.
        Cast &in_profiling to (int *) when binding a new value.
        * profile.c (Fset_profiling_info):
        Cast &in_profiling to (int *) when binding a new value.
        * profile.h:
        Update declaration of profile_record_unwind().

2026-04-16  Aidan Kehoe  <kehoea@parhasard.net>

        Simplify glyphs-shared.c significantly.
        * emacs.c (initialize_temacs):
        Remove call to syms_of_glyphs_shared() here.
        * general-slots.h:
        Add slots for :resource-id, :resource-type here, moved from
        syms_of_glyphs_shared().
        * glyphs-shared.c:
        Remove declarations for Q_resource_type, Q_resource_id, now in
        general.c.
        Make hexTable const, initialize it statically. Portability to
        non-ASCII machines is no longer a concern; I have supplied Lisp
        code to construct the static initializer, which is more
        maintainable (easier to extend, less prone to bugs) than the C
        code.
        * glyphs-shared.c (initHexTable): Removed, use a static
        initializer instead.
        * glyphs-shared.c (shared_resource_validate):
        No longer call initHexTable() from here.
        * glyphs-shared.c (syms_of_glyphs_shared): Removed.
        Add a /* glyphs-shared.c ends here */ comment.
        * symsinit.h:
        Remove declaration for syms_of_glyphs_shared().

2026-04-14  Aidan Kehoe  <kehoea@parhasard.net>

        Fix the build after the last change when building with bignum support.

        * dumper.c (pdump_reloc_one):
        Trust pdump_load_finish to have adjusted p->save_offset,
        p->dest_offset when dealing with XD_OPAQUE_PTR_CONVERTIBLE,
        XD_OPAQUE_DATA_CONVERTIBLE. Add a comment with two ####s.
        * dumper.c (pdump_load_finish):
        Call pdump_reloc_lisp_data() on the dest_offset, save_offset fields
        of the pdump_loaded_cv_data array.
        Call pdump_reloc_lisp_data() on the save_offset field of the
        pdump_loaded_cv_ptr array.

2026-04-13  Aidan Kehoe  <kehoea@parhasard.net>

        * dumper.c:
        Revise some comments here.
        * dumper.c (pdump):
        New local variable, initial_offset, set to non-zero if DUMP_IN_EXEC.
        Use it for header.reloc_address, check it for header.stab_offset.
        * elhash.c (pdump_reorganize_at_dump_time):
        No further need to add the integer result of dumped_data_get() to
        the pointer values encountered, now pdump() does that for us.

2026-04-12  Aidan Kehoe  <kehoea@parhasard.net>

        Suppress GCC warnings when building on Cygwin as C.
        In passing, get -unmapped working on Windows, which it never did
        before.

        * bytecode.c (vars_of_bytecode):
        Rename a counter to avoid a shadowed variable warning.
        * compiler.h:
        Use __builtin_unreachable() for RETURN_NOT_REACHED() on GCC as
        well as on clang.
        * console-msw-impl.h (struct mswindows_frame):
        New bit field, initially_unmapped, on the pattern of the X11
        implementation.
        * console-msw-impl.h (FRAME_MSWINDOWS_INITIALLY_UNMAPPED):
        Macro to access it.
        * faces.c (ensure_face_cachel_contains_charset):
        Silence warnings regarding OFF1 possibly being used to access
        Stynarr elements with indexes less than zero, by checking it and
        doing a RETURN_NOT_REACHED (Qunbound). FACE_CACHEL_OFFSET_ENSURE()
        will never return a negative number.
        * faces.c (add_face_cachel):
        GCC warns that the result of WINDOW_FACE_CACHEL cannot be zero
        because it is a pointer. But it can be NULL if
        w->face_cachels->base has yet to be initialized. G++ doesn't warn
        regarding this, clang doesn't warn regarding this, Visual Studio
        doesn't. Work around this with a stupid comparison against
        ((struct face_cachel *) NULL) + !1), which silences the warning
        for me.
        * faces.c (update_face_cachel_data):
        Same problem, same solution as previous.
        * frame-msw.c (mswindows_init_frame_1):
        Initialize FRAME_MSWINDOWS_INITIALLY_UNMAPPED(f), suppress a
        set-but-not-used warning for initially_unmapped.
        * frame-msw.c (mswindows_init_frame_3):
        Check FRAME_MSWINDOWS_INITIALLY_UNMAPPED(), decide on the nCmdShow
        argument to ShowWindow() depending on that.
        Only call SetForegroundWindow() if we are mapping the window.
        * frame-msw.c (mswindows_after_init_frame):
        Move the second ShowWindow() call here. Only do it with the first
        frame on a given console; and only do it if the process that
        started XEmacs supplied a STARTUPINFO structure where the
        specified nCmdShow value differs from that which we want.
        If we are not mapping the window, mark the frame as non-visible.
        * frame.c (Fframe_visible_p):
        Fix a misspelling in the docstring here.
        * glyphs-msw.c (mswindows_init_image_instance_from_eimage):
        BKCOLOR has been set but never used since the initial commit in
        1997; there is no mechanism to use it that I can see, remove it,
        suppress a warning.
        * glyphs-msw.c (init_image_instance_from_xbm_inline):
        Pass BG as the background as seems to have always been the
        intention; suppress a set-but-not-used warning.
        * glyphs.c (add_entry_to_device_ii_format_list):
        * glyphs.c (add_entry_to_image_instantiator_format_list):
        No longer take a SYMBOL argument in these two functions, not
        used.
        * glyphs.c (initialize_image_instantiator_format):
        Call add_entry_to_image_instantiator_format_list(),
        add_entry_to_device_ii_format_list() with their new arguments from
        here.

2026-04-11  Aidan Kehoe  <kehoea@parhasard.net>

        * compiler.h:
        Revise ATTRIBUTE_COLD to work with Visual Studio.

2026-04-11  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.dmp.in: New file, reflecting Larry McVoy's magic numbers
        to avoid compilers putting a constant into BSS, in anticipation of
        using the same approach to dump-in-exec on Windows native as on
        every other platform.
        * Makefile.in.in:
        Revise this to use xemacs.dmp.in.

2026-04-11  Aidan Kehoe  <kehoea@parhasard.net>

        * compiler.h: Detect __attribute__(__cold__) here, and #define
        ATTRIBUTE_COLD to a non-empty string if GCC or clang supports it.
        * alloc.c:
        * dumper.h:
        * elhash.c:
        * elhash.h:
        * emacs.c:
        * lisp.h:
        * lrecord.h:
        * lrecord.h (DUMP_ADD_WEAK_OBJECT_CHAIN):
        * lstream.c:
        * mule-charset.c:
        * symsinit.h:
        Mark the dump time infrastructure (plus staticpro_nodump(),
        define_lisp_object(), called almost exclusively at dump time) with
        ATTRIBUTE_COLD, so the compiler puts them all together in the
        binary and optimizes for size rather than speed.

2026-04-11  Aidan Kehoe  <kehoea@parhasard.net>

        Clean up naming for the initialization functions. Move the code to
        initialize temacs to its own function, refactored out from
        main_1(), in preparation for marking dump-time-only calls as
        __attribute__ (__cold__).

        * alloc.c (init_alloc_very_early): Rename
        common_init_alloc_early() to this. Make it non-static to allow
        emacs.c to call it explicitly.
        * alloc.c (init_alloc_once_early):
        No longer call common_init_alloc_early() from here, trust emacs.c
        to have done that.
        * emacs.c:
        * emacs.c (initialize_temacs): New. Refactor out the dump-time
        initialization of the Lisp environment from main_1(), in
        anticipation of marking it cold.
        No longer call init_provide_once(), call vars_of_fns() early
        enough to make that unnecessary.
        * emacs.c (main_1):
        Call init_alloc_very_early() within the if statement that decides
        on whether to load the dump file to reduce astonishment if new
        code decides to fatal.
        Call init_eval_very_early() (previously reinit_vars_of_eval()),
        init_search_very_early() (previously reinit_vars_of_search()) at
        the same place, since they are now very simple and this is a
        convenient place to do that.
        * eval.c:
        * eval.c (int specpdl_size): Initialize this at toplevel in C
        rather that in init_eval_very_early() for simplicity.
        * eval.c (Fixnum max_specpdl_size): Ditto.
        * eval.c (Fixnum max_lisp_eval_depth): Ditto.
        * eval.c (init_eval_very_early): New name for
        reinit_vars_of_eval(), simplify it to do only the things it has to
        do.
        * fileio.c (init_fileio):
        New name for reinit_vars_of_fileio(), fits better with other
        terminology.
        * fns.c (vars_of_fns):
        Move body of init_provide_once into this function.
        * fns.c (init_provide_once): Removed, subsumed by vars_of_fns().
        * gc.h:
        Move declarations for syms_of_gc(), vars_of_gc(),
        complex_vars_of_gc() from here to symsinit.h.
        * minibuf.c:
        * minibuf.c (init_minibuf): Rename
        reinit_complex_vars_of_minibuf() to this.
        * search.c (init_search_very_early): Rename
        reinit_vars_of_search() to this.
        * symsinit.h:
        Use new names for init_alloc_very_early(), init_eval_very_early(),
        init_search_very_early() here. Re-order them appropriately.
        Move declaration for init_number() up with the _very_early()
        functions.
        Move declarations for syms_of_gc(), syms_of_tls(), vars_of_gc(),
        vars_of_tls(), comlex_var_of_gc() here.
        Add declarations for init_fileio(), init_minibuf(), init_tls().
        Remove mention, declarations of the reinit_vars_of_*()
        functions. Remove declarations for
        {vars_of,syms_of}_{postgresql,canna_api,eldap} now they are
        exclusively implemented as modules.
        * tls.h:
        Move declarations for syms_of_tls(), vars_of_tls(), init_tls() to
        symsinit.h.

2026-04-08  Aidan Kehoe  <kehoea@parhasard.net>

        Dump the regexp_cache structures, avoid need to initialize them
        explicitly at startup.

        * lrecord.h:
        New XD_BYTECOUNT_REST, implemented as XD_ELEMCOUNT.
        New XD_POINTER_RESET_TO_NULL(), also implemented as XD_ELEMCOUNT.

        * regex.c (INIT_BUF_SIZE): Increase this to 100 to match what
        search.c did.

        * search.c:
        * search.c (struct regexp_cache):
        Remove FASTMAP from this structure, use a dumped 256 char array
        reachable via buf.fastmap.
        Update the type of POSIX to Boolint.

        * search.c (const struct sized_memory_description
        regexp_cache_description): New. Description for
        struct_regexp_cache.
        * search.c (static const struct memory_description
        regexp_cache_description_1[]): New. Description for the fields of
        struct regexp_cache.
        Use XD_POINTER_RESET_TO_NULL(), XD_BYTECOUNT_RESET,
        XD_ELEMCOUNT_RESET within it for those fields that regex.c will
        initialize if they are NULL or if a Bytecount or Elemcount are
        zero.

        * search.c (compile_pattern):
        Take POSIX as a Boolint.
        * search.c (reinit_vars_of_search):
        Remove initialization of searchbufs, searchbuf_head from this.
        * search.c (vars_of_search):
        Initialize searchbuf_head using xnew_and_zero() and the other
        elements in the linked list in the same way. Do a
        staticpro_dump_nil() on both REGEXP and BUF.TRANSLATE with struct
        regexp_cache, motivate this.
        Dump the linked list using a dump_add_root_block_ptr on
        &searchbuf_head.
        Leave lazy initialization of BUF.BUFFER to regex.c, as was already
        the case for BUF.EXTERNAL_TO_INTERNAL_REGISTER.

2026-04-08  Aidan Kehoe  <kehoea@parhasard.net>

        Rename XD_INT_RESET to XD_ELEMCOUNT_RESET, treat it as an
        EMACS_INT within the dumper. Previously it was treated as an int
        which worked OK on little-endian architectures for the extant uses
        but cannot work on a big-endian architecture, not that there are
        many of them left.

        * array.h:
        * array.h (XD_DYNARR_DESC):
        Use XD_ELEMCOUNT_RESET here.
        * dumper.c (pdump_register_sub):
        Ditto.
        * dumper.c (pdump_store_new_pointer_offsets):
        Declare VAL as Elemcount. Cast RDATA to an Elemcount pointer
        before writing to it.
        * dumper.c (pdump_reloc_one):
        Use XD_ELEMCOUNT_RESET here.
        * gc.c (lispdesc_one_description_line_size):
        Move XD_ELEMCOUNT_RESET beside XD_ELEMCOUNT, return sizeof
        (Elemcount) for both.
        * gc.c (kkcc_marking):
        Use XD_ELEMCOUNT_RESET here.
        * lrecord.h:
        Document XD_ELEMCOUNT_RESET. Give some context for its use.
        * lrecord.h (enum memory_description_type):
        Update its entry here. Put it just after XD_ELEMCOUNT.

2026-04-05  Aidan Kehoe  <kehoea@parhasard.net>

        * search.c (Fregexp_quote):
        Synch this with current GNU; no longer quote ], return the
        original string if nothing needs quoting.
        Update the docstring to advise of the latter.

2026-03-30  Aidan Kehoe  <kehoea@parhasard.net>

        Call a new #'wrong-subtype-argument when supplied consoles,
        specifiers, coding systems, etc, of the wrong subtype and
        signalling a continuable error.
        Call a new dead_wrong_subtype_argument() that supplies the same
        error message when signalling a non-continuable error.
        Remove the PREDICATE_SYMBOL slots from the various object method
        structures, no longer needed.

        * console-impl.h:
        * console-impl.h (struct console_methods):
        Remove the PREDICATE_SYMBOL slot from here.
        * console-impl.h (CHECK_CONSOLE_TYPE):
        Call dead_wrong_subtype_argument() here.
        * console.c:
        Remove the PREDICATE_SYMBOL slot from console_methods_description_1.
        * console.c (initialize_console_type):
        No need to initialize PREDICATE_SYMBOL.
        * data.c:
        Declare Qwrong_subtype_argument here.
        * data.c (dead_wrong_subtype_argument): New.
        Signal a non-continuable error with a cl-macs.el-friendly
        PREDICATE cons.
        * data.c (syms_of_data):
        Call DEFSYMBOL() on Qwrong_subtype_argument.
        * device-impl.h (CHECK_DEVICE_TYPE):
        Call dead_wrong_subtype_argument here().
        * device-impl.h (CONCHECK_DEVICE_TYPE):
        Call #'wrong-subtype-argument here.
        * file-coding.c:
        Remove the PREDICATE_SYMBOL slot from
        coding_system_methods_description_1.
        * file-coding.c (initialize_coding_system_type):
        No need to initialize PREDICATE_SYMBOL.
        * file-coding.h (struct coding_system_methods):
        Remove the PREDICATE_SYMBOL slot from this.
        * file-coding.h (CHECK_CODING_SYSTEM_OF_TYPE):
        Call dead_wrong_subtype_argument() here.
        * file-coding.h (CHECK_CODING_SYSTEM_OF_TYPE):
        Call #'wrong-subtype-argument here.
        * frame-impl.h (CHECK_FRAME_TYPE):
        Call dead_wrong_subtype_argument() here.
        * frame-impl.h (CONCHECK_FRAME_TYPE):
        Call #'wrong-subtype-argument here.
        * general-slots.h:
        Create Qsatisfies here, needed for dead_wrong_subtype_argument().
        * lisp.h:
        Declare dead_wrong_subtype_argument(), Qwrong_subtype_argument.
        * specifier.c:
        Remove the PREDICATE_SYMBOL slot from specifier_methods_description_1.
        * specifier.c (display_table_validate):
        Call dead_wrong_subtype_argument() here rather than using
        display_table_specifier_methods->predicate_symbol.
        * specifier.c (initialize_specifier_type):
        No need to initialize the PREDICATE_SYMBOL field.
        * specifier.h (struct specifier_methods):
        Remove the PREDICATE_SYMBOL field.
        * specifier.h (CHECK_SPECIFIER_TYPE):
        Call dead_wrong_subtype_argument() here.
        * specifier.h (CONCHECK_SPECIFIER_TYPE):
        Call #'wrong-subtype-argument here.

2026-03-23  Aidan Kehoe  <kehoea@parhasard.net>

        * console.c (nuke_all_console_slots):
        Set CON->CONMETHS to dead_console_methods in this function, remove
        the need to do so in our callers.
        * console.c (delete_console_internal):
        Trust nuke_all_console_slots() to set the conmeths slot
        appropriately.
        * console.c (complex_vars_of_console):
        Ditto.

2026-03-22  Aidan Kehoe  <kehoea@parhasard.net>

        * dumper.c (pdump_dump_data):
        If dumping a hash table's HTENTRY field, offer elhash.c the
        opportunity to reorganize the table at dump time.
        * elhash.c:
        * elhash.c (Bytecount page_size_reorganize_threshold): New.
        Used to determine at startup if the current page size is smaller
        than the dump-time page size, or if the hash tables have to be
        unconditionally reorganized (e.g. if they were larger than the
        dump time page size).
        * elhash.c (compute_hash_table_derived_values):
        Set the golden ratio to 1 if the hash table size is a power of
        two, to avoid (if possible) reorganization after pdump_load().
        * elhash.c (disksave_hash_table):
        With #'eq, #'eql hash tables, if they are smaller than the page
        size, resize them to a power of two, and make
        pdump_reorganize_at_dump_time() aware of them.
        Don't do this on WIN32_NATIVE currently.
        * elhash.c (pdump_reorganize_at_dump_time): New.
        Given the htentries of an existing hash table, and a new_htentries
        with the Lisp_Objects adjusted to reflect offsets within the dump
        file, reorganize new_htentries so there is no need to do this
        after pdump_load().
        * elhash.c (pdump_reorganize_hash_tables):
        Update a comment here.
        Don't reorganize hash tables already reorganized at dump time.
        Delay xnew_array () since that may never be needed.
        * elhash.c (vars_of_elhash):
        Call dump_add_opaque_fixnum on &page_size_reorganize_threshold.
        * elhash.h:
        Declare htentry_description_1, pdump_reorganize_at_dump_time(),
        page_size_reorganize_threshold.
        * emacs.c (main_1):
        Check page_size_reorganize_threshold against the run-time page
        size before calling pdump_reorganize_hash_tables().

2026-03-20  Aidan Kehoe  <kehoea@parhasard.net>

        * getpagesize.h:
        Declare qxegetpagesize().
        * sysdep.c (qxegetpagesize): New.
        Encapsulate getpagesize() for POSIX and Windows.
        Prefer sysconf (_SC_PAGESIZE) to the actual getpagesize() call on
        POSIX.
        If this is not available, use the macro definitions provided by
        getpagesize.h.
        If there is nothing provided by getpagesize.h, just give a compile
        time error; this is very unlikely these days, getpagesize() was
        dropped from POSIX in 2001.
        * sysdep.h:
        Declare it.

2026-03-19  Aidan Kehoe  <kehoea@parhasard.net>

        Remove Vchain_canonicalize_hash_table, set but never used since
        2001.

        * file-coding.c:
        Remove its declaration.
        * file-coding.c (chain_canonicalize):
        Remove this coding system method, which returned its argument with
        the side effect of adding a never-used entry to
        Vchain_canonicalize_hash_table.
        * file-coding.c (chain_canonicalize_after_coding):
        Remove #if 0 code that examined Vchain_canonicalize_hash-table.
        * file-coding.c (coding_system_type_create):
        Remove canonicalize method initialization for chain coding systems.
        * file-coding.c (vars_of_file_coding):
        Remove initialization, staticpro() for
        Vchain_canonicalize_hash_table.

2026-03-19  Aidan Kehoe  <kehoea@parhasard.net>

        * buffer.c (Fkill_all_local_variables):
        * callint.c (Finteractive):
        * chartab.c (Fput_char_table):
        * chartab.c (Fremove_char_table):
        * data.c (Fchar_to_int):
        * fns.c:
        * fns.c (Fstring_lessp):
        * fontcolor.c (Ffont_instance_charset):
        * lread.c (Fload_internal):
        * mule-charset.c (Fcharset_encodable_p):
        * mule-charset.c (Fcharset_id):
        * select.c (Fget_selection_internal):
        * text.c (Fchar_to_unicode):
        * text.c (Funicode_to_char):
        Remove mention of non-Mule from these docstrings. Correct "old
        Mule-internal" to "old-Mule internal" in the docstring for
        Funicode_to_char().

        * emacs.c (main_1):
        Update and correct a comment for init_intl_win32(). Call it after
        init_unicode(), not that this matters.  

        * intl-win32.c (init_intl_win32):
        * intl-win32.c (vars_of_intl_win32):
        In passing, provide the cygwin-use-utf-8 feature in
        vars_of_intl_32 rather than init_intl_win32 as is more usual
        XEmacs practice.

2026-03-18  Aidan Kehoe  <kehoea@parhasard.net>

        * elhash.c (Elemcount pdump_hash_table_reorganize_count):
        Initialize this as intended to -1, fix the build. Thank you Mats
        Lidell and the buildbot.

2026-03-17  Aidan Kehoe  <kehoea@parhasard.net>

        1. No need to reorganize obarray (and other hash tables that do
        not depend on pointer values) after pdump_load(), avoid that.
        2. Examine all the hash tables that need reorganization at once,
        avoid a frenzy of xmalloc() and xfree() at startup.

        * dumper.c:
        * dumper.c (struct): Remove pdump_static_Lisp_Object as a struct
        declaration in passing, no longer used.
        * dumper.c (compare_hash_table_block_list_elt): New.
        Passed to qsort() to order the hash tables to put those to be
        reorganized first.
        * dumper.c (pdump_sort_hash_tables_for_reorganize): New.
        Examine the pdump_object_table entry for hash tables and sort it
        to put the largest one that needs reorganization first, then the
        next largest, and so on, with those that do not need
        reorganization at the end.
        Set pdump_hash_table_reorganize_count to the count of hash tables
        that need reorganization.
        * dumper.c (pdump_dump_root_block_ptrs):
        Fix some errant whitespace.
        * dumper.c (pdump_dump_root_blocks): Ditto.
        * dumper.c (pdump):
        Call pdump_sort_hash_tables_for_reorganize() before dumping any
        data.
        * dumper.c (pdump_load_finish):
        Set pdump_hash_tables_for_reorganize to point to the beginning of
        the hash table entries in the relocation table (which are all
        together).
        Delay reorganizing the hash tables until we can run Lisp, now
        called from emacs.c
        * elhash.c (Lisp_Object Vpdump_hash_table_reorganize_keys):
        Hash table used only at dump time, giving sort keys for the
        reachable hash tables, used by
        pdump_sort_hash_tables_for_reorganize().
        * elhash.c (Elemcount pdump_hash_table_reorganize_count): New.
        Count of hash tables that need reorganization.
        * elhash.c (struct Hash_Table_Test):
        Add new REORGANIZE_NEEDED_P, LISP_REORGANIZE_NEEDED_P members to
        this object. Re-order it to keep the similarly-functioning fields
        together. 
        * elhash.c (built_in_reorganize_needed_p): New.
        Used to implement REORGANIZE_NEEDED_P for the built-in hash
        tables.
        * elhash.c (fixnum_or_char_p):
        Passed to built_in_reorganize_needed_p() for #'eq hash tables.
        * elhash.c (eq_reorganize_needed_p):
        Method for the relevant hash table test.
        * elhash.c (char_or_number_p):
        Passed to built_in_reorganize_needed_p() for #'eql hash tables.
        * elhash.c (eql_reorganize_needed_p):
        Method for the relevant hash table test.
        * elhash.c (fixnum_char_or_string_p):
        Passed to built_in_reorganize_needed_p() for #'equal hash tables.
        * elhash.c (equal_reorganize_needed_p):
        Method for the relevant hash table test.
        * elhash.c (number_char_or_string_p):
        Passed to built_in_reorganize_needed_p() for #'equal hash tables.
        * elhash.c (equalp_reorganize_needed_p):
        Method for the relevant hash table test.
        * elhash.c (general_hash_table_reorganize_needed_p):
        Method for hash table tests where REORGANIZE-NEEDED-P is in Lisp.
        * elhash.c (disksave_hash_table):
        New object method for hash table, decide if a hash table will need
        to be reorganized after pdump_load(), which is the case if its
        count is non-zero and its test's reorganize_needed_p method
        returns non-zero.
        Seed Vpdump_hash_table_reorganize_keys according to this.
        * elhash.c (pdump_reorganize_hash_tables):
        Change of API from the previous pdump_reorganize_hash_table(),
        deal with all the hash tables in a loop so no need for repeated
        xnew(). Examine pdump_hash_tables_for_reorganize,
        pdump_hash_table_reorganize_count to determine which hash tables
        need to be examined.
        * elhash.c (make_hash_table_test):
        Change the calling convention of this to take the new
        reorganize_needed_p, lisp_reorganize_needed_p arguments, reorder
        the other arguments to keep the functionally similar fields
        together.
        * elhash.c (define_hash_table_test):
        Same changes to this.
        * elhash.c (Fdefine_hash_table_test):
        Same changes to this. Document REORGANIZE-NEEDED-P as an
        argument.
        * elhash.c (syms_of_elhash):
        Update calls to define_hash_table_test().
        * elhash.c (vars_of_elhash):
        Adjust the lisp_reorganize_needed_p field Vequal_hash_table_test
        here, as well as the other fields.
        Update call to define_hash_table_test() for #'eq, #'eql, #'equalp
        Initialize Vpdump_hash_table_reorganize_keys, mark it
        staticpro_nodump().
        Call dump_add_opaque_fixnum on
        &pdump_hash_table_reorganize_count.
        * elhash.c (init_elhash_once_early):
        Document that hash tables have a disksave method.
        Update make_hash_table_test() call for Vequal_hash_table_test
        appropriately.
        * elhash.h:
        Provide hash_table_reorganize_needed_t as a typedef.
        Declare Vpdump_hash_table_reorganize_keys,
        pdump_hash_table_reorganize_count,
        pdump_hash_tables_for_reorganize.
        Update declaration for declare_hash_table_test.
        * emacs.c (main_1):
        Call pdump_reorganize_hash_tables() once we can run Lisp if needed.
        * gccache-x.c (define_gc_cache_hash_table_test):
        Update call to define_hash_table_test() here.
        * glyphs.c (vars_of_glyphs):
        Ditto.

2026-03-16  Aidan Kehoe  <kehoea@parhasard.net>

        General improvements to the console, specifier, image_instantiator,
        coding_system_type implementations.

        1. No need for the OBJ_NAME, PRED_SYM arguments to
        INITIALIZE_CONSOLE_TYPE(), they can be worked out from the TYPE
        argument.
        Similarly, no need for the same named arguments to
        INITIALIZE_SPECIFIER_TYPE(), they can be worked out from the TYPE
        argument.
        Similarly, no need for the PRED_SYM argument to
        INITIALIZE_CODING_SYSTEM_TYPE().

        2. New functions initialize_console_type(),
        initialize_coding_system_type(),
        initialize_image_instantiator_format(),
        initialize_specifier_type(), de-inlining the bulk of
        INITIALIZE_CONSOLE_TYPE(), INITIALIZE_CODING_SYSTEM_TYPE(),
        INITIALIZE_IMAGE_INSTANTIATOR_FORMAT(),
        INITIALIZE_SPECIFIER_TYPE(); these are called sufficiently rarely
        (and only at dump time) making them de-inlined is very reasonable.

        3. Rename and change type for the_console_type_entry_dynarr 
        the_coding_system_type_entry_dynarr, the_specifier_type_entry_dynarr
        to the_console_methods_dynarr, the_coding_system_methods_dynarr,
        the_specifier_methods_dynarr, respectively, removing duplication
        of the symbols within the various method structures.

        4. The SYMBOL field of struct image_instantiator_format_entry
        duplicates the SYMBOL field of it METHS field. Remove it, just
        use the SYMBOL field of the METHS field.
        
        5. For the_console_methods_dynarr, the_coding_system_methods_dynarr,
        the_image_instantiator_format_entry_dynarr,
        the_specifier_methods_dynarr, declare the relevant struct pointer
        entries as const, so when they are accessed for instantiating
        consoles, coding_system, image_instantiators, and specifiers a)
        we're happy nothing is modifying them unintentionally, that needs
        to be done through the individual pointers (e.g. with
        CODING_SYSTEM_HAS_METHOD() and friends) and b) things are a
        fraction of a percent faster for the compiler.

        6. Remove Vconsole_type_list, Vimage_instantiator_format_list,
        Vspecifier_type_list, they just duplicate information already in
        the dynarrs. Implement #'console-type-list,
        #'image-instantiator-format-list, #'specifier-type-list using the
        dynarrs.

        * console-gtk.c (console_type_create_gtk):
        Update call to INITIALIZE_CONSOLE_TYPE() here.
        * console-impl.h:
        cted_description is gone, declare cmpd_description here,
        reflecting a console methods pointer dynarr.
        * console-impl.h (struct console_methods):
        Unify NAME and SYMBOL, rename SYMBOL to NAME.
        * console-impl.h (CONMETH_NAME): New. Renamed from
        CONMETH_TYPE().
        * console-impl.h (CONSOLE_TYPE):
        Update this to use CONMETH_NAME().
        * console-impl.h (MAYBE_CONTYPE_METH):
        Declare METH as const.
        No need for struct console_type_entry, which duplicates struct
        console_methods.name
        * console-impl.h (INITIALIZE_CONSOLE_TYPE):
        Redefine this in terms of initialize_console_type().
        * console-impl.h (struct console_methods):
        Unify NAME and SYMBOL here.
        Rename CONMETH_TYPE() to CONMETH_NAME(). Update CONSOLE_TYPE() to
        reflect this.
        Update MAYBE_CONMETH_METH() to reflect that METH is const.
        Remove console_type_entry as a struct, typedef no longer needed. 
        * console-msw.c (console_type_create_mswindows):
        Update call to INITIALIZE_CONSOLE_TYPE() here.
        * console-stream.c (console_type_create_stream):
        Ditto.
        * console-tty.c (console_type_create_tty):
        Ditto.
        * console-x.c (console_type_create_x):
        Ditto.
        * console.c:
        Declare the_console_methods_dynarr with its new name, type. Remove
        definition 
        * console.c (print_console):
        Print the console type as a Lisp symbol. This works even with dead
        consoles, no need to make an exception.
        * console.c (decode_console_type):
        Change this to return a const struct console_methods *, since it
        should not (normally) be modifiable.
        * console.c (valid_console_type_p):
        Use a more modern type for this.
        * console.c (Fconsole_type_list):
        Implement this in terms of the_console_methods_dynarr.
        * console.c (console_live_p):
        Use a more modern type for this. Take its argument as a const.
        * console.c (console_device_list):
        Take its struct console * argument as a const.
        * console.c (semi_canonicalize_console_connection):
        Take the METHS argument as const.
        * console.c (canonicalize_console_connection):
        Ditto.
        * console.c (find_console_of_type):
        Ditto.
        * console.c (Ffind_console):
        Use CONMETH_NAME(), the new name for CONMETH_TYPE() here.
        Declare the result of a call to decode_console_type() as const.
        * console.c (static const struct sized_memory_description
        cte_description): Removed, no longer needed.
        * console.c (static const struct sized_memory_description
        console_methods_pointer_description): New.
        * console.c (const struct sized_memory_description
        cted_description): Removed, no longer needed.
        * console.c (const struct sized_memory_description
        cmpd_description): New, needed for the_console_methods_dynarr.
        * console.c (add_entry_to_console_type_list): Removed,
        functionality moved into initialize_console_type().
        * console.c (initialize_console_type): New function, creates a
        struct console methods based on a symbol name supplied and the
        address of a destination pointer, does the appropriate staticpro(),
        addition of the entry to the_console_methods_dynarr,
        dump_add_root_block_ptr().
        * console.c (console_type_create):
        Use the new name for the_console_methods_dynarr.
        Remove mention of Vconsole_type_list. Update call to
        INITIALIZE_CONSOLE_TYPE.
        * console.h:
        Supply a typedef for const_console_methods_pointer_dynarr
        here. Update declarations for console_live_p(),
        valid_console_type_p(), console_device_list(),
        decode_console_type(). Remove declaration for
        add_entry_to_console_type_list().
        Declare Fconsole_type_list(), now needed in specifier.c
        Update 
        * device-impl.h (DEVICE_TYPE_NAME):
        Remove this, no longer used.
        * device-impl.h (DEVICE_TYPE):
        Implement this in terms of CONMETH_NAME().
        * device-impl.h (struct device):
        Make DEVMETHS a const struct console_methods pointer.
        * device.c (print_device):
        Print the device type as a Lisp symbol. This works even with dead
        consoles, no need to make an exception.
        * device.c (valid_device_class_p):
        * device.c (device_live_p):
        Modernize type of these.
        * device.c (semi_canonicalize_device_connection):
        Take METHS as a pointer to const argument.
        * device.c (canonicalize_device_connection):
        Ditto.
        * device.c (find_device_of_type):
        Ditto.
        * device.c (Ffind_device):
        Call CONMETH_NAME() on METHS, the new name for CONMETH_TYPE().
        * device.c (Fmake_device):
        Declare CONMETHS as a pointer to const.
        Iterate through the_console_methods_dynarr.
        * device.c (window_system_pixelated_geometry):
        Modernize return type of this.
        Declare the console methods as const.
        * device.c (handle_asynch_device_change):
        Iterate through the_console_methods_dynarr.
        * device.h:
        Update declarations for device_live_p(), valid_device_class_p(),
        window_system_pixelated_geometry().
        * file-coding.c:
        * file-coding.c (struct coding_system_type_entry): Removed, no
        need for this.
        * file-coding.c (static const struct sized_memory_description
        cste_description): Removed, not needed.
        * file-coding.c (static const struct sized_memory_description
        ccsmp_description): New. Description of a pointer to a const struct
        coding_system_methods.
        * file-coding.c (static const struct sized_memory_description
        csted_description): Removed, not needed.
        * file-coding.c (static const struct sized_memory_description
        ccsmpd_description): New. Description of a dynarr of pointers to
        const struct coding_system_methods.
        * file-coding.c (Vcoding_system_type_list): Removed, no longer
        needed.
        * file-coding.c (print_coding_system_properties):
        Use the new field for the symbol name of the
        coding_system_methods.
        * file-coding.c (decode_coding_system_type):
        Return a const pointer to the struct coding_system_methods here.
        * file-coding.c (valid_coding_system_type_p):
        Modernize return value for this.
        * file-coding.c (Fcoding_system_type_list):
        Iterate over the_coding_system_methods_dynarr in this function.
        * file-coding.c (coding_system_is_binary):
        Modernize the return type here.
        * file-coding.c (coding_system_is_for_text_file):
        Ditto.
        * file-coding.c (decoding_source_sink_type_is_char):
        Ditto.
        * file-coding.c (allocate_coding_system):
        Take CODESYS_METHS as a pointer to a constant structure.
        * file-coding.c (make_coding_system_1):
        Declare METHS as a pointer to a constant structure.
        * file-coding.c (handle_possible_error_octet):
        Modernize the return type of this.
        * file-coding.c (initialize_coding_system_type):
        New function, de-inline the bulk of INITIALIZE_CODING_SYSTEM_TYPE(),
        INITILAIZE_CODING_SYSTEM_TYPE_WITH_DATA().
        * file-coding.c (coding_system_type_create):
        Initialize the_coding_system_methods_dynarr appropriately.
        Remove mention of Vcoding_system_type_list.
        Update calls to INITIALIZE_CODING_SYSTEM_TYPE{,_WITH_DATA}.
        * file-coding.h:
        * file-coding.h (struct Lisp_Coding_System):
        Declare METHODS as const.
        * file-coding.h (struct coding_system_methods):
        Rename the TYPE field to NAME.
        * file-coding.h (INITIALIZE_CODING_SYSTEM_TYPE):
        * file-coding.h (INITIALIZE_CODING_SYSTEM_TYPE_WITH_DATA):
        Update this to call initialize_coding_system_type().
        * file-coding.h (CODING_SYSTEM_TYPE):
        Update this to reflect the new name field within struct
        coding_system_methods.
        Remove declaration for add_entry_to_coding_system_type_list, no
        longer needed.
        Update declaration for hande_possible_error_octet().
        * fontcolor.c (specifier_type_create_fontcolor):
        Update calls to INITIALIZE_SPECIFIER_TYPE{,_WITH_DATA} in this
        file.
        * frame-impl.h (FRAME_TYPE):
        Update the implementation of this macro.
        * frame-impl.h (struct frame):
        Declare FRAMEMETHS as const.
        * frame.c (print_frame):
        Print the frame type using write_fmt_string_lisp, since it is a
        Lisp symbol.
        * glyphs-eimage.c
        (image_instantiator_format_create_glyphs_eimage):
        * glyphs-gtk.c (image_instantiator_format_create_glyphs_gtk):
        * glyphs-msw.c (image_instantiator_format_create_glyphs_mswindows):
        Update calls to INITIALIZE_IMAGE_INSTANTIATOR_FORMAT()) in all
        these functions.
        * glyphs-widget.c (widget_property):
        Declare METHS as const.
        * glyphs-widget.c (widget_update):
        Ditto.
        * glyphs-widget.c (redisplay_widget):
        Ditto.
        * glyphs-widget.c (widget_query_geometry):
        Ditto.
        * glyphs-widget.c (widget_layout):
        Ditto.
        * glyphs-widget.c (image_instantiator_widget):
        * glyphs-widget.c (image_instantiator_buttons):
        * glyphs-widget.c (image_instantiator_edit_fields):
        * glyphs-widget.c (image_instantiator_combo_box):
        * glyphs-widget.c (image_instantiator_scrollbar):
        * glyphs-widget.c (image_instantiator_progress_gauge):
        * glyphs-widget.c (image_instantiator_tree_view):
        * glyphs-widget.c (image_instantiator_tab_control):
        * glyphs-widget.c (image_instantiator_labels):
        * glyphs-widget.c (image_instantiator_layout):
        * glyphs-widget.c (image_instantiator_native_layout):
        Update calls to INITIALIZE_IMAGE_INSTANTIATOR_FORMAT() in all
        these functions. Correct indentation.   
        * glyphs-x.c (image_instantiator_format_create_glyphs_x):
        Update calls to INITIALIZE_IMAGE_INSTANTIATOR_FORMAT().
        * glyphs.c:
        Remove definition for Vimage_instantiator_format_list.
        * glyphs.c (struct image_instantiator_format_entry):
        Update this structure, remove the SYMBOL filed, make METHS const.
        * glyphs.c (decode_device_ii_format):
        Return a pointer to a const struct image_instantiator_methods.
        Revise to reflect updated struct image_instantiator_format_entry.
        * glyphs.c (decode_image_instantiator_format):
        Return a pointer to a const struct image_instantiator_methods.
        * glyphs.c (valid_image_instantiator_format_p):
        Modernize the return type of this.
        Revise to reflect updated struct image_instantiator_format_entry.
        * glyphs.c (Fimage_instantiator_format_list):
        Iterate over the_image_instantiator_format_entry_dynarr here.
        * glyphs.c (add_entry_to_device_ii_format_list):
        Make this static, no longer called outside this file.
        Revise to reflect updated struct image_instantiator_format_entry.
        * glyphs.c (get_image_conversion_list):
        Have this return a pointer to a const Lisp_Object, since
        decode_console_type() now returns a pointer to a const.
        * glyphs.c (Fset_console_type_image_conversion_list):
        Cast the result of get_image_conversion_list to a writeable pointer.
        * glyphs.c (process_image_string_instantiator):
        Fix some indentation.
        * glyphs.c (get_image_instantiator_governing_domain):
        Declare METHS as const.
        * glyphs.c (normalize_image_instantiator):
        Ditto.
        * glyphs.c (instantiate_image_instantiator):
        Ditto.
        * glyphs.c (print_image_instance):
        Print the device type as a Lisp symbol.
        * glyphs.c (Fimage_instance_property):
        Declare METHS as const.
        * glyphs.c (image_instance_query_geometry): Ditto.
        * glyphs.c (image_instance_layout): Ditto.
        * glyphs.c (update_image_instance): Ditto.
        * glyphs.c (potential_pixmap_file_instantiator): Ditto.
        * glyphs.c (image_validate): Ditto.
        * glyphs.c (image_going_to_add):
        Revise this to iterate over the_console_methods_dynarr rather than
        Vconsole_type_list, now gone.
        * glyphs.c (image_copy_vector_instantiator):
        Declare METHS as const.
        * glyphs.c (specifier_type_create_image):
        Revise call to INITIALIZE_SPECIFIER_TYPE_WITH_DATA() 
        * glyphs.c (static const struct sized_memory_description
        iife_description): Removed. No longer needed.
        * glyphs.c (static const struct sized_memory_description
        iifed_description): Re-order declaration now there is no extern
        declaration for iim_description.
        * glyphs.c (static const struct sized_memory_description
        iim_description): Make this static, no longer used outside of this
        file.
        * glyphs.c (initialize_image_instantiator_format): New. De-inline
        INITIALIZE_IMAGE_INSTANTIATOR_FORMAT.
        * glyphs.c (image_instantiator_format_create):
        Remove Vimage_instantiator_format_list.
        Revise calls to INITIALIZE_IMAGE_INSTANTIATOR_FORMAT()
        * glyphs.h:
        Remove extern delcaration for iim_description, no longer needed.
        * glyphs.h (struct image_instantiator_methods):
        Update CONSOLES to be of type const_console_methods_pointer_dynarr.
        * glyphs.h (MAYBE_IIFORMAT_METH):
        Update declaration of MIM_mstruc to be const.
        * glyphs.h (MAYBE_IIFORMAT_DEVMETH):
        Ditto.
        * glyphs.h (INITIALIZE_IMAGE_INSTANTIATOR_FORMAT_NO_SYM):
        Implement this in terms of
        initialize_image_instantiator_format(). Declare that function.
        * glyphs.h (INITIALIZE_IMAGE_INSTANTIATOR_FORMAT):
        Ditto. Use DEFSYMBOL() rather than reimplementing it.
        * glyphs.h (IIFORMAT_VALID_CONSOLE):
        Simplify this.
        * glyphs.h (INITIALIZE_DEVICE_IIFORMAT):
        Implement this in terms of initialize_image_instantiator_format().
        * gutter.c (specifier_type_create_gutter):
        Revise calls to INITIALIZE_SPECIFIER_TYPE() here.
        * intl-win32.c (coding_system_type_create_intl_win32):
        Revise calls to INITIALIZE_CODING_SYSTEM_TYPE_WITH_DATA() here.
        * lisp.h:
        Remove forward declaration for struct console_type_entry and for
        console_type_entry_dynarr, no longer needed
        Modernize another couple of declarations.
        * mule-coding.c (coding_system_type_create_mule_coding):
        Revise calls to INITIALIZE_CODING_SYSTEM_TYPE_WITH_DATA() here. 
        * specifier.c:
        * specifier.c (struct):
        Remove struct specifier_type_entry, no longer needed.
        New Dynarr, specifier_methods_pointer_dynarr.
        Declare the_specifier_methods as this.
        * specifier.c (static const struct sized_memory_description
        ste_description): Removed. No longer needed.
        * specifier.c (static const struct sized_memory_description
        specifier_methods_pointer_description): New.
        * specifier.c (static const struct sized_memory_description
        sted_description): Removed. No longer needed.
        * specifier.c (static const struct sized_memory_description
        specifier_methods_pointer_dynarr_description): New, used for
        the_specifier_methods.
        * specifier.c (print_specifier):
        Print sp->methods->name as the Lisp symbol it is.
        * specifier.c (decode_specifier_type):
        Return a const struct specifier_methods * here.
        * specifier.c (valid_specifier_type_p):
        Modernize return type.
        * specifier.c (Fspecifier_type_list):
        Iterate over the_specifier_methods_dynarr here.
        * specifier.c (make_specifier_internal):
        Declare SPEC_METHS as const.
        * specifier.c (make_specifier):
        Declare METHS as const.
        * specifier.c (make_magic_specifier):
        Ditto.
        * specifier.c (Fmake_specifier):
        Ditto.
        * specifier.c (Fspecifier_type):
        No longer a need to intern() the specifier method name.
        * specifier.c (Fspecifier_tag_list):
        Call Fconsole_type_list() here now Vconsole_type_list no longer
        available.
        * specifier.c (check_valid_instantiator):
        Declare METHS as const.
        * specifier.c (Fcheck_valid_instantiator):
        Ditto.
        * specifier.c (Fvalid_instantiator_p):
        Ditto.
        * specifier.c (check_valid_inst_list):
        Ditto.
        * specifier.c (Fcheck_valid_inst_list):
        Ditto.
        * specifier.c (Fvalid_inst_list_p):
        Ditto.
        * specifier.c (check_valid_spec_list):
        Ditto.
        * specifier.c (Fcheck_valid_spec_list):
        Ditto.
        * specifier.c (Fvalid_spec_list_p):
        Ditto.
        * specifier.c (check_valid_specifier_matchspec):
        Ditto.
        * specifier.c (Fvalid_specifier_matchspec_p):
        Ditto.
        * specifier.c (initialize_specifier_type): New. De-inline the bulk
        of INITIALIZE_SPECIFIER_TYPE().
        * specifier.c (specifier_type_create):
        Remove mention of Vspecifier_type-list. Initialize
        the_specifier_methods_dynarr appropriately.
        Revise calls to INITIALIZE_SPECIFIER_TYPE().
        * specifier.h:
        * specifier.h (struct specifier_methods):
        Update the type of NAME here, make it a Lisp symbol.
        Make EXTRA_DATA_SIZE a Bytecount, as is good practice.
        * specifier.h (struct Lisp_Specifier):
        Mark METHODS as const.
        * specifier.h (INITIALIZE_SPECIFIER_TYPE):
        Implement this in terms of initialize_specifer_type(). Declare
        that function.
        * specifier.h (INITIALIZE_SPECIFIER_TYPE_WITH_DATA):
        Implement this in terms of initialize_specifer_type().
        Remove declaration for add_entry_to_specifier_type_list(), no
        longer used.
        * toolbar.c (specifier_type_create_toolbar):
        Revise call to INITIALIZE_SPECIFIER_TYPE().
        * unicode.c (coding_system_type_create_unicode):
        Revise call to INITIALIZE_CODING_SYSTEM_TYPE_WITH_DATA().

2026-03-13  Aidan Kehoe  <kehoea@parhasard.net>

        Remove the need for reinit_complex_vars_of_buffer_runtime_only().

        * symsinit.h: Remove its declaration.
        * emacs.c (main_1): Remove call to it.
        * buffer.c: Remove buffer_defaults_saved_slots,
        buffer_local_symbols_saved_slots, no longer needed.
        * buffer.c (vars_of_buffer):
        Use a normal staticpro(), not staticpro_dump_nil(),
        Vbuffer_defaults, Vbuffer_local_symbols.
        * buffer.c (common_init_complex_vars_of_buffer): Implementation
        moved to complex_vars_of_buffer.
        * buffer.c (complex_vars_of_buffer):
        Dump Vbuffer_defaults, Vbuffer_local_symbols using
        dump_add_root_block_ptr().
        Dump buffer_local_flags using dump_add_root_block(). 
        * buffer.c (reinit_complex_vars_of_buffer_runtime_only): Removed,
        no longer needed.
        * buffer.c (static const struct sized_memory_description
        buffer_slots_description): Removed, no longer needed.

2026-03-13  Aidan Kehoe  <kehoea@parhasard.net>

        Remove the need for reinit_complex_vars_of_console_runtime_only().
        * symsinit.h: Remove its declaration.
        * emacs.c (main_1): Remove call to it.
        * console.c:
        Remove console_defaults_saved_slots,
        console_local_symbols_saved_slots, no longer needed.
        * console.c (vars_of_console):
        No longer do a staticpro_dump_nil on Vconsole_defaults,
        Vconsole_local_symbols, just preserve their dump time values.
        * console.c (complex_vars_of_console): Move what was in
        common_init_complex_vars_of_console() here.
        Initialise the console type of Vconsole_defaults,
        Vconsole_local_symbols as a dead console.
        Dump them using dump_add_root_block_ptr(), avoid the dumper
        erroring because consoles are undumpable.
        Initialise the console type of console_local_flags as a dead
        console. Dump it using dump_add_root_block().
        * console.c (static const struct sized_memory_description
        console_slots_description): Removed. No longer needed.

2026-03-09  Aidan Kehoe  <kehoea@parhasard.net>

        * search.c (reinit_vars_of_search):
        Actually remove the staticpro_nodump() for the strings in the
        regexp cache, missed in 6ab8fae39cd2 .

2026-03-02  Aidan Kehoe  <kehoea@parhasard.net>

        * lisp.h (INT_64_BIT_MAX): Document that this and related #defines
        can't be used directly, they need trailing Ls, LLs, etc.
        * number.h (C_TYPE_TO_LISP_INTEGER):
        Negate VALUE in a way that suppresses a warning on Visual Studio
        when this macro is used with unsigned types.
        * number.h (DEFINE_C_INTEGER_TYPE_LISP_CONVERSION):
        Revise this to work on 32-bit Windows, where long long is not
        available and INT_64_BIT is; use sizeof (INT_16_BIT), sizeof
        (INT_32_BIT) etc rather than SIZEOF_SHORT, SIZEOF_LONG and so on.

2026-03-07  Aidan Kehoe  <kehoea@parhasard.net>

        * dumper.c (pdump_dump_rtables):
        * dumper.c (pdump_prune_weak_object_chain_prefixes):
        New, refactored out from the previous
        pdump_dump_root_lisp_objects().
        * dumper.c (pdump):
        The Lisp_Objects in pdump_root_lisp_objects are just special cases
        of root block pointers (for record types) or root blocks (for
        immediate types); handle them as such.
        Call pdump_prune_weak_object_chain_prefixes() after all the root
        blocks and root block pointers have been processed.
        * dumper.c (pdump_load_finish):
        No longer any need to put pdump_root_lisp_objects back in place at
        pdump_load() time, that was handled the root block pointer
        handling.

2026-03-07  Aidan Kehoe  <kehoea@parhasard.net>

        * search.c (reinit_vars_of_search):
        * search.c (vars_of_search):
        Add GC protection for the Lisp strings in the regexp cache table
        by means of staticpro_dump_nil(), since they are in BSS and (up to
        now) were explicitly initialized to nil after pdump_load().
        This has the advantage that staticpros_nodump->base is not
        immediately leaked at startup.

2026-03-01  Aidan Kehoe  <kehoea@parhasard.net>

        * syswindows.h:
        OpenSSL has similar conflicts with the Windows headers as has X11,
        use a similar workaround, get Cygwin building with OpenSSL
        TLS. Thank you Henry S. Thompson.

2026-02-28  Aidan Kehoe  <kehoea@parhasard.net>

        * event-msw.c (mswindows_dde_callback):
        Qmswindows_multibyte is a type of coding system, not a coding
        system in itself. Use Qmswindow_multibyte_system_default here if
        not dealing with a Unicode message.
        * sysdll.c (dll_close):
        This has never given a correct result on Windows, since Bill Perry
        implemented it in 1998; FreeLibrary() returns nonzero on success,
        while dlclose() (which this basically wraps) returns zero on
        success. Correct this, get better behaviour unloading modules on
        Cygwin (and, going forward, Windows native).
        * sysdll.c (dll_function):
        Use Qmswindows_multibyte_system_default here rather than
        Qwindows_multibyte to decode the argument to GetProcAddress().
        * sysdll.c (dll_variable):
        Ditto. Correct some types.
        * syswindows.h:
        Declare Qmswindow_multibyte_system_default here.
        * xemacs.def.in.in:
        Remove mention of error_check_ldap(), error_check_pgconn(),
        error_check_pgresult(), now they are only needed as the relevant
        modules are loaded.

2026-02-10  Aidan Kehoe  <kehoea@parhasard.net>

        * lrecord.h:
        Correct, extend the documentation of XD_LO_LINK.
        * dumper.c (pdump_load_lispdesc_indirect_description):
        Correct a spelling here in passing.

2026-02-10  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.def.in.in:
        Add entries for define_lisp_object(), undef_lisp_object(),
        write_string_1() here, making progress with Windows module
        support.

2026-02-10  Aidan Kehoe  <kehoea@parhasard.net>

        * dumper.c (pdump_file_try):
        DIEP was always 1 in our callers, remove it as an argument, quiet
        a GCC warning.
        * dumper.c (MAYBE_HANDLE_SYMLINK):
        BASENAME is not used within this macro, remove it as an argument.
        * dumper.c (pdump_load):
        Update calling conventions for pdump_file_try(),
        MAYBE_HANDLE_SYMLINK().
        * nas.c:
        Move the declaration for nas_init_play() to sound.h, rather than
        right beside its declaration.
        * nas.c (WaveOpenDataForReading):
        Mark DUMMY as used, silence a warning.
        * sound.h:
        Move declarations for sound-specific functions here. Correct a
        declaration for nas_wait_for_sounds().
        Add a /* sound.h ends here */ trailing comment.
        * sound.c:
        Move various sound-type specific declarations to the header.

2026-02-08  Aidan Kehoe  <kehoea@parhasard.net>

        * emodules.c (static Fixnum module_revision): New.
        * emodules.c (vars_of_module):
        Make EMODULES_REVISION available to Lisp, as module-revision (on the
        model of module-version).

2026-01-29  Aidan Kehoe  <kehoea@parhasard.net>

        Fix bugs in implementation of SHEBANG_PROGNAME.

        * dumper.c:
        * dumper.c (pdump_file_try):
        If checking for the dump file in the same directory as the
        executable, only check for the compile time EMACS_DUMP_FILE_NAME
        rather than using the basename of the found executable. The build
        process never uses a distinct file name for this, and restricting
        the path searching is appropriate for this file that contains
        function pointers and should be regarded as executable code.
        * dumper.c (MAYBE_HANDLE_SYMLINK): Rename
        MAYBE_HANDLE_SHEBANG_PROGNAME() to this.
        Revise it to ignore SHEBANG_PROGNAME, and call pdump_load()
        recursively on the absolute or relative target of a symlink,
        whatever that symlink's name.
        * dumper.c (pdump_load):
        Use new name for MAYBE_HANDLE_SHEBANG_PROGNAME() here.
        * emacs.c (main_1):
        Don't eat the trailing argument when rewriting ARGV when called
        with SHEBANG_PROGNAME in argv[0].

2026-01-11  Aidan Kehoe  <kehoea@parhasard.net>

        * config.h.in:
        If HAVE_ATHENA_I18N, #define XAW_INTERNATIONALIZATION, restoring
        the bug fix of 69f9e31c9ccf lost in 2c7e3fa8e672 . Thank you for
        the bug report and help with diagnosis, testing, Mats Lidell.

2026-01-09  Aidan Kehoe  <kehoea@parhasard.net>

        * emacs.c:
        New variable Vxemacs_script_name, exposing SHEBANG_PROGNAME to
        Lisp.
        * emacs.c (main_1):
        When handling SHEBANG_PROGNAME, add a "--" after the script file
        name to allow it to deal with command line args on its own terms.
        * emacs.c (vars_of_emacs):
        Add a DEFVAR_CONST_LISP() for Vxemacs_script_name, with a
        docstring.

2026-01-05  Aidan Kehoe  <kehoea@parhasard.net>

        Bug fixing of the modules implementation, #'unload-module can now
        be called directly without being called through #'unload-feature
        and XEmacs won't crash.

        * alloc.c (init_memory_usage_stats):
        Chec INITIALIZED rather than the value of TIPO when deciding on
        staticpro_nodump() vs. staticpro().
        * emodules.c (add_module_loadhist_elt):
        Store the various subrs and symbol-value-magics with their
        symbols, to allow them to be unbound by attempt_module_delete() if
        Lisp has not done this.
        Use Facons() which is a bit more idiomatic.
        * emodules.c (static Fixnum deadbeef_constant): Removed.
        * emodules.c (static Boolint deadbeef_boolint): Removed.
        No need for these, the relevant symbol-value-magic objects will be
        unreachable on unload and attempt_module_delete() frees them.
        * emodules.c (attempt_module_delete):
        Make relevant symbols' function, value slots unbound if they
        still reflect the saved symbol-value-magic and subr objects that
        were found on load.
        Only call undef_lisp_object() if the module itself hasn't.
        * emodules.c (emodules_load):
        Fix some indentation here.
        * emodules.c (Flist_modules):
        Return copies of various strings so that Lisp can't modify them.
        * symbols.c (defsymbol_massage_name_1):
        Update this to allocate the scratch space dynamically (since the
        static assertion cannot work with arbitrary dynamic modules), and
        to use Qmodule_string_coding_system if loading a module.
        * symbols.c (defsymbol_massage_name_nodump): Update the type of NAME.
        * symbols.c (defsymbol_massage_name): Ditto.
        * symbols.c (defsymbol_massage_multiword_predicate_nodump): Ditto.
        * symbols.c (defsymbol_massage_multiword_predicate): Ditto.
        * symbols.c (defsymbol_nodump): Don't do make_string_nocopy() on
        NAME, since NAME routinely points into the data segment of a
        module which may later be unloaded.
        * symbols.c (defsymbol): Update the type of NAME.
        * symbols.c (defkeyword): Ditto.
        * symbols.c (defkeyword_massage_name): Ditto. Allocate the temp
        buffer dynamically (using alloca_ibytes).
        * symbols.c (defsubr):
        If we're loading a module, it's fine to set a symbol's function
        slot to a subr independent of what's already there, the assertion
        that picks up duplicate syms_of_FILE() calls is not relevant.
        * symeval.h:
        Update types for the declaration of defsymbol() and friends.

2026-01-05  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (ALLOCATE_FIXED_TYPE_1):
        Document what MINIMUM_ALLOWED_FIXED_TYPE_CELLS_##type is, and that
        this implementation deals poorly with it being zero.
        Add an assertion that it is not zero.
        * alloc.c (MINIMUM_ALLOWED_FIXED_TYPE_CELLS_subr):
        Make this non-zero.

2026-01-02  Aidan Kehoe  <kehoea@parhasard.net>

        * opaque.c (hash_opaque):
        Check whether OBJ's size is equal to that of Hashcode, not of
        unsigned long, when using the opaque data itself as the hash
        value.

2026-01-02  Aidan Kehoe  <kehoea@parhasard.net>

        * event-msw.c:
        * event-msw.c (mswindows_enqueue_dispatch_event):
        * event-msw.c (mswindows_dequeue_dispatch_event):
        * event-msw.c (mswindows_need_event_in_modal_loop):
        * event-msw.c (mswindows_need_event):
        * event-msw.c (emacs_mswindows_remove_timeout):
        * event-msw.c (emacs_mswindows_event_pending_p):
        * event-msw.c (vars_of_event_mswindows):
        Rename mswindows_s_dispatch_event_queue to
        Vmswindows_s_dispatch_event_queue.
        Rename mswindows_s_dispatch_event_queue_tail to
        Vmswindows_s_dispatch_event_queue_tail.
        Rename dispatch_event_queue to Vdispatch_event_queue.

        * event-Xt.c (emacs_Xt_next_event):
        * event-Xt.c (check_if_pending_expose_event):
        * event-gtk.c (emacs_gtk_next_event):
        Rename dispatch_event_queue to Vdispatch_event_queue.

        * event-stream.c:
        * event-stream.c (enqueue_command_event):
        * event-stream.c (dequeue_command_event):
        * event-stream.c (enqueue_dispatch_event):
        * event-stream.c (dequeue_dispatch_event):
        * event-stream.c (detect_input_pending):
        * event-stream.c (event_stream_quit_p):
        * event-stream.c (next_event_internal):
        * event-stream.c (Fnext_event):
        * event-stream.c (Fdispatch_non_command_events):
        * event-stream.c (Fdiscard_input):
        * event-stream.c (Faccept_process_output):
        * event-stream.c (Fsleep_for):
        * event-stream.c (Fsit_for):
        * event-stream.c (wait_delaying_user_input):
        * event-stream.c (command_builder_find_leaf_and_update_global_state):
        * event-stream.c (pre_command_hook):
        * event-stream.c (vars_of_event_stream):
        Rename command_event_queue to Vcommand_event_queue.
        Rename command_event_queue_tail to Vcommand_event_queue_tail.
        Rename last_point_position_buffer to Vlast_point_position_buffer.
        Rename dispatch_event_queue to Vdispatch_event_queue.

        * event-tty.c (emacs_tty_event_pending_p):
        * event-tty.c (emacs_tty_next_event):
        Rename dispatch_event_queue to Vdispatch_event_queue.
        * event-xlike-inc.c (emacs_{Xt,gtk}_event_pending_p):
        Ditto.
        * events.h:
        Ditto.
        * extents.h:
        Update the type of inside_undo.

        * undo.c:
        * undo.c (undo_boundary):
        * undo.c (undo_prelude):
        Modernize the type of HACK_PENDING_BOUNDARY arg.
        * undo.c (record_delete):
        * undo.c (Fprimitive_undo):
        * undo.c (vars_of_undo):
        Rename dispatch_event_queue to Vdispatch_event_queue.
        Rename dispatch_event_queue_tail to Vdispatch_event_queue_tail.
        Rename last_undo_buffer to Vlast_undo_buffer.
        Change the type of INSIDE_UNDO to Boolint.
        Rename pending_boundary to Vpending_boundary.

2026-01-02  Aidan Kehoe  <kehoea@parhasard.net>

        * config.h.in:
        Never #define _XOPEN_SOURCE_EXTENDED, thank you Hauke Fath and
        Jonathan Perkin. See
        https://gist.github.com/jperkin/b08f9108daf8d0ac695067d71f882a9d .

2026-01-01  Aidan Kehoe  <kehoea@parhasard.net>

        Change from David Brownlee <abs@NetBSD.org>, maintained in NetBSD
        pkgsrc tree.
        * emacs.c (main_1):
        * sound.c (vars_of_sound):
        Fix build for non HPUX on HP PA platforms

2025-12-26  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecode.c (compiled_function_annotation):
        Add a comment regarding a possible better implementation of this
        for dumped function.

        * doc.c (Fbuilt_in_symbol_file):
        If passed a lambda list that has a fixnum as its third element,
        pass back the corresponding built in object file name.

2025-12-25  Aidan Kehoe  <kehoea@parhasard.net>

        * doc.c (get_built_in_object_file_name):
        No longer accept a trailing newline as marking the end of a file
        name; this is no longer generated by make-docfile.el and did not
        add anything anyway.
        * bytecode.c (vars_of_bytecode):
        Make Vcompiled_function_annotations available to Lisp,
        used by make-docfile.el when creating DOC and when calling
        #'Snarf-documentation.

2025-12-22  Aidan Kehoe  <kehoea@parhasard.net>

        Move to storing compiled function annotations in a weak hash table
        rather than directly in the compiled function objects, allowing
        them to be mapped over by #'Snarf-documentation
        * alloc.c (make_compiled_function):
        Don't initialize the (removed) field here.
        * alloc.c (Fmake_byte_code):
        Only set the annotation if the doc string is not a cons (where the
        file name is trivially found) or if we're dumping.
        * bytecode.c:
        Remove the annotation slot from the object description.
        * bytecode.c (Vcompiled_function_annotations): New variable, a
        weak hash table mapping from compiled functions to their
        annotations.
        * bytecode.c (compiled_function_annotation):
        Revise this to look up the annotation in
        Vcompiled_function_annotations; or, take the file name from the
        car of any cons docstring slot.
        * bytecode.c (set_compiled_function_annotation):
        New function, just does a #'puthash into
        Vcompiled_function_annotations.
        * bytecode.c (vars_of_bytecode):
        Initialize Vcompiled_function_annotations at startup.
        * bytecode.h:
        Declare set_compiled_function_annotation() here.
        * bytecode.h (struct Lisp_Compiled_Function):
        Remove the slot for ANNOTATED.
        * emacs.c (main_1):
        Move call to vars_of_elhash() before that of vars_of_bytecode(),
        so the latter can create a weak hash table.
        * symbols.c (Fdefine_function):
        Call set_compiled_function_annotation() here.

2025-12-22  Aidan Kehoe  <kehoea@parhasard.net>

        Always turn on COMPILED_FUNCTION_ANNOTATION_HACK, in preparation
        for further work to save docstrings and compiled function file
        names for anonymous functions in DOC. Changes generated with
        unifdef -DCOMPILED_FUNCTION_ANNOTATION_HACK
        * bytecode.h: Remove #define COMPILED_FUNCTION_ANNOTATION_HACK and
        an associated comment.
        * alloc.c (make_compiled_function):
        * alloc.c (Fmake_byte_code):
        * bytecode.c:
        * bytecode.c (print_compiled_function):
        * bytecode.c (syms_of_bytecode):
        * bytecode.h:
        * bytecode.h (struct Lisp_Compiled_Function):
        * print.c (debug_short_backtrace):
        * symbols.c (Fdefine_function):
        Remove #ifdef COMPILED_FUNCTION_ANNOTATION_HACK from all these.

2025-12-21  Aidan Kehoe  <kehoea@parhasard.net>

        Remove the need for reinit_vars_of_text().

        * emacs.c (main_1):
        Remove call to reinit_vars_of_text().
        * text.c:
        * text.c (static const struct sized_memory_description
        unsigned_char_dynarr_ptr_description): New.
        * text.c (static const struct sized_memory_description
        conversion_dynarr_description): New.
        Description for conversion_out_dynarr_list,
        conversion_in_dynarr_list.
        * text.c (reinit_vars_of_text): Removed.
        * text.c (vars_of_text):
        Initialize conversion_in_dynarr_list, conversion_out_dynarr_list
        here, and dump them using dump_add_root_block_ptr().

2025-12-20  Aidan Kehoe  <kehoea@parhasard.net>

        Silence warnings, Visual Studio.

        * regex.c (offset_to_bytexpos):
        Take OFF as a Bytecount rather than an int.
        * regex.c (print_partial_compiled_pattern):
        Cast the argument to putchar() to int if it is less than 0x80.
        * regex.c (print_double_string):
        Rename THIS_CHAR to the less confusing THIS_OFFSET, declare it as
        a Bytecount.
        * regex.c (PUSH_FAILURE_POINTER):
        re_char * is already const, don't add another const qualifier
        here.
        * regex.c (CHECK_INFINITE_LOOP):
        Declare FAILURE as an Elemcount.
        * regex.c (PUSH_FAILURE_POINT):
        Cast fail_stack.frame to an unsigned int when pushing it.
        * regex.c (STORE_JUMP):
        Cast the third argument to store_op1() to int (it represents an
        offset in the pattern, which is limited to sixteen bits in length,
        so this is fine).
        * regex.c (STORE_JUMP2):
        Ditto for the third argument to store_op2().
        * regex.c (INSERT_JUMP):
        Ditto for the third argument to insert_op1().
        * regex.c (INSERT_JUMP2):
        Ditto for the third argument to insert_op2().
        * regex.c (GET_UNSIGNED_NUMBER):
        Cast the result of XREALFIXNUM() to int, since we know it will fit
        in a 32-bit integer and doing this silences a Visual Studio warning.
        * regex.c (regex_compile):
        Declare I, OLD_SIZE as Elemcount.
        Cast begalt - bufp->buffer to pattern_offset_t, which is fine,
        given we know the pattern offset is limited to a sixteen bit
        value.
        Cast the fourth argument of insert_op2() to int, same motivation.
        Cast the second argument to set_itext_ichar() to Ichar, suppress
        a warning.
        * regex.c (re_compile_fastmap):
        Ditto.
        * regex.c (re_search_2):
        Cast any adjustments to RANGE to int, silence warnings. Right
        thing to do is redeclare re_search_2 in terms of Bytecount and
        friends, given nothing that is non-XEmacs uses it.
        Remove a comment /* whose stupid idea was it anyway to make this
        function take two strings to match?? */; this is intrinsic to the
        emacs implementation of buffers with insertion at a gap, and is not
        remotely stupid.
        * regex.c (skip_noops):
        Remove a duplicate const qualifier from P, PEND, silence a warning
        on Visual Studio.
        * regex.c (re_match_2_internal):
        Cast to int before assigning to MCNT. Similarly to re_search_2()
        above, right thing to do is to redeclare this to in terms of
        Bytecount and friends, given nothing that is non-XEmacs uses it.

2025-12-20  Aidan Kehoe  <kehoea@parhasard.net>

        Rename internal-doc-filename-buffer-size to
        internal-doc-file-name-buffer-size for consistency.
        Fix a bug in the last commit to doc.c.
        * doc.c:
        Update definition for internal-doc-file-name-buffer-size.
        * doc.c (get_built_in_object_file_name):
        Use it more consistently. No need for a function-local copy of
        it.
        * doc.c (vars_of_doc):
        Update its DEFVAR_INT(), update the call to
        dump_add_opaque_fixnum().

2025-12-17  Aidan Kehoe  <kehoea@parhasard.net>

        * unicode.c (unicode_decode):
        On encountering an isolated trailing surrogate with UTF-16, decode
        two error octets rather than passing the code point to
        decode_unicode_to_dynarr_0() and crashing with error checking.
        Thank you for the bug report, Stephen Turnbull.
        Similar for UTF-32.
        For UCS-4, allow decoding into our private unicode code space, but
        if a code point is encountered outside of that, generate error
        octets. Add a comment motivating an eventual change to restricting
        the Unicode code points accepted by UCS-4.

2025-12-14  Aidan Kehoe  <kehoea@parhasard.net>

        * doc.c (get_built_in_object_file_name):
        Use alloca_extbytes for the buffer, rather than the C99ism of a
        an array declaration with a length that is not constant at compile
        time, thank you Microsoft Visual Studio.

2025-12-14  Aidan Kehoe  <kehoea@parhasard.net>

        * dumper.c (pdump_add_block):
        Handle resizing of the hash table correctly. Thank you Mats Lidell
        and the buildbot.

2025-12-14  Aidan Kehoe  <kehoea@parhasard.net>

        * elhash.c:
        Update and correct the documentation comment for inchash().

2025-12-14  Aidan Kehoe  <kehoea@parhasard.net>

        Make pdump_hash into a normal Lisp hash table, a working version
        of 18f4733ccce0 now inchash() supports non-#'eq hash tables.

        * dumper.c:
        * dumper.c (PDUMP_HASHSIZE): Revise this to reflect the SIZE
        argument to make_lisp_hash_table().
        Rename pdump_hash to Vpdump_hash, change its type to a
        Lisp_Object.
        * dumper.c (pdump_void_ptr_to_lisp): New inline function, return a
        fixnum using STORE_VOID_TO_LISP() if its argument has a zero least
        significant bit, return an opaque-ptr object if that bit is one.
        * dumper.c (pdump_get_block):
        Use pdump_void_ptr_to_lisp(), find_htentry() here.
        * dumper.c (pdump_add_block):
        Use pdump_void_ptr_to_lisp(), inchash() here.
        The allocated pdump_block_list_elt is aligned, we can store it in
        Vpdump_hash using STORE_VOID_IN_LISP() unconditionally.
        * dumper.c (pdump):
        Initialize Vpdump_hash as an #'equal Lisp hash table. No need to
        explicitly free it.

2025-12-14  Aidan Kehoe  <kehoea@parhasard.net>

        Generalize inchash_eq() to handle hash tables with non-#'eq tests,
        with no significant loss of speed when tests are #'eq, in
        preparation for using it for pdump_hash.

        * alloc.c:
        * alloc.c (cons_print_preprocess):
        * elhash.c:
        * elhash.c (find_htentry_1): New. Inline version of
        find_htentry(). 
        * elhash.c (find_htentry): Implement find_htentry by just calling
        find_htentry_1().
        * elhash.c (inchash): Rename inchash_eq() to this.
        Call find_htentry_1() rather than LINEAR_PROBING_LOOP() ourselves.
        * elhash.h:
        Update declaration of inchash_eq().
        * print.c:
        * print.c (print_preprocess_inchash): New name for
        print_preprocess_inchash_eq(). Call inchash() instead of
        inchash_eq().
        * print.c (print_preprocess):
        Call print_preprocess_inchash() in here.
        * profile.c (profile_record_consing): Call inchash() here with its
        new name.
        * profile.c (profile_sow_backtrace): Ditto.
        * profile.c (profile_record_about_to_call): Ditto.
        * profile.c (sigprof_handler): Ditto.
        * symbols.c (symbol_print_preprocess): Update a comment here.

2025-12-14  Aidan Kehoe  <kehoea@parhasard.net>

        * elhash.c (choose_hash_table_test_for_lookup):
        If TEST is #'eql, and KEY is a non-fixnum number, return
        Vequal_hash_table_test here, rather than Veql_hash_table_test,
        which is more useful now find_htentry() inlines the call to
        internal_equal().

2025-12-12  Aidan Kehoe  <kehoea@parhasard.net>

        Rename various C functions that need to be done after loadup.el
        has finished loading Lisp, to disksave_finalize_*, rather than the
        slighly misleading init_*.
        * alloc.c:
        * alloc.c (disksave_finalize_memusage_stats):
        Rename this from compute_memusage_stats_length().
        * alloc.c (finalize_functions_in_obarray):
        Correct a comment here.
        * alloc.c (disksave_object_finalization):
        Call disksave_finialize_mule_charset(),
        disksave_finalize_mule_wnn(), disksave_finalize_memusage_stats()
        here with their new names. Do this before calling
        garbage_collect_1() to allow them to create garbage should they
        need to (not currently used).
        * emacs.c (Frun_emacs_from_temacs):
        Call disksave_finalize_mule_charset(),
        disksave_finalize_mule_wnn() with their new names.
        * emacs.c (Fdump_emacs):
        Remove an unnecessary call to garbage_collect_1(), which
        disksave_object_finalization() calls anyway.
        * mule-charset.c (disksave_finalize_mule_charset): Renamed from
        init_mule_charset().
        * mule-wnnfns.c (disksave_finalize_mule_wnn):
        Renamed from init_mule_wnn().
        * symsinit.h:
        Add declarations for the new names for the same two functions.
        * symsinit.h (init_number): Flesh out a comment for this.

2025-12-06  Aidan Kehoe  <kehoea@parhasard.net>

        Generic char tables are perfectly adequate for implementing
        display tables, remove mention of a never-implemented separate
        display table type.

        * chartab.c:
        Remove mention of display tables from a comment.
        * chartab.c (char_table_type_to_symbol):
        Remove mention of CHAR_TABLE_TYPE_DISPLAY.
        * chartab.c (symbol_to_char_table_type):
        Ditto.
        * chartab.c (char_table_default_for_type):
        Ditto.
        * chartab.c (Fchar_table_type_list):
        Remove mention of Qdisplay.
        * chartab.c (Fvalid_char_table_type_p):
        Ditto.
        * chartab.c (Fmake_char_table):
        Remove mention of non-Mule in the docstring. Document Ben's
        (FIRST-CHAR . LAST-CHAR) syntax for specifying ranges. Remove
        mention of display tables.
        * chartab.c (check_valid_char_table_value):
        Remove handling of CHAR_TABLE_TYPE_DISPLAY.
        * chartab.h (enum char_table_type):
        Ditto.

2025-12-06  Aidan Kehoe  <kehoea@parhasard.net>

        * editfns.c (Ftemp_directory):
        Add a comment documenting GNU's special handling of remote paths
        and documenting that we should implement this.

2025-12-05  Aidan Kehoe  <kehoea@parhasard.net>

        * doc.c (vars_of_doc):
        Initialize and dump Vinternal_doc_file_name as DOC-DUMP-ID, which
        is its expected value in an installed XEmacs.
        * doc.c (open_doc_file):
        Simplify this function when dealing with Vinternal_doc_file_name.
        Don't try to intialize it to something sensible if it cannot be
        found, trust the startup code to set it correctly, as with do with
        initialization of other paths. This also simplifies testing in
        ../tests/automated/symbol-tests.el.

2025-11-30  Aidan Kehoe  <kehoea@parhasard.net>

        Remove mention of non-Mule from many comments.

        * buffer.h:
        Remove mention of non-Mule from a comment.
        * chartab.c:
        Ditto.
        * doprnt.c:
        Update documentation reflecting that non-Mule is gone.
        * dumper.c:
        Update comment here now the vast majority of reinit_vars_of*()
        functions are gone.
        * emacs.c (main):
        Update a comment here now non-Mule is gone.
        * emacs.c (Fdump_emacs):
        Correct a spelling here.
        * event-Xt.c:
        * event-Xt.c (x_keysym_to_character):
        Correct a comment here, we no longer use 'character-of-keysym by
        default.
        Remove mention of non-Mule from a comment.
        Clarify composed character input using compose.el.
        * event-stream.c (command_builder_find_leaf):
        Remove mention of non-Mule.
        * lisp.h:
        Remove mention of non-Mule from a comment.
        * lread.c (read_unicode_escape):
        Update a comment here, remove mention of non-Mule.
        * redisplay-tty.c (tty_text_width):
        Ditto.
        * search.c (wordify): Ditto.
        * tests.c (Ftest_character_tell): Ditto.
        * text.c:
        Remove mention of non-Mule from a long comment here.
        Update comment, charbpos_to_bytebpos_func() is no longer the
        most-called function in all of XEmacs.
        Update the docstrings for #'make-char and friends to remove
        mention of no-Mule.
        * text.h:
        Remove mention of no-Mule from a long comment in this header file

2025-11-28  Aidan Kehoe  <kehoea@parhasard.net>

        * doc.c (unquote_for_DOC): New function, refactored out from
        unparesseuxify_doc_string(), extract_object_file_name().
        * doc.c (extract_object_file_name): Removed.

        * doc.c (unparesseuxify_doc_string):
        Call unquote_for_DOC() here. Correct some types.

        * doc.c (get_built_in_object_file_name):
        Renamed from get_object_file_name() since this doesn't take (FILE
        . POSITION) conses in the same way get_doc_string() does.
        Move what was extract_object_file_name() into this function, no
        value from a separate function.

        Fix a bug, made more evident with recent extra documentation
        passed into DOC by make-docfile.el; the lseek() POSITION - 2048
        followed by a read led to buffer text ending before the file name
        of interest if there was much non-ASCII in the escape-quoted
        text. Don't de-escape-quote the text before searching for the
        marker of the beginning of the file name, call build_extstring()
        with Qescape_quoted once unquote_for_DOC() is done.
        Use internal_doc_filename_buffer_size, a new variable initialized
        by #'Snarf-documentation, rather than a fixed buffer size, when
        reading before the position for the file name.

        * doc.c (Fbuilt_in_symbol_file):
        Call get_built_in_object_file_name() with its new name.
        * doc.c (vars_of_doc):
        Add both a DEFVAR_LISP() and a dump_add_opaque_fixnum() for
        internal_doc_filename_buffer_size.

        * sysfile.h (DOC_MAX_FILENAME_LENGTH): No further need for this
        constant, analagous value determined at dump time by
        #'Snarf-documentation.

2025-11-24  Aidan Kehoe  <kehoea@parhasard.net>

        * sequence.c (syms_of_sequence):
        Provide a trivial definition with a lambda for #'identity in this
        file, needed in early bootstrap in backquote.el. Leave the real
        definition in subr.el.

2025-11-18  Aidan Kehoe  <kehoea@parhasard.net>

        Docstring work, #'run-emacs-from-temacs, #'dump-emacs. Document a
        change just made to ../lisp/loadup.el that removes their symbols
        from obarray as part of the dump process.

        * emacs.c (Frun_emacs_from_temacs):
        Flesh out the doc string here. Supply a command line that
        currently works for me (the supplied one does not). Clarify that
        this function has been removed from the Lisp namespace as part of
        the dump process since it is not of use.
        * emacs.c (Fdump_emacs):
        Correct the docstring of this function. Document that the dump
        process now removes this function from the Lisp namespace since
        calling after pdump_load() just crashes. Removed unused arguments,
        remove GCPRO() of them.

2025-11-16  Aidan Kehoe  <kehoea@parhasard.net>

        Fix a bug in my last change, and a separate bug which it made more
        evident.
        * file-coding.c:
        * file-coding.c (encode_decode_coding_string):
        Create an Ibyte_dynarr and write to that by means of
        make_dynarr_output_stream(), rather than using a resizing
        buffer. This latter has the disadvantage that once it is closed
        its BUF is immediately freed; certain coding coding systems only
        write trailing error sequences at the point when close() is
        called. The xfree (str->buf) should likely be in a finalizer
        rather than a closer.
        * unicode.c (unicode_decode):
        Only perform the skip_ascii() optimization if data->counter is
        zero (and the byte is ASCII); otherwise we may need to indicate
        invalid UTF-8, so that is inappropriate.

2025-11-16  Aidan Kehoe  <kehoea@parhasard.net>

        * text.h (itext_ichar_eql):
        Fix a bug in this function, if CH is non-ASCII the character at
        STR may still be ASCII and so non_ascii_itext_ichar() is
        inappropriate. Thank you Mats Lidell and the buildbot.

2025-11-15  Aidan Kehoe  <kehoea@parhasard.net>

        Use the lisp_string and the resizing_buffer lstream
        implementations to implement #'decode-coding-string,
        #'encode-coding-string, drastically reducing the amount of garbage
        generated when they are called repeatedly.

        Implement the NOCOPY argument. 

        * file-coding.c (encode_decode_coding_string): New. The
        implementation of the next two subrs.
        * file-coding.c (Fdecode_coding_string): Moved here from
        coding.el.
        * file-coding.c (Fencode_coding_string): Moved here from
        coding.el.
        * file-coding.c (syms_of_file_coding):
        Provide DEFSUBR() for Fdecode_coding_string(),
        Fencode_coding_string().

2025-11-15  Aidan Kehoe  <kehoea@parhasard.net>

        * doc.c (unparesseuxify_doc_string):
        There is no good reason that DOC (or indeed dynamic docstrings)
        cannot include literal zero characters, use memchr() rather than
        qxestrchr() when looking for the terminating ?\037.
        De-quoting within this function for quoting of ?\0 with ?\1 is
        still necessary, given need to load dynamic docstrings generated
        by 21.4.

2025-11-14  Aidan Kehoe  <kehoea@parhasard.net>

        * sequence.c (position):
        For #'find and #'position, if CHECK_TEST is check_eq_nokey(),
        avoid the checks that Lisp hasn't relocated the string data of
        SEQUENCE, and use itext_ichar_eql() for comparison, speeding up
        these Lisp functions for the common (usual) case of searching for
        a character in a string without a key argument.

2025-11-13  Aidan Kehoe  <kehoea@parhasard.net>

        * dumper.c (pdump_file_try):
        Update a comment here.
        * dumper.c (MAYBE_HANDLE_SHEBANG_PROGNAME): New #define, used
        within pdump_load().
        * dumper.c (pdump_load):
        If argv[0] is SHEBANG_PROGNAME (usually xemacs-script) and is a
        symbolic link, find the dump file relative to that symbolic link
        rather than relative to xemacs-script by calling pdump_load()
        recursively on the target of the symbolic link; fixes
        --without-dump-in-exec when run in-place as xemacs-script.
        * lread.c (locate_file_without_hash):
        If PATH is Qnil, pass Qnil to locate_file_in_directory(), fixing
        the longstanding bug where locate-file does not work for a null
        load-path even if an absolute path is specified.
        * lread.c (init_lread):
        Remove post-pdump_load() initialization of Vload_path to '("") now
        this bug has been fixed.

2025-11-10  Aidan Kehoe  <kehoea@parhasard.net>

        Move #'Snarf-documentation, #'Verify-documentation to Lisp. To
        this end, allow Lisp to set subr and compiled-function
        documentation slots.

        * buffer.c:
        Update some comments here.
        * bytecode.c (set_compiled_function_documentation): Removed.
        * bytecode.c (Fcompiled_function_documentation): New name for
        #'compiled-function-doc-string.
        * bytecode.c (Fset_compiled_function_documentation): New. Expose
        set_compiled_function_documentation() to Lisp, move its
        implementation within the Lisp implementation.
        * bytecode.c (syms_of_bytecode):
        Add a DEFSUBR() for Fcompiled_function_documentation(). Add an
        alias for #'compiled-function-doc-string, its previous name.
        Add a DEFSUBR() for Fset_compiled_function_documentation().
        * bytecode.h:
        Remove the declaration for set_compiled_function_documentation().
        Add one for Fset_compiled_function_documentation().
        * console.c: Update a comment here.
        * data.c (Fsubr_documentation): New. Return the documentation slot
        of a subr, needed for the Lisp implementation of
        #'Snarf-documentation. 
        * data.c (Fset_subr_documentation): New. Set a subr's
        documentation slot, needed for needed for the Lisp implementation of
        #'Snarf-documentation. Error if the subr is not writeable, which
        will be the case post pdump_load().
        * data.c (syms_of_data):
        Add DEFSUBR()s for both of these.
        * doc.c:
        * doc.c (extract_object_file_name):
        Update a comment here.
        * doc.c (weird_doc): Moved to make-docfile.el.
        * doc.c (Fsnarf_documentation): Moved to make-docifle.el.
        * doc.c (kludgily_ignore_lost_doc_p): Moved to make-docfile.el.
        * doc.c (verify_doc_mapper): Moved to make-docfile.el.
        * doc.c (Fverify_documentation): Moved to make-docifle.el.
        * doc.c (syms_of_doc):
        Remove relevant DEFSUBR()s.
        * event-stream.c (init_event_stream):
        Update a comment.
        * gui-gtk.c (vars_of_gui_gtk):
        Ditto.
        * lisp.h (EXFUN_0):
        Update a comment.
        * lread.c (load_force_doc_string_unwind):
        Call Fset_compiled_function_documentation(), now
        set_compiled_function_documentation() is gone.

2025-11-10  Aidan Kehoe  <kehoea@parhasard.net>

        * lread.c (vars_of_lread):
        When DEBUG_XEMACS, add a proper DEFVAR_LISP() with a docstring for
        Vlocate-file-hash-table, avoiding a lost-doc warning for this
        global symbol.

2025-10-27  Aidan Kehoe  <kehoea@parhasard.net>

        * doc.c (verify_doc_mapper):
        Check a subr's DOC is a fixnum before doing XFIXNUM() on
        it. Ultimate right thing to do is to move #'Verify-documentation,
        #'Snarf-documentation to Lisp.

2025-10-25  Aidan Kehoe  <kehoea@parhasard.net>

        Remove a separate call to ../lisp/make-docfile.elc at build time,
        load that file and create DOC at the same time we are generating
        xemacs.dmp. Remove Makefile targets related to DOC.

        * Makefile.in.in:
        * Makefile.in.in ($(DOC)): Target removed, delegate to loadup.el
        when dumping.
        * Makefile.in.in ($(DUMP_TARGET)):
        * Makefile.in.in ($(LISP)/finder-inf.el):
        Remove dependency on ../lib-src/DOC. Correct numbering of
        comments.
        * doc.c (Fdocumentation):
        The DOC field of a subr is now never Qnil_pointer (see defsubr()),
        remove a check for this.
        * doc.c (Fsnarf_documentation):
        Remove handling of code in lread.c that set documentation slots to
        Qzero if PURIFY_FLAG, for variables, subrs, compiled functions. If
        a compiled function annotation is a string (so a file name,
        implying it was not initialized by #'defalias), go ahead and set
        it to the fixnum doc slot encountered.
        * lread.c:
        Update a comment for load_force_doc_strings.
        * lread.c (load_force_doc_string_unwind):
        Remove a couple of assertions here, no longer appropriate.
        * lread.c (read_string):
        Remove code that returned Qzero if reading a string starting with
        "\\\n" if PURIFY_FLAG.
        * lread.c (read1):
        Remove mention of PURIFY_FLAG from here.
        * lread.c (read_list):
        Remove special handling of PURIFY_FLAG here.
        * lread.c (read_compiled_function):
        Ditto.
        * symbols.c (Fdefine_function):
        If COMPILED_FUNCTION_ANNOTATION_HACK and initializing a macro, set
        the annotation of NEWDEF to the symbol name of the macro in the
        same way as for functions.

2025-10-24  Aidan Kehoe  <kehoea@parhasard.net>

        * Makefile.in.in:
        * Makefile.in.in (rallocobjs):
        * Makefile.in.in (rallocdocsrc): Removed.
        * Makefile.in.in (mallocobjs):
        * Makefile.in.in (mallocdocsrc): Removed.
        * Makefile.in.in ($(LIB_SRC)/DOC):
        Remove use of ../lib-src/make-docfile from the build process. Take
        advantage of changes committed today to have make-docfile.elc
        figure out the Lisp files on its own (by using
        #'run-emacs-from-temacs and taking advantage of
        load-history) and just pass the relevant object files rather than
        having Makefile variables specially constructed to pass the source
        files to this rule.

2025-10-24  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (disksave_object_finalization):
        No longer zero the unused parts of the string_chars blocks at dump
        time, irrelevant with pdump.
        * undo.c (vars_of_undo):
        Use staticpro_dump_nil() for pending_boundary and
        last_undo_buffer, avoid issues when the dumper attempts to dump
        even a killed buffer.

2025-10-19  Aidan Kehoe  <kehoea@parhasard.net>

        * lisp.h:
        * lisp.h (LOADHIST_ATTACH):
        * lread.c:
        * lread.c (build_load_history):
        * lread.c (vars_of_lread):
        Remove LOADHIST and LOADHIST_DUMPED as preprocessor #defines, make
        them always on in anticipation of using the load history as part
        of moving make-docfile to Lisp. Change generated with unifdef
        -DLOADHIST and unifdef -DLOADHIST_DUMPED.

2025-10-23  Aidan Kehoe  <kehoea@parhasard.net>

        * eval.c (vars_of_eval):
        Add a docstring for Vlog_warning_minimal_level, to avoid random C
        source ending up in DOC, and in preparation for erroring within
        make-docfile.el when an empty doc string is supplied for
        DEFVAR_LISP().

2025-10-19  Aidan Kehoe  <kehoea@parhasard.net>

        * doc.c (Fdocumentation):
        Check more carefully for a plausible dynamic docstring when
        examining a lambda, avoid error if (interactive) is the first
        element after the arglist.

2025-10-18  Aidan Kehoe  <kehoea@parhasard.net>

        * nt.c (qxevsnprintf):
        New. Implement vsnprintf() on Visual Studio .NET 2002 or newer.
        * nt.c (qxesnprintf):
        New. Implement snprintf() on Visual Studio .NET 2002 or newer.
        * s/windowsnt.h (HAVE_SNPRINTF): Always #define this on Windows.
        * s/windowsnt.h (HAVE_VSNPRINTF): Ditto.
        * syswindows.h:
        Error if on a version of Visual Studio older than Visual Studio
        .NET 2002.
        For versions older than Visual Studio 15, #define snprintf
        qxesnprintf , with the implementation in nt.c.

2025-10-18  Aidan Kehoe  <kehoea@parhasard.net>

        * buffer.c (Fgenerate_new_buffer_name):
        Update a comment here, GNU no longer allocate the Lisp string on
        the heap.
        * buffer.c (Fbuffer_file_name): Removed. Moved to buffer.el.
        * buffer.c (Fset_buffer_major_mode): Removed. Moved to buffer.el.
        * buffer.c (Fbuffer_char_byte_conversion_info): Correct the
        spelling of the C function name.
        * buffer.c (Fstring_char_byte_conversion_info): Ditto.
        * buffer.c (syms_of_buffer):
        Remove DEFSUBR() for Fbuffer_file_name(),
        Fset_buffer_major_mode(). Correct DEFSUBR() for
        F{buffer,string}_char_byte_conversion_info().

2025-10-13  Aidan Kehoe  <kehoea@parhasard.net>

        Move the lrecord stats metadata and the memusage_stats_list back
        in to struct lrecord_implementation, in preparation for
        implementing lrecord_implementations_table as a Dynarr.

        * alloc.c:
        Add an XD_LIST_OBJECT to the lrecord_implementation description
        for the memusage_stats_list field.
        * alloc.c (static const struct sized_memory_description
        lrecord_stats_metadata_description): Removed.
        * alloc.c (tick_lrecord_stats):
        Access the num_extra_memusage_stats field in the object's
        lrecord_implementation. In passing correct the type of it and the
        counter.
        * alloc.c (finish_object_memory_usage_stats):
        Access the stats metadata through the object's
        lrecord_implementation. In passing correct types.
        * alloc.c (Fobject_memory_usage):
        Access the stats metadata through the object's implementation.
        * alloc.c (lisp_object_memory_usage_full):
        Ditto.
        * alloc.c (compute_memusage_stats_length):
        Set the stats metadata in the object's implementation.
        * alloc.c (init_memory_usage_stats):
        staticpro() or staticpro_nodump() the memusage_stats_list slot as
        appropriate.
        * alloc.c (uninit_memory_usage_stats):
        unstaticpro_nodump() the memusage_stats_list slot.
        * alloc.c (undef_lisp_object):
        Call uninit_memory_usage_stats() before freeing the
        lrecord_implementation.
        * alloc.c (init_alloc_once_early):
        No further need to initialize Vmemusage_stats_list,
        lrecord_stats_metadata.
        * alloc.c (syms_of_alloc):
        No further need to fix up Vmemusage_stats_lists.
        * lrecord.h (struct lrecord_implementation):
        Restore the stats metadata to this structure as it had been
        previous to b33b343c1726 .

2025-10-13  Aidan Kehoe  <kehoea@parhasard.net>

        1. Dump Vrecent_keys_ring as a vector rather than as Qnil, 
        2. Remove recent_keys_ring_size, use XVECTOR_LENGTH
        (Vrecent_keys_ring) instead.
        3. Remove reinit_vars_of_event_stream(), can be delegated to the C
        implementation.

        * commands.h:
        Remove mention of recent_keys_ring, recent_keys_ring_index from
        here.
        * emacs.c (main_1):
        Remove call to reinit_vars_of_event_stream().
        * event-stream.c:
        Remove mention of recent_keys_ring_size.
        * event-stream.c (Frecent_keys):
        Update some types here. Call XVECTOR_LENGTH (Vrecent_keys_ring)
        rather than referencing recent_keys_ring_size.
        * event-stream.c (Frecent_keys_ring_size):
        Return Flength (Vrecent_keys_ring) here.
        * event-stream.c (Fset_recent_keys_ring_size):
        Update some types here. Call XVECTOR_LENGTH (Vrecent_keys_ring)
        rather than referencing recent_keys_ring_size.
        * event-stream.c (push_recent_keys):
        No longer check Vrecent_keys_index against Qnil. Call
        XVECTOR_LENGTH (Vrecent_keys_ring) rather than referencing
        recent_keys_ring_size.
        * event-stream.c (reinit_vars_of_event_stream): Removed.
        * event-stream.c (vars_of_event_stream): Initialize
        Vrecent_keys_ring as a vector. Move the initialization for
        Vkeyboard_translate_table beside its DEFVAR_LISP() in
        passing. Correct indentation for
        Vretry_undefined_key_binding_unshifted in passing.
        * events.c (Fdeallocate_event):
        Remove some code long enclosed in #if 0 that referenced
        Vrecent_keys_ring.
        * symsinit.h:
        Remove declaration for reinit_vars_of_event_stream().

2025-10-12  Aidan Kehoe  <kehoea@parhasard.net>

        Remove blocktype.c, blocktype.h, no longer used and superseded by
        lcrecord-lists, which have less startup overhead and can share the
        resource of free objects among different types.

        * Makefile.in.in (objs): Remove blocktype.o from here.
        * alloc.c: Remove mention of the Blocktype class.
        * blocktype.c: File removed, superseded by lcrecord_lists.
        * blocktype.h: File removed. Ditto.
        * depend (event-gtk.o): Remove mention of blocktype.h
        * depend (buffer.o): Ditto
        * depend (blocktype.o): Removed.
        * depend (event-Xt.o): Remove mention of blocktype.h
        * depend (glyphs.o): Ditto.
        * emacs.c: Remove mention of blocktype.c
        * emacs.c (main_1): Remove mention of the Blocktype_* functions.
        * event-Xt.c:
        Remove an #include for "blocktype.h".
        * event-gtk.c: Ditto.
        * event-stream.c: Ditto.
        * glyphs.c: Ditto.

2025-10-12  Aidan Kehoe  <kehoea@parhasard.net>

        Use an lcrecord_list for memory management of struct
        low_level_timeout, rather than Blocktype. To this end, give it an
        implementation as a Lisp_Object.
        
        * .gdbinit.in.in:
        Make gdb(1) aware of lrecord_type_low_level_timeout.
        * alloc.c:
        Make free_description and lcrecord_list_description static in
        passing.
        * event-stream.c:
        Remove the Blocktype_declare() for struct low_level_timeout. Add a
        memory_description for it.
        * event-stream.c (add_low_level_timeout): Revise this to take a
        pointer to a Lisp_Object and to allocate the new struct
        low_level_timeout using ALLOC_C_READONLY_LISP_OBJECT().
        * event-stream.c (remove_low_level_timeout):
        Revise this to take a pointer to a Lisp_Object and to free the
        structure using free_normal_lisp_object().
        * event-stream.c (get_low_level_timeout_interval):
        Take a Lisp_Object as the timeout_list, handle nonexistent values
        as Qnil rather than NULL.
        * event-stream.c (pop_low_level_timeout):
        Take the timeout list as a pointer to a Lisp_Object. Free the
        structure using free_normal_lisp_object().
        * event-stream.c (syms_of_event_stream):
        Call DEFINE_NODUMP_INTERNAL_LISP_OBJECT() for the
        low-level-timeout object.
        * event-stream.c (reinit_vars_of_event_stream):
        No further need for Blocktype_new() for low_level_timeout.
        * event-tty.c:
        Declare tty_timer_queue as Lisp_Object Vtty_timer_queue.
        * event-tty.c (emacs_tty_add_timeout):
        Use the new name for Vtty_timer_queue in calling
        add_low_level_timeout().
        * event-tty.c (emacs_tty_remove_timeout):
        Use the new name for Vtty_timer_queue in calling
        remove_low_level_timeout().
        * event-tty.c (tty_timeout_to_emacs_event):
        Use the new name for Vtty_timer_queue in calling
        pop_low_level_timeout().
        * event-tty.c (emacs_tty_event_pending_p):
        Access the fields of Vtty_timer_queue as a Lisp_Object.
        * event-tty.c (emacs_tty_next_event):
        Use the new name for Vtty_timer_queue in calling
        get_low_level_timeout_interval().
        * event-tty.c (vars_of_event_tty):
        Initialize Vtty_timer_queue as Qnil. Make the dumper (but not the
        GC) aware of it.
        * events.h (struct low_level_timeout):
        Add a header to this structure. Add a DECLARE_LISP_OBJECT() for it
        and the other boilerplate to declare a Lisp object.
        * lrecord.h (enum lrecord_type):
        Add an entry for lrecord_type_low_level_timeout.
        * signal.c:
        Rename async_timer_queue to Vasync_timer_queue.
        * signal.c (reset_interval_timer):
        Use the new name.
        * signal.c (handle_async_timeout_signal):
        Use the new name.
        * signal.c (signal_add_async_interval_timeout):
        Use the new name. Check for whether the new element was added at
        the front of the queue in a slightly different way.
        * signal.c (signal_remove_async_interval_timeout):
        Ditto.
        * signal.c (syms_of_signal):
        Initialize Vasync_timer_queue to Qnil. Make the dumper but not the
        garbage collector aware of it.

2025-10-12  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (gc_sweep_1):
        Fix a bug in 3a506e980127 with ERROR_CHECK_GC builds; for some
        very unintuitive reason the FREE field of an lcrecord_list is
        traversed in GC and each element is marked. It thus needs to be
        unmarked at the end of GC. This no longer happens as part of
        sweep_lcrecords_1() given they are now in the dump file.        

2025-10-10  Aidan Kehoe  <kehoea@parhasard.net>

        * emacs.c (main_1):
        Remove calls to init_free_hook (), syms_of_free_hook (), long
        obsolete.
        * symsinit.h:
        Remove their declarations.

2025-10-08  Aidan Kehoe  <kehoea@parhasard.net>

        * select-msw.c (init_select_mswindows): Removed, its contents
        replaced by a staticpro_dump_nil() on &Vhandle_alist.
        * select-msw.c (vars_of_select_mswindows):
        Update this appropriately.
        * emacs.c (main_1):
        No further need to call init_select_mswindows(), remove this.
        * symsinit.h: Remove its declaration.

2025-10-06  Aidan Kehoe  <kehoea@parhasard.net>

        * buffer.c (switch_to_buffer):
        Remove this, it is just a wrapper around calling
        Qswitch_to_buffer, and it is only used in two places, more
        maintainable to just call2(Qswitch_to_buffer ...) explicitly.
        * buffer.c (Fbury_buffer):
        Replace it with its implementation.
        * editfns.c (save_excursion_restore):
        Ditto.
        * lisp.h:
        Remove its declaration. Declare Qswitch_to_buffer so editfns.c can
        see it.

2025-10-06  Aidan Kehoe  <kehoea@parhasard.net>

        * regex.c:
        Add some entries to the TODO list here.

2025-10-06  Aidan Kehoe  <kehoea@parhasard.net>

        * dump-data.c (RAWBYTE):
        Changeset 4d19d169daff of 2025-10-04 fixed the clang++ build on
        macOS Sequoia but broke the g++ build. Adjust this to work with
        both by means of a preprocessor conditional.

2025-10-06  Aidan Kehoe  <kehoea@parhasard.net>

        1. Unify those lcrecord_lists that deal with objects of the same
        size. To this end, remove the IMPLEMENTATION field from the
        object, pass the IMPLEMENTATION explicitly to calls to
        alloc_managed_lcrecord(). Store a list of known lcrecord_lists
        sorted by the SIZE field, and examine that when obtaining a new
        lcrecord_list.
        2. Move the lcrecord_list for auto-managed objects to struct
        lrecord_implementation, avoiding the need to separately dump,
        allocate them. Add a corresponding entry to struct
        lrecord_implementation_description_1.
        3. Remove some buggy, unused functions.

        * alloc.c:
        * alloc.c (old_alloc_lcrecord): Remove this, not used, equivalent
        to old_alloc_size_lcrecord (implementation->static_size,
        implementation).
        * alloc.c (lcrecord_list_description): Remove dump information for
        the pointer to the struct lrecord_implementation, now gone.
        * alloc.c (disksave_lcrecord_list): Fill out a comment here.
        * alloc.c (make_lcrecord_list): Make this static, only called from
        get_lcrecord_list(), which is now preferred for our callers.
        * alloc.c (alloc_managed_lcrecord_1): Take the struct
        lrecord_implementation as an argument, now that is no longer
        stored in the lcrecord_list.
        * alloc.c (alloc_managed_lcrecord): Ditto.
        * alloc.c (Vall_lcrecord_lists): New variable, a list of
        lcrecord_lists in ascending order of their SIZE fields.
        * alloc.c (compare_lcrecords): New.
        Used for sorting the list of created lcrecord_lists early in
        bootstrap.
        * alloc.c (find_lcrecord_list): New. Examine Vall_lcrecord_lists
        for an lcrecord_list of a given SIZE. If MAKE_ONEP, create and
        return a new entry if it doesn't exist.
        * alloc.c (get_lcrecord_list): New. Call find_lcrecord_list() with
        its MAKE_ONEP argument.
        * alloc.c (alloc_automanaged_sized_lcrecord): Removed, not
        currently used and not working, since automanaged lcrecords must
        always be of the same size.
        * alloc.c (alloc_automanaged_lcrecord): Pass imp->lcrecord_list to
        alloc_managed_lcrecord_1().
        * alloc.c (alloc_automanaged_c_readonly_lcrecord): Ditto.
        * alloc.c (old_free_lcrecord): Make this static. Pass
        imp->lcrecord_list to free_managed_lcrecord().
        * alloc.c (define_lisp_object):
        Create the object's lcrecord_list if it will be needed.
        Fix existing lcrecord_lists when bootstrapping, once Qnil is
        available.
        * alloc.c (init_alloc_once_early):
        No longer add all_lcrecord_lists as a root block.
        Move the DEFINE_NODUMP_INTERNAL_LISP_OBJECT() for free Lisp
        objects after the corresponding call for lcrecord lists.
        * alloc.c (vars_of_alloc):
        Call staticpro() on &Vall_lcrecord_lists.
        * emacs.c (main_1):
        Update a comment here.
        * lrecord.h (ALLOC_C_READONLY_LISP_OBJECT):
        Update this to reflect alloc_automanaged_c_readonly_lcrecord()'s
        new calling convention.
        * lrecord.h (struct lrecord_implementation):
        Add an entry for an object's lcrecord_list to this structure.
        * lrecord.h (struct lcrecord_list):
        Remove the pointer to a struct lrecord_implementation from this
        structure.
        Remove declarations for old_alloc_lcrecord(),
        make_lcrecord_list(), alloc_automanaged_sized_lcrecord(),
        old_alloc_lcrecord_type(), no longer available.
        Add a declaration for get_lcrecord_list().
        Update declarations for alloc_managed_lcrecord(),
        alloc_automanaged_c_readonly_lcrecord().
        * lstream.c (Lstream_new):
        Call alloc_managed_lcrecord() with its new calling convention.
        * lstream.h (DEFINE_LSTREAM_IMPLEMENTATION_WITH_DATA):
        Change call to make_lcrecord_list() to get_lcrecord_list(). No
        longer a need to staticpro() it, it will be reachable via
        Vall_lcrecord_lists.
        * lstream.h (DEFINE_LSTREAM_IMPLEMENTATION):
        Ditto.

2025-09-06  Aidan Kehoe  <kehoea@parhasard.net>

        Add a disksave method to lcrecord_list objects, that sets the
        chain of free objects to Qnil. Dump them, simplifying startup.

        * alloc.c (lcrecord_list_description): Add an entry for the
        pointer to the lrecord_implementation to this struct
        memory_description.

        * alloc.c (disksave_lcrecord_list): New method, set an
        lcrecord_list's free object chain to Qnil.
        * alloc.c (all_lcrecord_lists): Put this in the data segment, add
        a struct memory_description for it.

        * alloc.c (reinit_alloc_early):
        No need to reinit all_lcrecord_lists now it is dumped.
        * alloc.c (init_alloc_once_early):
        Call staticpro() on its elements now it is dumped as-is.
        Add a root block for it.
        No need for Vall_lcrecord_lists now.
        * alloc.c (syms_of_alloc):
        Define lcrecord_list as a dumpable internal Lisp object.
        * emacs.c (Fdump_emacs):
        Garbage collect before the object finalization, otherwise the two
        interact poorly.
        * lstream.h:
        * lstream.h (lstream_implementation):
        Move the lstream implementation's lcrecord_list to the structure
        itself.
        * lstream.h (DEFINE_LSTREAM_IMPLEMENTATION_WITH_DATA):
        * lstream.h (DEFINE_LSTREAM_IMPLEMENTATION):
        Initialize and staticpro() the lcrecord list in these macros. Use
        the implementation of aligned_sizeof_lstream() for this.

        * lstream.c (struct lstream_implementation_description): Add an
        entry to this reflecting the lstream implementation's
        lcrecord_list.
        * lstream.c (lstream_types): Removed, no longer needed.
        * lstream.c (Vlstream_free_list): Removed, no longer needed.    
        * lstream.c (lstream_type_count): Removed, no longer needed.    
        
        * lstream.c (sizeof_lstream): Return the pre-calculated size from
        the implementation's lcrecord_list.
        * lstream.c (Lstream_new): Greatly simplify this now the
        lcrecord_list is in the struct lstream_implementation.
        * lstream.c (Lstream_delete):
        Ditto.
        * lstream.c (syms_of_lstream):
        Remove initialization of Vlstream_free_list, no longer needed.

2025-10-06  Aidan Kehoe  <kehoea@parhasard.net>

        Add a type-specific print method to lcrecord_list, easing
        investigation of how many are created, what size they are, and how
        many elements in each.
        * alloc.c (print_lcrecord_list): New.
        * alloc.c (init_alloc_once_early): Use it.

2025-10-04  Aidan Kehoe  <kehoea@parhasard.net>

        * xemacs.def.in.in:
        Remove defsubr_macro() from this, omitted in 4c46ae36bc9d, fix the
        Cygwin build.

2025-10-04  Aidan Kehoe  <kehoea@parhasard.net>

        * dump-data.c:
        Declare DUMPED_DATA as CRawbyte (so char), allowing it to build
        with Apple's clang++ 17 as is currently shipped with macOS Sequoia.

2025-10-02  Aidan Kehoe  <kehoea@parhasard.net>

        Now NEWGC is gone, there is no barrier to dumping bignums. Do
        that, simplify startup.

        * emacs.c (main_1):
        Move the call to init_number() before pdump_load(), so dumped
        bignums can be restored.
        * number-openssl.c:
        * number-openssl.c (init_number_openssl):
        Explicitly call fatal() if BN_CTX_new() and friends fail, don't
        abstract with HANDLE_OP_ERROR() since this requires Lisp
        infrastructure not available at this point.
        * number.c:
        No further need for NUMBER_INITIALIZED.
        * number.c (syms_of_number):
        Bigfloats cannot currently be dumped, correct their
        DEFINE.*LISP_OBJECT().
        * number.c (vars_of_number):
        Initialize bigfloat-maximum-precision with a bignum as was always
        the intention.
        * number.c (init_number):
        Remove check for NUMBER_INITIALIZED.
        * number.c (reinit_vars_of_number): Removed, no further need for
        this.

2025-09-27  Aidan Kehoe  <kehoea@parhasard.net>

        Move the type-specific specifier predicates to Lisp.

        * fontcolor.c (Ffont_specifier_p): Moved to fontcolor.el.
        * fontcolor.c (Fcolor_specifier_p): Ditto.
        * fontcolor.c (Fface_boolean_specifier_p): Ditto.
        * fontcolor.c (Fface_background_placement_specifier_p): Ditto.
        * fontcolor.c (syms_of_fontcolor): Remove their DEFSUBR()s.
        * fontcolor.c (specifier_type_create_fontcolor): Correct some
        indentation in passing.
        * glyphs.c (Fimage_specifier_p): Moved to glyphs.el.
        * glyphs.c (syms_of_glyphs):
        Remove its DEFSUBR().
        * gutter.c (Fgutter_specifier_p): Moved to gutter.el.
        * gutter.c (Fgutter_size_specifier_p): Ditto.
        * gutter.c (Fgutter_visible_specifier_p): Ditto.
        * gutter.c (syms_of_gutter):
        Remove their DEFSUBR()s.
        * specifier.c (Finteger_specifier_p): Moved to specifier.el.
        * specifier.c (Fboolean_specifier_p): Ditto.
        * specifier.c (Fnatnum_specifier_p): Ditto.
        * specifier.c (Fgeneric_specifier_p): Ditto.
        * specifier.c (Fdisplay_table_specifier_p): Ditto.
        * specifier.c (syms_of_specifier):
        Remove their DEFSUBR()s.

2025-09-25  Aidan Kehoe  <kehoea@parhasard.net>

        * chartab.c (Fchar_table_p): Moved to misc.el.
        * chartab.c (syms_of_chartab):
        Remove its DEFSUBR().
        * fontcolor.c (Fcolor_instance_p): Moved to fontcolor.el.
        * fontcolor.c (Ffont_instance_p): Ditto.
        * fontcolor.c (syms_of_fontcolor):
        Remove their DEFSUBR()s.
        * process.c (Fprocessp): Moved to process.el.
        * process.c (syms_of_process): Remove its DEFSUBR().
        * rangetab.c (Frange_table_p): Moved to misc.el.        
        * rangetab.c (syms_of_rangetab):
        Remove its DEFSUBR().

2025-09-25  Aidan Kehoe  <kehoea@parhasard.net>

        Make color instances and font instances dumpable. Dump
        Vthe_null_font_instance, Vthe_null_color_instance, remove the need
        for reinit_vars_of_fontcolor().
        Yes, no other color instance or font instance should be dumped;
        this is fine, dumping them will fail because their DEVICE fields
        will be non-nil.
        * emacs.c (main_1):
        Remove call to reinit_vars_of_fontcolor().
        * fontcolor.c:
        * fontcolor.c (syms_of_fontcolor):
        Call DEFINE_DUMPABLE_LISP_OBJECT() for font, color instances.
        * fontcolor.c (vars_of_fontcolor):
        Move the functionality of reinit_vars_of_fontcolor to dump time.
        * symsinit.h:
        Remove declaration for reinit_vars_of_fontcolor().

2025-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * symbols.c (defsubr): 
        Move the sanity-check for duplicate syms_of_FILE() calls after SYM
        has been initialized, fix the builds.

2025-09-22  Aidan Kehoe  <kehoea@parhasard.net>

        Remove DEFSUBR_MACRO(), simplify C implementation of subrs.

        * symeval.h (DEFSUBR_MACRO): Removed.
        * symeval.h (DEFSUBR): Revised, no need to pass a MACROP argument
        to the defsubr_##Fname function.
        * symbols.c (defsubr_macro): Removed.
        * symbols.c (defsubr): Revised, no longer any need for
        defsubr_1(). .
        * eval.c:
        * eval.c (Fwhen): Moved to subr.el.
        * eval.c (Funless): Moved to subr.el.
        * eval.c (syms_of_eval): Remove the DEFSUBR_MACRO() for both
        macros.
        * lisp.h (DEFUN):
        Simplify the defsubr_##Fname definition, now there is no longer a
        need to handle a possible macro.
        * lisp.h (DEFUN_NORETURN):
        Ditto.

2025-09-19  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecode-ops.h:
        New opcodes for #'puthash, #'gethash
        * bytecode.c:
        #include "elhash.h" here for the sake of them.
        * bytecode.c (execute_rare_opcode): Implement them.
        * elhash.c:
        Update some comments in this file.

2025-09-08  Aidan Kehoe  <kehoea@parhasard.net>

        Remove #'old-eq, #'old-memq, #'old-equal, #'old-assq,
        #'old-member, #'old-assoc, #'old-rassq, #'old-rassoc,
        #'old-delete, #'old-delq. Remove the associated bytecode, obsolete
        since XEmacs v19. Remove read-time transformation of bytecode that
        attempted to maintain compatibility.

        * bytecode-ops.h (OPCODE):
        Remove old_eq, old_memq, old_equal, old_member, old_assq here.
        * bytecode.c:
        Remove code to implement them.
        * bytecode.h (struct Lisp_Compiled_Function):
        Remove the EBOLIFIED flag from the Lisp_Compiled_Function object.
        * config.h.in:
        Remove the SUPPORT_CONFOUNDING_FUNCTIONS #define.
        * data.c (decode_weak_list_type):
        No longer accept Qold_assoc as a weak list type.
        * data.c (vars_of_data):
        Update the docstring for debug-issue-ebola-notices.

        * fns.c:
        * fns.c (plists_differ):
        Remove some comments no longer relevant.
        * fns.c: Remove Fold_eq and friends.
        * fns.c (syms_of_fns):
        Remove their DEFSUBR()s.
        * lisp.h:
        * lisp.h (HACKEQ_UNSAFE): Remove, no longer needed.
        * lisp.h (debug_issue_ebola_notices): Modernize the type of this.
        * lisp.h (ebolify_bytecode_constants): Remove declaration, no
        longer needed.

        * lread.c (ebolify_bytecode_constants): Remove its definition, no
        longer needed.
        * lread.c (load_force_doc_string_unwind): No longer call it.
        New behaviour; error early if old byte code version is encountered.
        * lread.c (Fload_internal):
        * lread.c (read_compiled_function):
        Remove call to ebolify_bytecode_constants(), remove setting of
        relevant flag within the Lisp_Compiled_Function.
        * sequence.c (rassq_no_quit): Update a comment here.
        * sequence.c (delq_no_quit): Ditto.

2025-09-04  Aidan Kehoe  <kehoea@parhasard.net>

        debug.c, debug.h attempted to offer assertions that could be
        toggled (in theory at startup).

        Nothing in debug.c or debug.h is actually used, and it is not
        available on non-DEBUG_XEMACS builds, so we know the packages can
        handle it. Remove it, we have extensive compile-time assertions
        that work well.

        * Makefile.in.in (debug_objs): Remove debug.o from this.
        * debug.c: File removed.
        * debug.h: File removed.
        * depend: Regenerate.
        * emacs.c:
        * emacs.c (main_1):
        Remove calls to syms_of_debug(), vars_of_debug(),
        reinit_vars_of_debug(). 
        * emacs.c (complex_vars_of_emacs): Provide the debug-xemacs
        feature here, now debug.c is gone.
        * extents.c:
        No longer #include "debug.h"
        * redisplay-msw.c:
        Ditto.
        * redisplay-xlike-inc.c: Ditto.
        * redisplay.c: Ditto.
        * redisplay.h:
        Remove three DASSERT types from here.
        * symsinit.h:
        Remove declarations for syms_of_debug(), vars_of_debug(),
        reinit_vars_of_debug().

2025-09-03  Aidan Kehoe  <kehoea@parhasard.net>

        Inline calls to internal_equal(), internal_equalp() within
        find_htentry().
        * elhash.c:
        Update and correct the long comment that opens this file. Correct
        the indentation of hash_table_test_description.
        * elhash.c (find_htentry):
        Just call LISP_HASH() directly if TEST is Veq_hash_table_test.
        Mark HTTP as const, since we don't modify it and that gives a tiny
        speed-up with GCC-15 -O6.
        Inline calls to internal_equal(), internal_equalp() if TEST is the
        corresponding object.
        Check immediately for EQ (probe->key, key) with both these (the
        function would do it anyway, and picks up the common case of the
        same object being looked up in the hash table twice.
        * elhash.c (Fdefine_hash_table_test):
        Document in the docstring that the underlying hash table
        implementation will not call EQUAL-FUNCTION if the encountered key
        is EQ() to the encountered entry in the hash table and that this
        is also true of GNU's implementation.
        * lisp.h:
        Declare lisp_eval_depth, max_lisp_eval_depth here, now they are
        needed by elhash.c
        * profile.c:
        * sequence.c:
        Remove their extern declarations from both these files.

2025-09-01  Aidan Kehoe  <kehoea@parhasard.net>

        * dump-data.c:
        Revert f38cf80e1163 of 2025-08-29, underlying problem was with
        ccache, not with GCC, and so that change will not address the
        issue if clang(1) is used. Thank you for the further
        investigation, Mats Lidell.

2025-08-31  Aidan Kehoe  <kehoea@parhasard.net>

        * alloc.c (alloc_managed_lcrecord_1):
        No longer a need to check list->free against Qnull_pointer, remove
        this.
        * alloc.c (define_lisp_object):
        When we are at the point where Qnil is available (that is, we can
        intern symbols), as well as initializing the symbol names of the
        types created so far, correct the FREE field of any LCRECORD_LISTs
        for those objects previously defined, so
        alloc_managed_lcrecord_1() no longer has to check against
        Qnull_pointer.

2025-08-31  Aidan Kehoe  <kehoea@parhasard.net>

        * emacs.c (main_1):
        Remove a duplicate call to vars_of_file_coding() here.
        * symbols.c (defsubr):
        * symbols.c (defvar_magic):
        Add a couple of structure_checking_assert()s in these functions
        with a view to avoiding such duplicates going forward.

2025-08-29  Aidan Kehoe  <kehoea@parhasard.net>

        Remove the need for reinit_vars_of_lstream(), use
        dump_mark_nil_lisp_object() on all the entries in
        Vlstream_free_list.

        * emacs.c (main_1):
        Remove call to reinit_vars_of_lstream().
        * lstream.c:
        Remove the lstream_free_list variable, access the entries in the
        vector by means of XVECTOR_DATA() instead.
        * lstream.c (Lstream_new):
        Access the entries in the vector by means of XVECTOR_DATA().
        * lstream.c (Lstream_delete):
        Ditto.
        * lstream.c (syms_of_lstream):
        Initialize Vlstream_free_list here, since it is needed as soon as
        any streams are created.
        Mark all its entries with dump_mark_nil_lisp_object().
        * lstream.c (vars_of_lstream):
        This is now empty, but retained, since no run-time penalty.
        * lstream.c (reinit_vars_of_lstream): Removed.
        * symsinit.h: Remove its declaration.

2025-08-29  Aidan Kehoe  <kehoea@parhasard.net>

        * dump-data.c:
        Leonid Kopylov reports in https://bugs.gentoo.org/959756 that his
        build fails with GCC 15 (Gentoo 15.1.1_p20250705-r1 p2).
        The error message (after 62e4009b67e3 was merged) was "dump data
        too small". When he adjusts dump-data.c to use INCBIN() instead of
        #embed the build progresses without problems.
        Change the conditional for use of #embed to avoid it if we have
        GCC 15 or later. Thank you Leonid, thank you Mats!

2025-08-26  Aidan Kehoe  <kehoea@parhasard.net>

        Follow a suggestion from GNU at the top of their regex-emacs.c to
        remove on_failure_jump_smart; this is practical, regex_compile()
        up to today never produced on_failure_jump_loop and so if we
        modify it to produce on_failure_jump_loop instead of
        on_failure_jump_smart, and do the optimization on
        on_failure_jump_loop, that removes the need for
        on_failure_jump_smart completely.

        * regex.c:
        * regex.c (enum):
        Remove it from the enum.
        * regex.c (print_partial_compiled_pattern):
        No longer any need to print it.
        * regex.c (optimize_on_failure_jump):
        Update a comment documenting the function.
        Work on on_failure_jump_loop instead of on_failure_jump_smart.
        * regex.c (regex_compile):
        Produce on_failure_jump_loop instead of on_failure_jump_smart.
        * regex.c (re_compile_fastmap):
        Remove handling of on_failure_jump_smart.
        * regex.c (re_match_2_internal):
        Ditto.

2025-08-25  Aidan Kehoe  <kehoea@parhasard.net>

        Call fatal() from within pdump_load() and friends, giving clearer
        errors on failed startup rather than the confusing "temacs can
        only be run in -batch mode".
        Respect inhibit_configured_paths within pdump_file_try() as was
        the intention but as did not actually work before, by examining its
        corresponding command line argument before pdump_load().

        * dumper.c (pdump_load_check): New argument, DIEP, indicating to
        call fatal() with a clear error message if pdump_load_check()
        fails.
        * dumper.c (pdump_resource_get):
        Unconditionally call fatal() with clear error messages if the
        various steps within the WIN32_NATIVE version of this fail.
        Call fatal() if the size of the dump data is too small within the
        non-WIN32_NATIVE version of this.
        * dumper.c (pdump_file_get): New argument, DIEP, indicating to
        call fatal() with a clear error message when pdump_file_get()
        fails.
        * dumper.c (pdump_file_try): New argument, DIEP, same
        motivation. Pass the value of INHIBIT_CONFIGURED_PATHS down to
        pdump_file_get() for the first path we examine for the dump file,
        and pass an unconditional 1 down for the second path.
        * dumper.c (pdump_load):
        Call pdump_load_check(), pdump_file_try() with their new args.
        * emacs.c (main_1):
        Examine for -no-configured-paths before pdump_load(), so it can
        respect it.
        * emacs.c (standard_args):
        Increase the priority of -no-configured-paths now it needs to be
        examined earlier.

2025-08-25  Aidan Kehoe  <kehoea@parhasard.net>

        * doprnt.c (emacs_vsnprintf):
        Use #ifdef HAVE_VSNPRINTF for the fallback call, fix the Windows
        build.

2025-08-25  Aidan Kehoe  <kehoea@parhasard.net>

        * doprnt.c (stderr_out):
        Call write_string_to_external_output_va(.. EXT_PRINT_STDERR) if
        Qexternal_debugging_output is EQ to Qnull_pointer, which is a sign
        we are very early and likely being called by fatal().
        * doprnt.c (stdout_out):
        Add a comment documenting that I am not making the same change to
        this function; if it becomes relevant the corresponding call to
        stdout_out() should likely be changed to stderr_out().
        * doprnt.c (emacs_vsnprintf):
        Check that the lstream fixed buffer type is available before
        attempting to use it. If it is not (which suggests we are very
        early), fall back to vsnprintf().
        * emacs.c (main_1):
        Move the clause that calls reinit_alloc_early(),
        reinit_vars_of_lstream() earlier, since the printing
        infrastructure is needed by check_compatible_window_system().
        Update some comments.

        Move syms_of_lstream(), syms_of_print() earlier reducing recursive
        crashes when problems are encountered at startup.
        * lisp.h:
        Move enum ext_print and a declaration for write_string_to_external_output_va()
        * lstream.c:
        * lstream.c (syms_of_lstream):
        Move initialization of Vdump_time_lstream_free_list here allowing
        earlier printing at startup.
        Move the DEFINE_LSTREAM_IMPLEMENTATION() calls here too, with the
        same motivation.
        Move DEFSYMBOL(), DEFSUBR() calls to this function as should
        always have been the case.
        * lstream.c (vars_of_lstream):
        This is now much shorter, most of it moved to syms_of_lstream().
        * print.c: Move the enum ext_print enum to lisp.h
        * print.c (write_string_to_external_output_va): Make this
        non-static, now it is called by stderr_out() from doprnt.c.

2025-08-25  Aidan Kehoe  <kehoea@parhasard.net>

        * device-x.c (x_init_device):
        If XOpenDisplay() fails and there is an explicit zero screen
        number supplied, retry without that screen number, all going well
        addressing problems with XQuartz and launchd sockets.

2025-08-25  Aidan Kehoe  <kehoea@parhasard.net>

        Supplying a -display arg hasn't worked on X11 since e34711681f30,
        fix that. Remove Vx_initial_argv_list, move the DEFVAR of
        Vcommand_line_args_left to C instead.

        * console-gtk.h: Remove deprecation of Vgtk_initial_argv_list.
        * device-gtk.c:
        * device-gtk.c (vars_of_device_gtk):
        There is no good alternative to Vgtk_initial_argv_list,
        Vgtk_initial_geometry, given GTK errors with command line args
        that it doesn't understand and that we need to communicate the
        -geometry arg to C somehow. Remove deprecation from these
        docstrings.

        * console-x.h:
        Remove declaration for Vx_initial_argv_list.
        * console-x.c (get_display_arg_connection):
        Examine Vcommand_line_args for a -display arg, no longer
        appropriate to deal with Vx_initial_argv_list, which has not been
        adjusted before creating an X11 device since e34711681f30 of 2008,
        and should not be adjusted before opening an X11 device

        * device-x.c:
        Remove definition for Vx_initial_argv_list.
        * device-x.c (x_init_device):
        Deal with Vcommand_line_args_left rather than Vx_initial_argv_list
        in this function.
        * device-x.c (vars_of_device_x):
        Remove DEFVAR() for x-initial-argv-list.
        * emacs.c:
        Modernize type for DISPLAY_ARG. Correct its docstring.
        Clarify a comment documenting DISPLAY_USE.
        * emacs.c (vars_of_emacs):
        DEFVAR (Vcommand_line_args_left) here, rather than in startup.el,
        since it is now manipulated directly from the X11 C code.
        Mark Vcommand_line_args with dump_mark_nil_lisp_object().
        * lisp.h:
        Remove declaration of Vx_initial_argv_list.
        * redisplay.h:
        Modernize type for declaration of DISPLAY_ARG. Update comments for
        it and for DISPLAY_USE.

2025-08-14  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecode.c (Bvarref):
        Check whether XSYMBOL (symbol)->value is SYMBOL_VALUE_MAGIC or
        OPAQUE here, avoid silent escape of Qunbound to Lisp in
        byte-compiled code.
        * lrecord.h (enum lrecord_type):
        Move lrecord_type_opaque beside the symbol_value_magic values,
        allowing cheap checking for symbol values that need to be
        processed specially in bytecode.c.
        * symbols.c:
        * symbols.c (Fsymbol_value):
        Assert that we have not been handed a non-Qunbound opaque value.
        * symeval.h:
        * symeval.h (SYMBOL_VALUE_MAGIC_OR_OPAQUEP): New macro, used in
        bytecode.c.

2025-08-13  Aidan Kehoe  <kehoea@parhasard.net>

        * emacs.c (Frun_emacs_from_temacs):
        Set backtrace_list to NULL in this function, similar reasoning to
        setting catchlist to NULL and to reinitializing the GCPRO list,
        fix buildbot issues of last commit.

2025-08-12  Aidan Kehoe  <kehoea@parhasard.net>

        Add dump_mark_zero_boolint(), for those Boolint variables
        reachable from the dump file that would otherwise have undesired,
        dump-time, values post-pdump_load().

        * alloc.c:
        * alloc.c (disksave_object_finalization):
        Remove a duplicate call to Fclrhash (Vfont_signature_data) in
        passing.
        Remove call to zero_out_command_line_status_vars().
        * alloc.c (vars_of_alloc):
        Mark purify_flag using dump_mark_zero_boolint().
        * dumper.c:
        * dumper.c (Boolint_ptr_dynarr): New type.
        * dumper.c (pdump_zero_boolints): New type.     
        * dumper.c (dump_mark_zero_boolint): Function using it.

        * dumper.c (save_pdump_zero_boolints): Save the current Boolint
        values for entries in pdump_zero_boolints in a bit vector; set
        them all to zero, and return the bit vector.
        * dumper.c (restore_pdump_zero_boolints): Inverse version of the
        last function.

        * dumper.c (pdump):
        Call save_pdump_zero_boolints() and pass its result to an
        unwind-protect, to call restore_pdump_zero_boolints on exit from
        the unwind-protect.

        * emacs.c (main_1):
        Remove call to init_eval_semi_early(), no longer needed.

        * emacs.c (Fdump_emacs):
        Don't store PURIFY_FLAG in this function, leave that to
        dump_mark_zero_boolint().
        Explicitly set inhibit_set_lisp, inhibit_site_modules to 1 in this
        function if the corresponding #defines are set, forcing them to 1
        for the dump file. No dump_one_boolint() and this is the only
        context that might need it.

        * emacs.c (zero_out_command_line_status_vars):
        Removed. Functionality subsumed by dump_mark_zero_boolint().
        
        * emacs.c (vars_of_emacs):
        Call dump_mark_zero_boolint() on &noninteractive1,
        &vanilla_inhibiting, &inhibit_all_packages, &inhibit_autoloads,
        &inhibit_site_lisp, &inhibit_site_modules.
        * eval.c:
        * eval.c (static int first_desired_multiple_value):.
        * eval.c (int multiple_value_current_limit):
        These can both be initialize with their definitions, in the C data
        segment, not necessary to set them in init_eval_semi_early().
        * eval.c (init_eval_semi_early): Remove this, move the assignment
        of specpdl to specpdl_ptr to reinit_vars_of_eval(), rest of it can
        be moved to dump_mark_zero_boolint() calls or the C data segment.
        * eval.c (reinit_vars_of_eval): Initialize specpdl_ptr here.
        * eval.c (vars_of_eval): Use dump_mark_nil_lisp_object() on
        Vquit_flag, dump_mark_zero_boolint() on &debug_on_next_call,
        staticpro_dump_nil() on Vcondition_handlers.
        * lisp.h:
        Remove the declaration for zero_out_command_line_status_vars().
        * lread.c:
        * lread.c (init_lread):
        Remove assignment of load_in_progress to zero, use
        dump_mark_zero_boolint().
        * lread.c (vars_of_lread):
        Call it here. Also call it on &load_always_display_messages;
        * lrecord.h:
        Declare, document dump_mark_zero_boolint() in this header.

2025-08-06  Aidan Kehoe  <kehoea@parhasard.net>

        Rename dump_add_nil_lisp_object_1() to
        dump_mark_nil_lisp_object().

        Remove dump_add_nil_lisp_object(), it usually duplicates a dump
        root needlessly. Most of its uses were better served by
        dump_mark_nil_lisp_object().

        * alloc.c (staticpro_dump_nil):
        Call dump_mark_nil_lisp_object() here.
        * alloc.c (disksave_object_finalization):
        Update a comment. 
        * console-stream.c (vars_of_console_stream):
        Call dump_mark_nil_lisp_object() here.
        * dumper.c (dump_mark_nil_lisp_object): Update the name of
        dump_add_nil_lisp_object_1() here.
        * dumper.c (dump_add_nil_lisp_object): Remove this.

        * emacs.c (complex_vars_of_emacs):
        Call dump_mark_nil_lisp_object() here.
        * eval.c (vars_of_eval): Ditto.
        * events.c (vars_of_events): Ditto.
        * frame-msw.c (vars_of_frame_mswindows): Ditto.
        * lread.c (vars_of_lread): Ditto.
        * lrecord.h:
        Declare dump_mark_nil_lisp_object().
        * macros.c (vars_of_macros):
        Call dump_mark_nil_lisp_object() here.
        * process.c (vars_of_process):
        Ditto.

2025-08-04  Aidan Kehoe  <kehoea@parhasard.net>

        * fontcolor-msw.c (FOR_ALL_UNICODE_FONT_SUBRANGES):
        Update this to reflect current values from MSDN.

2025-08-04  Aidan Kehoe  <kehoea@parhasard.net>

        Move the bulk of the functionality of
        reinit_vars_of_fontcolor_mswindows() from post-pdump_load() to
        C preprocessing time.

        * alloc.c (disksave_object_finalization):
        Call Fclrhash (Vfont_signature_data) here, in the same way we do
        Fclrhash (Vmswindows_read_link_hash).
        * emacs.c (main_1):
        Remove call to reinit_vars_of_fontcolor_mswindows(), no longer
        needed.
        * fontcolor-msw.c:
        * fontcolor-msw.c (FOR_ALL_UNICODE_FONT_SUBRANGES): New. Macro to
        iterate over the known font subranges, previously in
        unicode_subrange_raw_map[].
        * fontcolor-msw.c (FROB_RAW_SUBRANGE_0, FROB_RAW_SUBRANGE_1,
        FROB_RAW_SUBRANGE_2, FROB_RAW_SUBRANGE_4, FROB_RAW_SUBRANGE_6,
        FROB_RAW_SUBRANGE_8, FROB_RAW_SUBRANGE_10, FROB_RAW_SUBRANGE_12,
        FROB_RAW_SUBRANGE_14): New.
        * fontcolor-msw.c (FROB_RAW_SUBRANGE): Construct an array of
        unicode_subrange_raw_t using one of FROB_RAW_SUBRANGE_0-14.

        * fontcolor-msw.c (): Call FOR_ALL_UNICODE_FONT_SUBRANGES() with
        FROB_RAW_SUBRANGE(), creating constant unicode_subrange_raw_t
        arrays for all the entries in FOR_ALL_UNICODE_FONT_SUBRANGES macro.

        * fontcolor-msw.c (FROB_LAST_UNICODE_SUBRANGE_TABLE_ENTRY):
        New. Create the last entry in unicode_subrange_table[].
        * fontcolor-msw.c (FROB_UNICODE_SUBRANGE_TABLE_ENTRY):
        New. Create an entry in unicode_subrange_table[] that is not the
        last.
        * fontcolor-msw.c ():
        Create unicode_subrange_table calling FOR_ALL_UNICODE_SUBRANGES
        with FROB_UNICODE_SUBRANGE_TABLE_ENTRY,
        FROB_LAST_UNICODE_SUBRANGE_TABLE_ENTRY.

        * fontcolor-msw.c (mswindows_font_spec_matches_charset_stage_2):
        No need to go up to 128 when checking supported subranges against
        unicode_subrange_table, limit it by countof
        (unicode_subrange_table).
        * fontcolor-msw.c (reinit_vars_of_fontcolor_mswindows): Removed.

        * symsinit.h:
        Remove declaration for reinit_vars_of_fontcolor_mswindows().

2025-07-30  Aidan Kehoe  <kehoea@parhasard.net>

        * compiler.h (PREPROCESSOR_ARGC): New. Moved from lisp.h, where it
        was previously named PARSE_KEYWORDS_ARGC().
        * compiler.h (PREPROCESSOR_CAT, PREPROCESSOR_CONCATENATE,
        PREPROCESSOR_EXPAND, PREPROCESSOR_ARGC_COUNTER): New macros in
        support of PREPROCESSOR_ARGC(), also moved from lisp.h and also
        previously starting with PARSE_KEYWORDS.
        * lisp.h (PARSE_KEYWORDS_7):
        Use the new names for PREPROCESSOR_CONCATENATE, PREPROCESSOR_ARGC
        in this macro.

2025-07-19  Aidan Kehoe  <kehoea@parhasard.net>

        * device-x.c (valid_resource_char_p): Declare this as a constant
        literal, no need to generate it after pdump_load().
        * device-x.c (reinit_console_type_create_device_x): 
        Removed. No need for this function post-pdump_load().
        * device-x.c (console_type_create_device_x):
        Dump name_Extbyte_dynarr, class_Extbyte_dynarr here, there is no
        downside to this.
        * emacs.c (main_1):
        Remove call to reinit_console_type_create_device_x().
        * symsinit.h:
        Remove its declaration.

2025-07-10  Aidan Kehoe  <kehoea@parhasard.net>

        Avoid compile time warnings about type##_free_list_tail unused
        when building without ERROR_CHECK_GC.
        * alloc.c:
        * alloc.c (DECLARE_FIXED_TYPE_FREE_LIST): New #define.
        * alloc.c (DECLARE_FIXED_TYPE_ALLOC): Use it.

2025-07-10  Aidan Kehoe  <kehoea@parhasard.net>

        Mark the string interactive specs as C-readonly, fold them before
        dump given they are constants.

        * alloc.c:
        * alloc.c (finalize_functions_in_obarray): Rename
        mark_subrs_readonly to this. De-duplicate the string interactive specs.
        * alloc.c (disksave_object_finalization):
        Call finalize_functions_in_obarray() with its new name. Pass the
        elisp_maphash_unsafe() a hash table used to de-duplicate the
        prompt strings.
        * bytecode.c (set_compiled_function_interactive): Expose this to
        alloc.c, it is no longer static.
        * bytecode.h:
        Declare set_compiled_function_interactive() here.

2025-07-04  Aidan Kehoe  <kehoea@parhasard.net>

        Further (and all going well last) change regarding Qunbound as
        Lisp_Opaque, see 0de5cf21b9b0 , 71db57be985b .
        * bytecode.c:
        Remove a couple of redundant "|| UNBOUNDP (old_value)" clauses in
        Bvarbind, Bvarset, since !SYMBOL_VALUE_MAGIC_P() now evaluates to
        1 for Qunbound.
        * symbols.c (store_symval_forwarding):
        Similarly, remove a couple of checks against Qunbound in this
        function, unnecessary with SYMBOL_VALUE_MAGIC_P() called on the
        same object.

2025-07-09  Aidan Kehoe  <kehoea@parhasard.net>

        Remove visiblity of #'multiple-value-list-internal from Lisp, a
        step in the direction of further work which will avoid heap
        allocation and reduce the impact on Lisp runtime funcalls of the
        multiple values infrastructure. 
        * eval.c:
        * eval.c (Fmultiple_value_call):
        Special-case the new interpreted implementation of
        #'multiple-value-setq, #'multiple-value-bind, #'nth-values within
        this, which no longer uses the non-standard
        #'multiple-value-list-internal.
        To this end declare a new symbol that they use as the &rest
        argument name that is unlikely to be used by other code.
        * eval.c (Fmultiple_value_list_internal): Removed.
        * eval.c (Fmultiple_value_list_internal): Removed.
        * eval.c (syms_of_eval): Remove its DEFSUBR().

2025-07-03  Aidan Kehoe  <kehoea@parhasard.net>

        Rename Vexecuting_macro to Vexecuting_kbd_macro, which is the
        preferred name, within the C source.  Remove the C-level alias to
        the old name of executing-macro, leave that to obsolete.el.
        Changes made using Ben's gr script, with the exception of the
        change to vars_of_macros(), done by hand.

        * cmdloop.c (default_error_handler):
        * cmdloop.c (Fcommand_loop_1):
        * commands.h:
        * commands.h (INTERACTIVE):
        * event-stream.c (Fnext_event):
        * event-stream.c (Fsit_for):
        * event-stream.c (Fdispatch_event):
        * lisp.h:
        * macros.c:
        * macros.c (pop_kbd_macro_event):
        * macros.c (Fexecute_kbd_macro):
        * macros.h:
        * menubar-x.c (command_builder_operate_menu_accelerator):
        * menubar-x.c (command_builder_find_menu_accelerator):
        * menubar-x.c (Faccelerate_menu):
        * minibuf.c (message_internal):
        * minibuf.c (message_append_internal):
        * redisplay.c:
        * redisplay.c (REDISPLAY_PREEMPTION_CHECK):
        * sound.c (Fding):

2025-07-03  Aidan Kehoe  <kehoea@parhasard.net>

        Remove need for reinit_vars_of_mule_wnn(), init_macros() after
        pdump_load().
        * alloc.c:
        * alloc.c (disksave_object_finalization):
        Call init_mule_wnn() here in the same way we do
        init_mule_charset().

        * emacs.c (main_1): No longer call init_macros(), init_mule_wnn()
        from this file.
        * emacs.c (Frun_emacs_from_temacs): Call init_mule_wnn() from this
        function in the same way we call init_mule_charset().

        * macros.c:
        * macros.c (vars_of_macros):
        Use dump_add_nil_lisp_object() on &Vexecuting_macro, avoiding the
        need to initialize it to nil after pdump_load().
        * macros.c (init_macros): Removed.

        * mule-wnnfns.c:
        Rename charset_wnn_server_type to Vcharset_wnn_server_type, make
        it into a Lisp vector for ease of dumping.

        * mule-wnnfns.c (Fwnn_dict_list):
        * mule-wnnfns.c (Fwnn_get_zenkouho):
        * mule-wnnfns.c (Fwnn_inspect):
        * mule-wnnfns.c (Fwnn_bunsetu_kanji):
        * mule-wnnfns.c (Fwnn_bunsetu_yomi):
        * mule-wnnfns.c (Fwnn_word_info):
        * mule-wnnfns.c (Fwnn_dict_search):
        * mule-wnnfns.c (Fwnn_get_msg):
        * mule-wnnfns.c (Fwnn_hinsi_list):
        * mule-wnnfns.c (yes_or_no):
        * mule-wnnfns.c (puts2):
        Access Vcharset_wnn_server_type as a Lisp vector throughout these
        functions.

        * mule-wnnfns.c (reinit_vars_of_mule_wnn): Removed, replaced by
        init_mule_wnn().
        * mule-wnnfns.c (vars_of_mule_wnn):
        Initialize Vcharset_wnn_server_type as a Lisp vector full of Qnil
        here.

        * mule-wnnfns.c (init_mule_wnn): In this function, called from
        disksave_object_finalization() with all the dump-time character
        sets available, initialize the elements of
        Vcharset_wnn_server_type appropriately.
        * symsinit.h:
        Add declaration for init_mule_wnn(). Remove declaration for
        init_macros(), reinit_vars_of_mule_wnn().

2025-07-02  Aidan Kehoe  <kehoea@parhasard.net>

        * buffer.c (decode_buffer):
        Revise this to no longer return the current buffer if the supplied
        BUFFER is a fixnum or a character, something which never made any
        sense and which is not even GNU-compatible.
        Update the type of ALLOW_STRING to Boolint.
        (Fdecode_buffer):
        Add a comment regarding the practicality of moving this to Lisp.

2025-06-27  Aidan Kehoe  <kehoea@parhasard.net>

        Mule-ize Fcall_interactively(), remove code that dealt with
        zero-terminated strings since it now always takes either a Lisp
        string or code to be evaluated.

        * callint.c (callint_prompt):
        No longer check if RELOC is a string.

        * callint.c (Fcall_interactively):
        Remove redundant checks that SPECS is a string once we have
        established that to start with. Use itext_ichar_eql(),
        ichar_len(), INC_IBYTEPTR() rather than their non-Mule
        equivalents.  Remove assumptions about zero-termination from this
        code which were always incorrect with string interactive specs for
        compiled functions and are now incorrect given the subr
        interactive specs are Lisp strings.
        Error if the length of the desired arg list would overflow
        calculations made by alloca_array().
        Error if Lisp has made the string interactive spec offset point
        within a multibyte character.
        Fix some indentation. 

2025-06-18  Aidan Kehoe  <kehoea@parhasard.net>

        The old byte-char conversion algorithm, disabled 2004, is not
        coming back, and reinit_vars_of_text() has, ever since then, been
        initializing a 65535-short-element table at every normal startup
        with a view, chiefly, to helping to increase global warming.
        Remove that table entirely, remove any code bracketed by #ifdef
        OLD_BYTE_CHAR completely using unifdef(1).

        * buffer.h:
        * buffer.h (struct buffer_text):
        * insdel.c (init_buffer_text):
        * text.c:
        * text.c (OLD_LOOP):
        * text.c (charbpos_to_bytebpos_func):
        * text.c (bytebpos_to_charbpos_func):
        * text.c (buffer_mule_signal_inserted_region):
        * text.c (buffer_mule_signal_deleted_region):
        * text.c (reinit_vars_of_text):
        As above.

2025-06-17  Aidan Kehoe  <kehoea@parhasard.net>

        * event-stream.c (check_event_stream_ok): Removed.
        * event-stream.c (event_stream_handle_magic_event): Remove call to
        it.
        * event-stream.c (event_stream_format_magic_event): Ditto.
        * event-stream.c (event_stream_compare_magic_event): Ditto.
        * event-stream.c (event_stream_hash_magic_event): Ditto.
        * event-stream.c (event_stream_add_timeout): Ditto.
        * event-stream.c (event_stream_remove_timeout): Ditto.
        * event-stream.c (event_stream_select_console): Ditto.
        * event-stream.c (event_stream_unselect_console): Ditto.
        * event-stream.c (event_stream_select_process): Ditto.
        * event-stream.c (event_stream_unselect_process): Ditto.
        * event-stream.c (event_stream_create_io_streams): Ditto.
        * event-stream.c (event_stream_delete_io_streams): Ditto.
        * event-stream.c (event_stream_next_event): Ditto.
        * event-stream.c (init_event_stream):
        Always intialize the event stream, even with temacs, avoiding the
        need for the event stream methods to constantly check that
        event_stream is non-zero.

2025-06-17  Aidan Kehoe  <kehoea@parhasard.net>

        Remove ignore_malloc_warnings, no longer of use in early
        initialization, and not used otherwise.
        * alloc.c: Remove its declaration.
        * alloc.c (malloc_warning): Remove check for it.
        * alloc.c (common_init_alloc_early): Remove use of it.

2025-06-17  Aidan Kehoe  <kehoea@parhasard.net>

        Greatly simplify common_init_alloc_early(), initialize the
        book-keeping for the frob-block types and for
        init_string_chars_alloc() using BSS and data segment values.
        * alloc.c:
        * alloc.c (DECLARE_FIXED_TYPE_ALLOC): Remove the
        init_##type##_alloc() function from this macro.
        * alloc.c (first_string_chars_block) Allocate this in BSS.
        * alloc.c (current_string_chars_block) Initialize this to point to
        first_string_chars_block.
        * alloc.c (init_string_chars_alloc): Removed.
        * alloc.c (verify_string_chars_integrity): Start with
        &first_string_chars_block here.
        * alloc.c (compact_string_chars):
        Ditto.
        * alloc.c (disksave_object_finalization): Ditto.
        * alloc.c (common_init_alloc_early):
        Remove calls to init_string_alloc(), init_cons_alloc() and so
        on. Remove call to init_string_chars_alloc().

2025-06-17  Aidan Kehoe  <kehoea@parhasard.net>

        * lread.c (Fload_internal):
        Fix my bug elicited with error-checking GCPROs here, don't use
        GCPRO1 on the newly-consed Lisp form since gcpro1 is still in use,
        use NGCPRO1 as the code did previously.

2025-06-18  Aidan Kehoe  <kehoea@parhasard.net>

        Move the functionality of reinit_vars_of_bytecode() to dump time.
        
        * bytecode.c (reinit_vars_of_bytecode): Removed.
        * bytecode.c (vars_of_bytecode): Move its contents into this
        function, dump opcode_name_table, removing the need for
        reinit_vars_of_bytecode(). 

        * emacs.c (main_1):
        No longer call reinit_vars_of_bytecode(). Move vars_of_lstream()
        earlier in the loadup sequence since that allows
        vars_of_bytecode() to call emacs_snprintf_ascbyte().

        * symsinit.h: Remove its declaration.

2025-08-11  Aidan Kehoe  <kehoea@parhasard.net>

        Move many basic type predicates to Lisp, no need for them to be in
        C.

        * buffer.c (Fbufferp): Move this to Lisp, now its implementation
        is very cheap and there is no need for it to be in C.
        * buffer.c (syms_of_buffer): Remove its DEFSUBR().
        * bytecode.c (Fcompiled_function_p): Move to Lisp.
        * bytecode.c (syms_of_bytecode): Remove its DEFSUBR().
        * chartab.c (Fcategory_table_p): Move to Lisp.
        * chartab.c (syms_of_chartab): Remove its DEFSUBR().
        * console.c (Fconsolep): Move to Lisp.
        * console.c (syms_of_console): Remove its DEFSUBR().
        * data.c (Fconsp, Fsymbolp, Fvectorp, Fbit_vector_p, Fstringp,
        Fmarkerp, Fsubrp, Fcharacterp, Ffixnump, Ffloatp, Fweak_list_p,
        Fephemeronp): Move these to Lisp.
        * data.c (syms_of_data): Remove their DEFSUBR()s.
        * device.c (Fdevicep): Move to Lisp.
        * device.c (syms_of_device): Remove its DEFSUBR().
        * elhash.c (Fhash_table_p): Move to Lisp.
        * elhash.c (syms_of_elhash): Remove its DEFSUBR().
        * extents.c (Fextentp): Move to Lisp.
        * extents.c (syms_of_extents): Remove its DEFSUBR().
        * events.c (Feventp): Move to Lisp.
        * events.c (syms_of_events): Remove its DEFSUBR().
        * faces.c (Ffacep): Move to Lisp.
        * faces.c (syms_of_faces): Remove its DEFSUBR().
        * file-coding.c (Fcoding_system_p): Move to Lisp.
        * file-coding.c (syms_of_file_coding): Remove its DEFSUBR().
        * frame.c (Fframep): Move to Lisp.
        * frame.c (syms_of_frame): Remove its DEFSUBR().
        * glyphs.c (Fimage_instance_p): Move to Lisp.
        * glyphs.c (Fglyphp): Move to Lisp.
        * glyphs.c (syms_of_glyphs): Remove their DEFSUBR()s.
        * number.h: Remove declaration for Ffloatp(), now in Lisp.
        * specifier.c (Fspecifierp): Move to Lisp.
        * specifier.c (syms_of_specifier): Remove its DEFSUBR().
        * window.c (Fwindowp): Move to Lisp.
        * window.c (syms_of_window): Remove its DEFSUBR().

2025-06-15  Aidan Kehoe  <kehoea@parhasard.net>

        * bytecode-ops.h (OPCODE):
        New type-of opcode, now type checking is very cheap on the C
        level.
        * bytecode.c (execute_optimized_program): Implement it.
        * bytecode.c (check_opcode):
        Its opcode is no longer invalid, don't error when we encounter it.

ChangeLog Entries from tests/ChangeLog

goto announcement, summary, changes

2025-09-23  Aidan Kehoe  <kehoea@parhasard.net>

        * XEmacs 21.5.37 "lettuce" is released.

2026-08-20  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/regexp-opt-tests.el:
        Update a test here to reflect current reality, which always
        creates shy groups if PAREN is unspecified (now that shy groups
        have no regexp run-time cost under XEmacs).

2026-08-12  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/symbol-tests.el:
        Check that the names of dumped, interned symbols cannot be
        modified from Lisp. Check that the name of a non-dumped interned
        symbol can be modified from Lisp.

2026-06-03  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/lisp-tests.el:
        Add a test that creates a zero-length bit vector, which will
        prevent recurrence of a bug just fixed on error checking builds.

2026-06-02  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/buffer-tests.el (buffer-list):
        Test #'bury-buffer, #'record-buffer, just modified.

2026-05-04  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/weak-tests.el:
        Check that #'ephemeron-ref correctly errors if the supplied
        argument is not an ephemeron.

2026-04-06  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/regexp-tests.el:
        * automated/regexp-opt-tests.el:
        Move Alan Mackenzie's regexp-opt tests from regexp-tests to this
        file.
        Add a new test that checks that #'regexp-opt-depth returns
        something sensible for a trivial number of groups.

2026-04-06  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/regexp-opt-tests.el:
        Port the GNU-style tests to our test infrastructure.

2026-04-06  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/regexp-opt-tests.el: Import this file from GNU
        tip. Doesn't currently work with our test infrastructure, but best
        to have the original file in our version control.

2025-12-26  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/symbol-tests.el:
        Update the regexp searching for entries in DOC to reflect
        filenames no longer have trailing newlines.

2025-12-17  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/mule-tests.el (featurep):
        Check that isolated trailing UTF-16 surrogates are treated as
        error octets by the UTF-16, UCS-4 coding systems.

2025-11-29  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/symbol-tests.el:
        Check that a symbol's variable-documentation property is a fixnum
        before calling #'abs on it, fixes an error when doing make check
        with an XEmacs where ps-print/auto-autoloads.el has been
        loaded. Thank you Mats Lidell and the buildbot.

2025-11-28  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/symbol-tests.el:
        Check that #'built-in-symbol-file gives results that reflect all
        relevant entries in DOC.

2025-11-15  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/mule-tests.el:
        Test the NOCOPY argument to #'decode-coding-string,
        #'encode-coding-string, just implemented.

2025-11-13  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/file-tests.el:
        Test behaviour of #'locate-file with a nil path (just on
        non-windows-nt for now).

2025-09-25  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/symbol-tests.el:
        #'when has been moved to subr.el for the sake of simplicity of
        implementation of DEFSUBR(), revise this test to check for #'if
        instead.

2025-08-14  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/byte-compiler-tests.el ("Attempt to set constant
        symbol"):
        Check that the byte-compiler warns when attempting to set
        most-positive-fixnum.
        * automated/byte-compiler-tests.el ("Attempt to let-bind constant
        symbol"):
        Check that the byte-compiler warns when attempting to let-bind
        most-positive-fixnum.
        * automated/byte-compiler-tests.el (void-variable):
        Check that Lisp errors on defreferencing a variable that is Qunbound.

2025-07-02  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/buffer-tests.el:
        New. Test a bug just fixed in #'decode-buffer, test that it is
        fixed in various other functions that call the underlying
        decode_buffer().

2025-06-27  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/call-interactively.el:
        Test that recent changes to #'call-interactively have been made
        correctly.

2025-06-19  Aidan Kehoe  <kehoea@parhasard.net>

        * automated/mule-tests.el:
        Mark the tests of coding cookies on the last page with
        Implementation-Incomplete-Expect-Errors, since the code that does
        that implementation is currently surrounded by #if 0. Thank you
        Mats Lidell.

goto announcement, summary, changes

 
 

Conform with <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
Automatically validated by PSGML