Allow loading modules by 'load-file'

* src/lread.c (Fload): Call 'unbind_to' with 'Fmodule_load' as the
2nd arg, to avoid the "binding stack not balanced" error.
(syms_of_lread) <module-file-suffix>: New Lisp variable.

* lisp/files.el (module-file-suffix): Declare.
(load-file): Remove 'module-file-suffix' from
'completion-ignored-extensions', to allow completion on modules.

* etc/NEWS: Mention 'module-file-suffix'.
This commit is contained in:
Eli Zaretskii 2015-11-22 20:38:51 +02:00
parent 9f0d19f24c
commit 40ed767ba0
3 changed files with 19 additions and 5 deletions

View file

@ -308,8 +308,11 @@ few or no entries have changed.
** Emacs can now load shared/dynamic libraries (modules).
A dynamic Emacs module is a shared library that provides additional
functionality for use in Emacs Lisp programs, just like a package
written in Emacs Lisp would. The functions `load' and `require' were
extended to load such modules, as they do with Emacs Lisp packages.
written in Emacs Lisp would. The functions `load', `require',
`load-file', etc. were extended to load such modules, as they do with
Emacs Lisp packages. The new variable `module-file-suffix' holds the
system-dependent value of the file-name extension (`.so' on Posix
hosts) of the module files.
A module should export a C-callable function named
`emacs_module_init', which Emacs will call as part of the call to

View file

@ -772,11 +772,15 @@ If INCLUDE-DIRECTORIES, also include directories that have matching names."
(push (expand-file-name file dir) files)))))
(nconc result (nreverse files))))
(defvar module-file-suffix)
(defun load-file (file)
"Load the Lisp file named FILE."
;; This is a case where .elc makes a lot of sense.
;; This is a case where .elc and .so/.dll make a lot of sense.
(interactive (list (let ((completion-ignored-extensions
(remove ".elc" completion-ignored-extensions)))
(remove module-file-suffix
(remove ".elc"
completion-ignored-extensions))))
(read-file-name "Load file: " nil nil 'lambda))))
(load (expand-file-name file) nil nil t))

View file

@ -1164,7 +1164,7 @@ Return t if the file exists and loads successfully. */)
#ifdef HAVE_MODULES
if (suffix_p (found, MODULES_SUFFIX))
return Fmodule_load (found);
return unbind_to (count, Fmodule_load (found));
#endif
/* Check if we're stuck in a recursive load cycle.
@ -4512,6 +4512,13 @@ to the specified file name if a suffix is allowed or required. */);
#else
Vload_suffixes = list2 (build_pure_c_string (".elc"),
build_pure_c_string (".el"));
#endif
DEFVAR_LISP ("module-file-suffix", Vmodule_file_suffix,
doc: /* Suffix of loadable module file, or nil of modules are not supported. */);
#ifdef HAVE_MODULES
Vmodule_file_suffix = build_pure_c_string (MODULES_SUFFIX);
#else
Vmodule_file_suffix = Qnil;
#endif
DEFVAR_LISP ("load-file-rep-suffixes", Vload_file_rep_suffixes,
doc: /* List of suffixes that indicate representations of \