Branch: development (switch to
stable),
SWI-Prolog Changelog from version 10.1.9 to 10.1.10
[Jun 25 2026]
- ENHANCED: call_with_inference_limit/2: avoid pushing a bignum for
"no limit" This fixes this predicate for systems compiled without
bignum support (rarely used these days) and reduces stack usage on
systems with bignum support.
- CLEANUP: static int -> bool for is_or/del_attr/has_attributes_after
Three attvar helpers were declared static int but their bodies use
only succeed/fail/return true/return false:
- CLEANUP: static int -> bool/boolex_t for type-test and visited helpers
Type-test helpers used by the compiler and the cycle detector were
declared `static int` but only ever return true or false:
- CLEANUP: type local variables holding bool returns as bool, not int
Several local rc/rval variables hold the result of a function that
returns bool (PL_unify_*, PL_is_*, PL_error) but are declared int.
This is a pure cleanup — no behaviour change. Updated sites and
the related helpers:
- CLEANUP: type local variables holding boolex_t as boolex_t, not int
Several functions return boolex_t (true/false plus negative *_OVERFLOW
codes) but callers stored the result in `int rc`. No data loss
occurred because both happen to be the same width, but the type was
misleading and a future change to the boolex_t representation could
silently break callers that switch on specific overflow codes.
[Jun 24 2026]
- CLEANUP: consistent bool/boolex_t typing for ensure*Space and put_*
family User-visible fixes (only triggered on no-bignum builds,
i.e. neither GMP nor libbf):
- FIXED: PL_unify_int64() and related functions may signal false stack
overflow These functions called
put_int64() without allowing GC,
but not handling the overflow properly.
[Jun 23 2026]
- FIXED: prolog_close_source/1: close on hooked (xref) open. The xref
hooks do not refine closing and the standard close should happen.
- BUILD: Do not try to install these .qlf files
- DOC: Merge all write predicates into one description.
[Jun 22 2026]
- FIXED: tidg/1: meta predicate declaration.
[Jun 21 2026]
- BUILD: Added cmake option
-DCHANGELOG=ON
- BUILD: Make SWI-Prolog runs during build halt the build system on
error messages
[Jun 20 2026]
[Jun 19 2026]
- DOC: add SECURITY, PRIVACY and CODE_SIGNING policies; rename CoC [no
ci] Prepares the repository for the SignPath Foundation code-signing
application: add a security-reporting address, a privacy statement,
and a code-signing policy describing the planned signed Windows
release flow. Also rename Code-of-Conduct.md to CODE_OF_CONDUCT.md
so GitHub's Community Standards detect it.
[Jun 18 2026]
- CI: extract only the Windows installer from the build container docker
cp on newer engines refuses to write symlinks whose target escapes the
destination, which made the whole-build.win64 copy fail on a relative
symlink under home/app/. Switch to the tar-stream form of docker cp
and extract only the swipl-*-*.x64.exe.
- FIXED: pkg_doc(DEPENDS ...) now applies to .tex generation, not just
html/pdf The DEPENDS list passed to
pkg_doc() was only forwarded to
the per-package .html / .pdf rules. The pldoc / doc2tex / txt2tex
commands that produce the .tex files saw no such dependency, so
e.g. packages/cql/cqldoc.tex could be built before chr was installed
in the build home, and `library('cql/cql')' would fail to load
library(chr/chr_translate) at .tex-generation time.
- CI: log in to GHCR before pulling the MinGW build
image Required so the release workflow can pull a private
ghcr.io/swi-prolog/swipl-mingw-build when org policy disallows public
packages. Harmless once/if the image is made public.
- CI: add Windows installer release workflow Triggered on V* tags
(and manually via workflow_dispatch), this job pulls the pre-built
MinGW cross-compile image from GHCR, clones and builds swipl inside
the container via the image's --win64-from-git entrypoint mode,
extracts the NSIS installer with docker cp, and attaches it to the
GitHub Release for the tag.
[Jun 16 2026]
- FIXED: Include <poll.h> based on HAVE_POLL instead of HAVE_POLL_H
The streams/I/O code includes <poll.h> guarded by HAVE_POLL_H,
but decides whether to actually call
poll() and use `struct pollfd`
based on HAVE_POLL. These come from two independent configure probes
(check_include_file vs check_function_exists). When they disagree --
e.g. the poll() function is detected (HAVE_POLL) but the header probe
for poll.h fails for an unrelated reason -- <poll.h> is omitted while
poll() is still compiled, producing:
- BUILD: serialise Wine swipl.exe runs via a Ninja job pool When
cross-building for Windows on Linux, every swipl.exe step (qlf
compiles, library indices, man index) runs under Wine through a
single wineserver. Parallel
ninja over-saturates wineserver,
occasionally deadlocking client requests and hanging the build.
Define a swipl_run=1 Ninja job pool on the cross-build path and apply
it to the custom commands that invoke swipl; native builds expand
the JOB_POOL keyword to nothing and are unaffected.
[Jun 15 2026]
- ENHANCED: listing/2 using
source(true): show source location as URL.
Package cpp
[Jun 20 2026]
- FIXED: PlRegister constructors must take size_t arity to match macros
The previous commit changed the PREDICATE/PREDICATE_NONDET trampoline
signatures to (term_t, size_t, control_t) but left the PlRegister
constructors taking (term_t, int, control_t), breaking every user of
the macros.
- UBSAN: use size_t instead of int for arity That is the error
Package json
[Jun 23 2026]
- FIXED: #144 Raise
domain_error(method, get) as promised.
Package pldoc
[Jun 24 2026]
- ADDED: doc_man: integrate xpce reference manual into PlDoc Make
xpce class members and their manual pages reachable from PlDoc:
hook xpce into the navigation tree, resolve xpce in-page links
(#class-... and #sec:...), render ivar object links, and add
pldoc_synopsis_spec/2 to rewrite the pce_principal synopsis
to
library(pce).
[Jun 23 2026]
- ADDED: Add a history section to a predicate block The relevant
history facts are extracted from git. This information is collected
at build time if the cmake option
-DCHANGELOG=ON is given.
[Jun 21 2026]
- ADDED: library(pldoc/doc_changes): machine readable access
to changelog. This library is installed when the cmake option
-DCHANGELOG=ON is given. That also triggers building the database
when SWI-Prolog is built.
Package ssl
[Jun 17 2026]
- TEST: regression for #175 ecdsa_sign/4 + ecdsa_verify/4 Sign
and verify with a hard-coded prime256v1 SEC1 PEM key, and check
that a verification of tampered data fails. Also asserts that
load_private_key/3 returns the expected ec/3 shape, since the
load_private_key/3 path was broken by the same OpenSSL 3 cleanup that
broke ecdsa.
- FIXED: #175 ecdsa_sign/4 and ecdsa_verify/4 with OpenSSL 3 On OpenSSL
3, ecdsa_sign/4 always failed silently and any verification produced
wrong results. Two bugs in the USE_EVP_API path:
- FIXED: load_private_key/3 corrupting EC keys with OpenSSL 3 In the
USE_EVP_API path,
unify_ec() left priv_bn uninitialised when passed
to EVP_PKEY_get_bn_param(), queried OSSL_PKEY_PARAM_GROUP_NAME as
an octet string (it is UTF-8), and never checked any return values.
The resulting ec(Priv,Pub,Curve) term contained a garbage curve
name and an undefined private-key field, breaking every subsequent
ecdsa_sign/4 and ecdsa_verify/4 call.
Package swipy
[Jun 25 2026]
- FIXED: Respect
const char* return from PyUnicode_AsUTF8AndSize()
Old code changed the / into r and back. Should be safe in a single
thraeded context, but might cause problems with free threaded Python.
[Jun 24 2026]
- FIXED: #19 pip/uv install toggling for janus-swi 1.5.2 The setup.py
was duplicating fields already declared in pyproject.toml (author,
author_email, url, description, license). With recent setuptools
this causes the generated metadata to mark them as "Dynamic: author"
and "Dynamic: home-page" (Metadata-Version 2.2), which some pip/uv
versions handle by writing partial RECORD files. The next install
then complains the package is distutils-installed and cannot be
uninstalled, producing the alternating succeed/fail pattern reported
in packages-swipy#19 and Popper#144.
Package xpce
[Jun 24 2026]
- DOC: Update ->fill references to reflect colour-only support The
->fill instance variable on box, arc, arrow, circle, ellipse and
path is implemented as a colour (with the special names foreground
and background); image/bitmap fill patterns are no longer supported.
The manual still described filling with images, patterns and bitmaps.
[Jun 23 2026]
- BUILD: Fix building xpce docs when there is no display
[Jun 16 2026]
- DOC: ->initialise / ->_execute for classes \\== and ?, class spatial.
- FIXED: HTML manual lookup for symbolic xpce classes (==, :=, ...)
The runtime extracts the live class name from the xpce object,
but the HTML index and anchors are keyed on the safe file-base form
(equal, binding, noteq, ...). Map class names through classmap on
the way out of object_spec so
manpce(==) -> click on a method finds
the matching <dt>/<dd> chunk.
[Jun 15 2026]
- ADDED: Support
edit(class(Class)) to edit built-in xpce classes.
- FIXED: black fringes left when graphicals are moved Inflate the dirty
rectangle reported by ->changed_image by 1 pixel in each direction.
Antialiased strokes and primitives drawn at non-integer coordinates
can paint just outside the integer bounding box; without slop, those
pixels are not repainted when the graphical moves, leaving fringes.
- FIXED: heap-use-after-free in updatePointedDevice during event dispatch
Use for_chain instead of for_cell for the three chain iterations
in updatePointedDevice. generateEventGraphical can dispatch Prolog
handlers that mutate the chain (e.g. an ->expose on a connection
removes a cell from dev->graphicals), which for_cell cannot tolerate.