]> git.eshelyaron.com Git - emacs.git/commitdiff
Avoid recursive byte-compile-files fighting over input/output buffers
authorGlenn Morris <rgm@gnu.org>
Sat, 23 Feb 2013 21:14:36 +0000 (13:14 -0800)
committerGlenn Morris <rgm@gnu.org>
Sat, 23 Feb 2013 21:14:36 +0000 (13:14 -0800)
* 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
lisp/ChangeLog
lisp/emacs-lisp/bytecomp.el

index deeef8d291481dcce9159fc08e631e3696d1fd28..631216da989ef72d203ce002517a09c2def66b22 100644 (file)
@@ -1,3 +1,10 @@
+2013-02-23  Glenn Morris  <rgm@gnu.org>
+
+       * 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.  (Bug#13787)
+
 2013-02-23  Michael Albinus  <michael.albinus@gmx.de>
 
        * net/tramp.el (tramp-methods): Fix docstring.
index 280a1bbc2dd0d44141e24506d6fba846a0a5b165..f5861550c9a79082fbdd44933c07bab53accfc41 100644 (file)
@@ -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)