From bcc222251e1a750a11e365f2faa641cc56c1169d Mon Sep 17 00:00:00 2001 From: Andrea Corallo Date: Tue, 6 Jun 2023 11:27:13 +0200 Subject: [PATCH] Fix `emacs-lisp-native-compile-and-load' for C-h f (bug#58314) * lisp/emacs-lisp/comp.el (comp-write-bytecode-file): New function spilling code from `batch-byte+native-compile'. (batch-byte+native-compile): Make use of. * lisp/progmodes/elisp-mode.el (emacs-lisp-native-compile-and-load): Produce the elc file and ask to have it loaded. --- lisp/emacs-lisp/comp.el | 31 +++++++++++++++++++++---------- lisp/progmodes/elisp-mode.el | 8 ++++++-- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/lisp/emacs-lisp/comp.el b/lisp/emacs-lisp/comp.el index 8f40f2f40a0..469f921a38e 100644 --- a/lisp/emacs-lisp/comp.el +++ b/lisp/emacs-lisp/comp.el @@ -4318,6 +4318,26 @@ last directory in `native-comp-eln-load-path')." else collect (byte-compile-file file)))) +(defun comp-write-bytecode-file (eln-file) + "After native compilation write the bytecode file for ELN-FILE. +Make sure that eln file is younger than byte-compiled one and +return the filename of this last. + +This function can be used only in conjuntion with +`byte+native-compile' `byte-to-native-output-buffer-file' (see +`batch-byte+native-compile')." + (pcase byte-to-native-output-buffer-file + (`(,temp-buffer . ,target-file) + (unwind-protect + (progn + (byte-write-target-file temp-buffer target-file) + ;; Touch the .eln in order to have it older than the + ;; corresponding .elc. + (when (stringp eln-file) + (set-file-times eln-file))) + (kill-buffer temp-buffer)) + target-file))) + ;;;###autoload (defun batch-byte+native-compile () "Like `batch-native-compile', but used for bootstrap. @@ -4333,16 +4353,7 @@ variable \"NATIVE_DISABLED\" is set, only byte compile." (let* ((byte+native-compile t) (byte-to-native-output-buffer-file nil) (eln-file (car (batch-native-compile)))) - (pcase byte-to-native-output-buffer-file - (`(,temp-buffer . ,target-file) - (unwind-protect - (progn - (byte-write-target-file temp-buffer target-file) - ;; Touch the .eln in order to have it older than the - ;; corresponding .elc. - (when (stringp eln-file) - (set-file-times eln-file))) - (kill-buffer temp-buffer)))) + (comp-write-bytecode-file eln-file) (setq command-line-args-left (cdr command-line-args-left))))) ;;;###autoload diff --git a/lisp/progmodes/elisp-mode.el b/lisp/progmodes/elisp-mode.el index 6fbb87fa3a8..956e3d30bce 100644 --- a/lisp/progmodes/elisp-mode.el +++ b/lisp/progmodes/elisp-mode.el @@ -215,6 +215,8 @@ All commands in `lisp-mode-shared-map' are inherited by this map." (load (byte-compile-dest-file buffer-file-name))) (declare-function native-compile "comp") +(declare-function comp-write-bytecode-file "comp") + (defun emacs-lisp-native-compile-and-load () "Native-compile synchronously the current file (if it has changed). Load the compiled code when finished. @@ -224,8 +226,10 @@ Use `emacs-lisp-byte-compile-and-load' in combination with native compilation." (interactive nil emacs-lisp-mode) (emacs-lisp--before-compile-buffer) - (when-let ((out (native-compile buffer-file-name))) - (load out))) + (let ((byte+native-compile t) + (byte-to-native-output-buffer-file nil)) + (when-let ((eln (native-compile buffer-file-name))) + (load (file-name-sans-extension (comp-write-bytecode-file eln)))))) (defun emacs-lisp-macroexpand () "Macroexpand the form after point. -- 2.39.2