diff options
author | Glenn Morris <rgm@gnu.org> | 2013-02-23 13:14:36 -0800 |
---|---|---|
committer | Glenn Morris <rgm@gnu.org> | 2013-02-23 13:14:36 -0800 |
commit | fd7436285b30a9396f1953e46d5cc6074a80a9b5 (patch) | |
tree | b58f87e30dd1075e9ce011de137e52048cdefc7a /lisp/emacs-lisp | |
parent | c57a0aff3e3e3ddf17af59ea197c0d6c9b959453 (diff) | |
download | emacs-fd7436285b30a9396f1953e46d5cc6074a80a9b5.tar.gz emacs-fd7436285b30a9396f1953e46d5cc6074a80a9b5.tar.bz2 emacs-fd7436285b30a9396f1953e46d5cc6074a80a9b5.zip |
Avoid recursive byte-compile-files fighting over input/output buffers
* lisp/emacs-lisp/bytecomp.el (byte-compile-level): New.
(byte-compile-file, byte-compile-from-buffer):
Use separate input/output buffers for each level of recursive
byte-compile-file calls.
Fixes: debbugs:13787
Diffstat (limited to 'lisp/emacs-lisp')
-rw-r--r-- | lisp/emacs-lisp/bytecomp.el | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index 280a1bbc2dd..f5861550c9a 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -1675,6 +1675,9 @@ If compilation is needed, this functions returns the result of (load (if (file-exists-p dest) dest filename))) 'no-byte-compile))) +(defvar byte-compile-level 0 ; bug#13787 + "Depth of a recursive byte compilation.") + ;;;###autoload (defun byte-compile-file (filename &optional load) "Compile a file of Lisp code named FILENAME into a file of byte code. @@ -1717,7 +1720,13 @@ The value is non-nil if there were no errors, nil if errors." (setq target-file (byte-compile-dest-file filename)) (setq byte-compile-dest-file target-file) (with-current-buffer - (setq input-buffer (get-buffer-create " *Compiler Input*")) + ;; It would be cleaner to use a temp buffer, but if there was + ;; an error, we leave this buffer around for diagnostics. + ;; Its name is documented in the lispref. + (setq input-buffer (get-buffer-create + (concat " *Compiler Input*" + (if (zerop byte-compile-level) "" + (format "-%s" byte-compile-level))))) (erase-buffer) (setq buffer-file-coding-system nil) ;; Always compile an Emacs Lisp file as multibyte @@ -1770,12 +1779,15 @@ The value is non-nil if there were no errors, nil if errors." (when byte-compile-verbose (message "Compiling %s..." filename)) (setq byte-compiler-error-flag nil) + (setq byte-compile-level (1+ byte-compile-level)) ;; It is important that input-buffer not be current at this call, ;; so that the value of point set in input-buffer ;; within byte-compile-from-buffer lingers in that buffer. (setq output-buffer (save-current-buffer - (byte-compile-from-buffer input-buffer))) + (unwind-protect + (byte-compile-from-buffer input-buffer) + (setq byte-compile-level (1- byte-compile-level))))) (if byte-compiler-error-flag nil (when byte-compile-verbose @@ -1881,7 +1893,10 @@ With argument ARG, insert value in current buffer after the form." (byte-compile-close-variables (with-current-buffer (setq byte-compile--outbuffer - (get-buffer-create " *Compiler Output*")) + (get-buffer-create + (concat " *Compiler Output*" + (if (<= byte-compile-level 1) "" + (format "-%s" (1- byte-compile-level)))))) (set-buffer-multibyte t) (erase-buffer) ;; (emacs-lisp-mode) |