Function: ghostel--load-module
ghostel--load-module is a natively compiled function defined in
ghostel-module-install.el.
Signature
(ghostel--load-module &optional PROMPT-USER)
Documentation
Ensure the ghostel native module is loaded.
When PROMPT-USER is non-nil (called from an interactive command like
ghostel), missing or stale modules trigger
ghostel-module-auto-install and load failures signal user-error
so the calling flow aborts. Otherwise (load time, including
byte-compilation and Emacs 31's user-lisp/ auto-compile), this
function never prompts, downloads, or compiles - it only loads an
existing module file and warns if one is missing or stale. Module
installation only happens on an explicit user action: M-x ghostel,
M-x ghostel-download-module, or M-x ghostel-module-compile.
Before calling module-load the sidecar file
ghostel-module.version (written by build.zig and the downloader)
is consulted. When the sidecar reports a version older than
ghostel--minimum-module-version the .so is NOT mapped into this
process — that lets the freshly installed module be loaded in
place after a subsequent ghostel--ensure-module call, avoiding an
extra restart.
The guard also honours ghostel--new being already fboundp, which
covers the pure-Elisp test path where cl-letf stubs the native
entry points so tests run without the module present.
Source Code
;; Defined in /nix/store/1252krff0gb2kisjcpp45m50cpdskfrl-emacs-packages-deps/share/emacs/site-lisp/ghostel-module-install.el
(defun ghostel--load-module (&optional prompt-user)
"Ensure the ghostel native module is loaded.
When PROMPT-USER is non-nil (called from an interactive command like
`ghostel'), missing or stale modules trigger
`ghostel-module-auto-install' and load failures signal `user-error'
so the calling flow aborts. Otherwise (load time, including
byte-compilation and Emacs 31's `user-lisp/' auto-compile), this
function never prompts, downloads, or compiles - it only loads an
existing module file and warns if one is missing or stale. Module
installation only happens on an explicit user action: `M-x ghostel',
`M-x ghostel-download-module', or `M-x ghostel-module-compile'.
Before calling `module-load' the sidecar file
`ghostel-module.version' (written by `build.zig' and the downloader)
is consulted. When the sidecar reports a version older than
`ghostel--minimum-module-version' the .so is NOT mapped into this
process — that lets the freshly installed module be loaded in
place after a subsequent `ghostel--ensure-module' call, avoiding an
extra restart.
The guard also honours `ghostel--new' being already `fboundp', which
covers the pure-Elisp test path where `cl-letf' stubs the native
entry points so tests run without the module present."
(let* ((dir (ghostel--module-directory))
(mod (expand-file-name
(concat "ghostel-module" module-file-suffix) dir))
(sidecar-ver (ghostel--read-module-sidecar-version dir)))
(unless (or (featurep 'ghostel-module)
(fboundp 'ghostel--new))
(cond
;; Sidecar tells us the on-disk module is too old. Refuse to map
;; it so a subsequent install can `module-load' the fresh file in
;; this same Emacs process.
((and sidecar-ver
(version< sidecar-ver ghostel--minimum-module-version))
(display-warning
'ghostel
(format "Module version %s on disk is older than required %s"
sidecar-ver ghostel--minimum-module-version))
(when prompt-user
(ghostel--ensure-module dir)
(let ((new-ver (ghostel--read-module-sidecar-version dir)))
(when (and (file-exists-p mod)
new-ver
(not (version< new-ver
ghostel--minimum-module-version)))
(condition-case err
(module-load mod)
(error
(user-error "Failed to load ghostel native module: %s"
(error-message-string err))))))))
;; Module file missing.
((not (file-exists-p mod))
(cond
(prompt-user
(ghostel--ensure-module dir)
(when (file-exists-p mod)
(condition-case err
(module-load mod)
(error
(user-error "Failed to load ghostel native module: %s"
(error-message-string err))))))
(t
(display-warning
'ghostel
(concat "Native module not found: " mod
"\nRun M-x ghostel-download-module or M-x ghostel-module-compile")))))
;; File exists and the sidecar (when present) is fresh. Load it.
;; When the sidecar is absent (existing installs predating it),
;; fall back to a live version check post-load. We skip the live
;; check here when PROMPT-USER is non-nil; the tail below runs it
;; instead, avoiding a double prompt.
(t
(condition-case err
(progn
(module-load mod)
(unless prompt-user
(ghostel--check-module-version dir nil)))
(error
(if prompt-user
(user-error "Failed to load ghostel native module: %s"
(error-message-string err))
(display-warning
'ghostel
(format "Failed to load native module: %s\nTry M-x ghostel-module-compile to rebuild"
(error-message-string err)))))))))
;; Surface the version check at every interactive entry point — not
;; just when this call loaded the module. Otherwise a stale .so
;; mapped in by an earlier load (e.g. sidecar absent at startup) is
;; silently kept and the user only ever sees the bare warning.
(when (and prompt-user (featurep 'ghostel-module))
(ghostel--check-module-version dir t))))