Remove bytecomp- prefix, plus misc changes.

* lisp/emacs-lisp/byte-opt.el (byte-compile-inline-expand): Make it work to
inline lexbind interpreted functions into lexbind code.
(bytedecomp-bytes): Not a dynamic var any more.
(disassemble-offset): Get the bytes via an argument instead.
(byte-decompile-bytecode-1): Use push.
* lisp/emacs-lisp/bytecomp.el: Remove the bytecomp- prefix now that we use
lexical-binding.
(byte-compile-outbuffer): Rename from bytecomp-outbuffer.
* lisp/emacs-lisp/cl-macs.el (load-time-value):
* lisp/emacs-lisp/cl.el (cl-compiling-file): Adjust to new name.
* lisp/emacs-lisp/pcase.el (pcase-mutually-exclusive-predicates):
Add byte-code-function-p.
(pcase--u1): Remove left-over code from early development.
Fix case of variable shadowing in guards and predicates.
(pcase--u1): Add a new `let' pattern.
* src/image.c (parse_image_spec): Use Ffunctionp.
* src/lisp.h: Declare Ffunctionp.
This commit is contained in:
Stefan Monnier 2011-03-16 16:08:39 -04:00
parent 2663659f1f
commit ca1055060d
14 changed files with 453 additions and 389 deletions

View file

@ -33,8 +33,6 @@
;;; Code:
;; FIXME: get rid of the atrocious "bytecomp-" variable prefix.
;; ========================================================================
;; Entry points:
;; byte-recompile-directory, byte-compile-file,
@ -1563,41 +1561,33 @@ Files in subdirectories of DIRECTORY are processed also."
(interactive "DByte force recompile (directory): ")
(byte-recompile-directory directory nil t))
;; The `bytecomp-' prefix is applied to all local variables with
;; otherwise common names in this and similar functions for the sake
;; of the boundp test in byte-compile-variable-ref.
;; http://lists.gnu.org/archive/html/emacs-devel/2008-01/msg00237.html
;; http://lists.gnu.org/archive/html/bug-gnu-emacs/2008-02/msg00134.html
;; Note that similar considerations apply to command-line-1 in startup.el.
;;;###autoload
(defun byte-recompile-directory (bytecomp-directory &optional bytecomp-arg
bytecomp-force)
"Recompile every `.el' file in BYTECOMP-DIRECTORY that needs recompilation.
(defun byte-recompile-directory (directory &optional arg force)
"Recompile every `.el' file in DIRECTORY that needs recompilation.
This happens when a `.elc' file exists but is older than the `.el' file.
Files in subdirectories of BYTECOMP-DIRECTORY are processed also.
Files in subdirectories of DIRECTORY are processed also.
If the `.elc' file does not exist, normally this function *does not*
compile the corresponding `.el' file. However, if the prefix argument
BYTECOMP-ARG is 0, that means do compile all those files. A nonzero
BYTECOMP-ARG means ask the user, for each such `.el' file, whether to
compile it. A nonzero BYTECOMP-ARG also means ask about each subdirectory
ARG is 0, that means do compile all those files. A nonzero
ARG means ask the user, for each such `.el' file, whether to
compile it. A nonzero ARG also means ask about each subdirectory
before scanning it.
If the third argument BYTECOMP-FORCE is non-nil, recompile every `.el' file
If the third argument FORCE is non-nil, recompile every `.el' file
that already has a `.elc' file."
(interactive "DByte recompile directory: \nP")
(if bytecomp-arg
(setq bytecomp-arg (prefix-numeric-value bytecomp-arg)))
(if arg (setq arg (prefix-numeric-value arg)))
(if noninteractive
nil
(save-some-buffers)
(force-mode-line-update))
(with-current-buffer (get-buffer-create byte-compile-log-buffer)
(setq default-directory (expand-file-name bytecomp-directory))
(setq default-directory (expand-file-name directory))
;; compilation-mode copies value of default-directory.
(unless (eq major-mode 'compilation-mode)
(compilation-mode))
(let ((bytecomp-directories (list default-directory))
(let ((directories (list default-directory))
(default-directory default-directory)
(skip-count 0)
(fail-count 0)
@ -1605,47 +1595,36 @@ that already has a `.elc' file."
(dir-count 0)
last-dir)
(displaying-byte-compile-warnings
(while bytecomp-directories
(setq bytecomp-directory (car bytecomp-directories))
(message "Checking %s..." bytecomp-directory)
(let ((bytecomp-files (directory-files bytecomp-directory))
bytecomp-source)
(dolist (bytecomp-file bytecomp-files)
(setq bytecomp-source
(expand-file-name bytecomp-file bytecomp-directory))
(if (and (not (member bytecomp-file '("RCS" "CVS")))
(not (eq ?\. (aref bytecomp-file 0)))
(file-directory-p bytecomp-source)
(not (file-symlink-p bytecomp-source)))
;; This file is a subdirectory. Handle them differently.
(when (or (null bytecomp-arg)
(eq 0 bytecomp-arg)
(y-or-n-p (concat "Check " bytecomp-source "? ")))
(setq bytecomp-directories
(nconc bytecomp-directories (list bytecomp-source))))
;; It is an ordinary file. Decide whether to compile it.
(if (and (string-match emacs-lisp-file-regexp bytecomp-source)
(file-readable-p bytecomp-source)
(not (auto-save-file-name-p bytecomp-source))
(not (string-equal dir-locals-file
(file-name-nondirectory
bytecomp-source))))
(progn (let ((bytecomp-res (byte-recompile-file
bytecomp-source
bytecomp-force bytecomp-arg)))
(cond ((eq bytecomp-res 'no-byte-compile)
(setq skip-count (1+ skip-count)))
((eq bytecomp-res t)
(setq file-count (1+ file-count)))
((eq bytecomp-res nil)
(setq fail-count (1+ fail-count)))))
(or noninteractive
(message "Checking %s..." bytecomp-directory))
(if (not (eq last-dir bytecomp-directory))
(setq last-dir bytecomp-directory
dir-count (1+ dir-count)))
)))))
(setq bytecomp-directories (cdr bytecomp-directories))))
(while directories
(setq directory (car directories))
(message "Checking %s..." directory)
(dolist (file (directory-files directory))
(let ((source (expand-file-name file directory)))
(if (and (not (member file '("RCS" "CVS")))
(not (eq ?\. (aref file 0)))
(file-directory-p source)
(not (file-symlink-p source)))
;; This file is a subdirectory. Handle them differently.
(when (or (null arg) (eq 0 arg)
(y-or-n-p (concat "Check " source "? ")))
(setq directories (nconc directories (list source))))
;; It is an ordinary file. Decide whether to compile it.
(if (and (string-match emacs-lisp-file-regexp source)
(file-readable-p source)
(not (auto-save-file-name-p source))
(not (string-equal dir-locals-file
(file-name-nondirectory source))))
(progn (case (byte-recompile-file source force arg)
(no-byte-compile (setq skip-count (1+ skip-count)))
((t) (setq file-count (1+ file-count)))
((nil) (setq fail-count (1+ fail-count))))
(or noninteractive
(message "Checking %s..." directory))
(if (not (eq last-dir directory))
(setq last-dir directory
dir-count (1+ dir-count)))
)))))
(setq directories (cdr directories))))
(message "Done (Total of %d file%s compiled%s%s%s)"
file-count (if (= file-count 1) "" "s")
(if (> fail-count 0) (format ", %d failed" fail-count) "")
@ -1660,100 +1639,97 @@ This is normally set in local file variables at the end of the elisp file:
\;; Local Variables:\n;; no-byte-compile: t\n;; End: ") ;Backslash for compile-main.
;;;###autoload(put 'no-byte-compile 'safe-local-variable 'booleanp)
(defun byte-recompile-file (bytecomp-filename &optional bytecomp-force bytecomp-arg load)
"Recompile BYTECOMP-FILENAME file if it needs recompilation.
(defun byte-recompile-file (filename &optional force arg load)
"Recompile FILENAME file if it needs recompilation.
This happens when its `.elc' file is older than itself.
If the `.elc' file exists and is up-to-date, normally this
function *does not* compile BYTECOMP-FILENAME. However, if the
prefix argument BYTECOMP-FORCE is set, that means do compile
BYTECOMP-FILENAME even if the destination already exists and is
function *does not* compile FILENAME. However, if the
prefix argument FORCE is set, that means do compile
FILENAME even if the destination already exists and is
up-to-date.
If the `.elc' file does not exist, normally this function *does
not* compile BYTECOMP-FILENAME. If BYTECOMP-ARG is 0, that means
not* compile FILENAME. If ARG is 0, that means
compile the file even if it has never been compiled before.
A nonzero BYTECOMP-ARG means ask the user.
A nonzero ARG means ask the user.
If LOAD is set, `load' the file after compiling.
The value returned is the value returned by `byte-compile-file',
or 'no-byte-compile if the file did not need recompilation."
(interactive
(let ((bytecomp-file buffer-file-name)
(bytecomp-file-name nil)
(bytecomp-file-dir nil))
(and bytecomp-file
(eq (cdr (assq 'major-mode (buffer-local-variables)))
'emacs-lisp-mode)
(setq bytecomp-file-name (file-name-nondirectory bytecomp-file)
bytecomp-file-dir (file-name-directory bytecomp-file)))
(let ((file buffer-file-name)
(file-name nil)
(file-dir nil))
(and file
(derived-mode-p 'emacs-lisp-mode)
(setq file-name (file-name-nondirectory file)
file-dir (file-name-directory file)))
(list (read-file-name (if current-prefix-arg
"Byte compile file: "
"Byte recompile file: ")
bytecomp-file-dir bytecomp-file-name nil)
file-dir file-name nil)
current-prefix-arg)))
(let ((bytecomp-dest
(byte-compile-dest-file bytecomp-filename))
(let ((dest (byte-compile-dest-file filename))
;; Expand now so we get the current buffer's defaults
(bytecomp-filename (expand-file-name bytecomp-filename)))
(if (if (file-exists-p bytecomp-dest)
(filename (expand-file-name filename)))
(if (if (file-exists-p dest)
;; File was already compiled
;; Compile if forced to, or filename newer
(or bytecomp-force
(file-newer-than-file-p bytecomp-filename
bytecomp-dest))
(and bytecomp-arg
(or (eq 0 bytecomp-arg)
(or force
(file-newer-than-file-p filename dest))
(and arg
(or (eq 0 arg)
(y-or-n-p (concat "Compile "
bytecomp-filename "? ")))))
filename "? ")))))
(progn
(if (and noninteractive (not byte-compile-verbose))
(message "Compiling %s..." bytecomp-filename))
(byte-compile-file bytecomp-filename load))
(when load (load bytecomp-filename))
(message "Compiling %s..." filename))
(byte-compile-file filename load))
(when load (load filename))
'no-byte-compile)))
;;;###autoload
(defun byte-compile-file (bytecomp-filename &optional load)
"Compile a file of Lisp code named BYTECOMP-FILENAME into a file of byte code.
The output file's name is generated by passing BYTECOMP-FILENAME to the
(defun byte-compile-file (filename &optional load)
"Compile a file of Lisp code named FILENAME into a file of byte code.
The output file's name is generated by passing FILENAME to the
function `byte-compile-dest-file' (which see).
With prefix arg (noninteractively: 2nd arg), LOAD the file after compiling.
The value is non-nil if there were no errors, nil if errors."
;; (interactive "fByte compile file: \nP")
(interactive
(let ((bytecomp-file buffer-file-name)
(bytecomp-file-name nil)
(bytecomp-file-dir nil))
(and bytecomp-file
(let ((file buffer-file-name)
(file-name nil)
(file-dir nil))
(and file
(derived-mode-p 'emacs-lisp-mode)
(setq bytecomp-file-name (file-name-nondirectory bytecomp-file)
bytecomp-file-dir (file-name-directory bytecomp-file)))
(setq file-name (file-name-nondirectory file)
file-dir (file-name-directory file)))
(list (read-file-name (if current-prefix-arg
"Byte compile and load file: "
"Byte compile file: ")
bytecomp-file-dir bytecomp-file-name nil)
file-dir file-name nil)
current-prefix-arg)))
;; Expand now so we get the current buffer's defaults
(setq bytecomp-filename (expand-file-name bytecomp-filename))
(setq filename (expand-file-name filename))
;; If we're compiling a file that's in a buffer and is modified, offer
;; to save it first.
(or noninteractive
(let ((b (get-file-buffer (expand-file-name bytecomp-filename))))
(let ((b (get-file-buffer (expand-file-name filename))))
(if (and b (buffer-modified-p b)
(y-or-n-p (format "Save buffer %s first? " (buffer-name b))))
(with-current-buffer b (save-buffer)))))
;; Force logging of the file name for each file compiled.
(setq byte-compile-last-logged-file nil)
(let ((byte-compile-current-file bytecomp-filename)
(let ((byte-compile-current-file filename)
(byte-compile-current-group nil)
(set-auto-coding-for-load t)
target-file input-buffer output-buffer
byte-compile-dest-file)
(setq target-file (byte-compile-dest-file bytecomp-filename))
(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*"))
@ -1762,7 +1738,7 @@ The value is non-nil if there were no errors, nil if errors."
;; Always compile an Emacs Lisp file as multibyte
;; unless the file itself forces unibyte with -*-coding: raw-text;-*-
(set-buffer-multibyte t)
(insert-file-contents bytecomp-filename)
(insert-file-contents filename)
;; Mimic the way after-insert-file-set-coding can make the
;; buffer unibyte when visiting this file.
(when (or (eq last-coding-system-used 'no-conversion)
@ -1772,7 +1748,7 @@ The value is non-nil if there were no errors, nil if errors."
(set-buffer-multibyte nil))
;; Run hooks including the uncompression hook.
;; If they change the file name, then change it for the output also.
(letf ((buffer-file-name bytecomp-filename)
(letf ((buffer-file-name filename)
((default-value 'major-mode) 'emacs-lisp-mode)
;; Ignore unsafe local variables.
;; We only care about a few of them for our purposes.
@ -1780,15 +1756,15 @@ The value is non-nil if there were no errors, nil if errors."
(enable-local-eval nil))
;; Arg of t means don't alter enable-local-variables.
(normal-mode t)
(setq bytecomp-filename buffer-file-name))
(setq filename buffer-file-name))
;; Set the default directory, in case an eval-when-compile uses it.
(setq default-directory (file-name-directory bytecomp-filename)))
(setq default-directory (file-name-directory filename)))
;; Check if the file's local variables explicitly specify not to
;; compile this file.
(if (with-current-buffer input-buffer no-byte-compile)
(progn
;; (message "%s not compiled because of `no-byte-compile: %s'"
;; (file-relative-name bytecomp-filename)
;; (file-relative-name filename)
;; (with-current-buffer input-buffer no-byte-compile))
(when (file-exists-p target-file)
(message "%s deleted because of `no-byte-compile: %s'"
@ -1798,7 +1774,7 @@ The value is non-nil if there were no errors, nil if errors."
;; We successfully didn't compile this file.
'no-byte-compile)
(when byte-compile-verbose
(message "Compiling %s..." bytecomp-filename))
(message "Compiling %s..." filename))
(setq byte-compiler-error-flag nil)
;; It is important that input-buffer not be current at this call,
;; so that the value of point set in input-buffer
@ -1809,7 +1785,7 @@ The value is non-nil if there were no errors, nil if errors."
(if byte-compiler-error-flag
nil
(when byte-compile-verbose
(message "Compiling %s...done" bytecomp-filename))
(message "Compiling %s...done" filename))
(kill-buffer input-buffer)
(with-current-buffer output-buffer
(goto-char (point-max))
@ -1849,9 +1825,9 @@ The value is non-nil if there were no errors, nil if errors."
(if (and byte-compile-generate-call-tree
(or (eq t byte-compile-generate-call-tree)
(y-or-n-p (format "Report call tree for %s? "
bytecomp-filename))))
filename))))
(save-excursion
(display-call-tree bytecomp-filename)))
(display-call-tree filename)))
(if load
(load target-file))
t))))
@ -1885,11 +1861,11 @@ With argument ARG, insert value in current buffer after the form."
;; Dynamically bound in byte-compile-from-buffer.
;; NB also used in cl.el and cl-macs.el.
(defvar bytecomp-outbuffer)
(defvar byte-compile-outbuffer)
(defun byte-compile-from-buffer (bytecomp-inbuffer)
(let (bytecomp-outbuffer
(byte-compile-current-buffer bytecomp-inbuffer)
(defun byte-compile-from-buffer (inbuffer)
(let (byte-compile-outbuffer
(byte-compile-current-buffer inbuffer)
(byte-compile-read-position nil)
(byte-compile-last-position nil)
;; Prevent truncation of flonums and lists as we read and print them
@ -1910,23 +1886,23 @@ With argument ARG, insert value in current buffer after the form."
(byte-compile-output nil)
;; This allows us to get the positions of symbols read; it's
;; new in Emacs 22.1.
(read-with-symbol-positions bytecomp-inbuffer)
(read-with-symbol-positions inbuffer)
(read-symbol-positions-list nil)
;; #### This is bound in b-c-close-variables.
;; (byte-compile-warnings byte-compile-warnings)
)
(byte-compile-close-variables
(with-current-buffer
(setq bytecomp-outbuffer (get-buffer-create " *Compiler Output*"))
(setq byte-compile-outbuffer (get-buffer-create " *Compiler Output*"))
(set-buffer-multibyte t)
(erase-buffer)
;; (emacs-lisp-mode)
(setq case-fold-search nil))
(displaying-byte-compile-warnings
(with-current-buffer bytecomp-inbuffer
(with-current-buffer inbuffer
(and byte-compile-current-file
(byte-compile-insert-header byte-compile-current-file
bytecomp-outbuffer))
byte-compile-outbuffer))
(goto-char (point-min))
;; Should we always do this? When calling multiple files, it
;; would be useful to delay this warning until all have been
@ -1943,7 +1919,7 @@ With argument ARG, insert value in current buffer after the form."
(setq byte-compile-read-position (point)
byte-compile-last-position byte-compile-read-position)
(let* ((old-style-backquotes nil)
(form (read bytecomp-inbuffer)))
(form (read inbuffer)))
;; Warn about the use of old-style backquotes.
(when old-style-backquotes
(byte-compile-warn "!! The file uses old-style backquotes !!
@ -1959,9 +1935,9 @@ and will be removed soon. See (elisp)Backquote in the manual."))
;; Fix up the header at the front of the output
;; if the buffer contains multibyte characters.
(and byte-compile-current-file
(with-current-buffer bytecomp-outbuffer
(with-current-buffer byte-compile-outbuffer
(byte-compile-fix-header byte-compile-current-file)))))
bytecomp-outbuffer))
byte-compile-outbuffer))
(defun byte-compile-fix-header (filename)
"If the current buffer has any multibyte characters, insert a version test."
@ -2070,8 +2046,8 @@ Call from the source buffer."
(print-gensym t)
(print-circle ; handle circular data structures
(not byte-compile-disable-print-circle)))
(princ "\n" bytecomp-outbuffer)
(prin1 form bytecomp-outbuffer)
(princ "\n" byte-compile-outbuffer)
(prin1 form byte-compile-outbuffer)
nil)))
(defvar print-gensym-alist) ;Used before print-circle existed.
@ -2091,7 +2067,7 @@ list that represents a doc string reference.
;; We need to examine byte-compile-dynamic-docstrings
;; in the input buffer (now current), not in the output buffer.
(let ((dynamic-docstrings byte-compile-dynamic-docstrings))
(with-current-buffer bytecomp-outbuffer
(with-current-buffer byte-compile-outbuffer
(let (position)
;; Insert the doc string, and make it a comment with #@LENGTH.
@ -2115,7 +2091,7 @@ list that represents a doc string reference.
(if preface
(progn
(insert preface)
(prin1 name bytecomp-outbuffer)))
(prin1 name byte-compile-outbuffer)))
(insert (car info))
(let ((print-escape-newlines t)
(print-quoted t)
@ -2130,7 +2106,7 @@ list that represents a doc string reference.
(print-continuous-numbering t)
print-number-table
(index 0))
(prin1 (car form) bytecomp-outbuffer)
(prin1 (car form) byte-compile-outbuffer)
(while (setq form (cdr form))
(setq index (1+ index))
(insert " ")
@ -2153,35 +2129,35 @@ list that represents a doc string reference.
(setq position (- (position-bytes position)
(point-min) -1))
(princ (format "(#$ . %d) nil" position)
bytecomp-outbuffer)
byte-compile-outbuffer)
(setq form (cdr form))
(setq index (1+ index))))
((= index (nth 1 info))
(if position
(princ (format (if quoted "'(#$ . %d)" "(#$ . %d)")
position)
bytecomp-outbuffer)
byte-compile-outbuffer)
(let ((print-escape-newlines nil))
(goto-char (prog1 (1+ (point))
(prin1 (car form) bytecomp-outbuffer)))
(prin1 (car form) byte-compile-outbuffer)))
(insert "\\\n")
(goto-char (point-max)))))
(t
(prin1 (car form) bytecomp-outbuffer)))))
(prin1 (car form) byte-compile-outbuffer)))))
(insert (nth 2 info)))))
nil)
(defun byte-compile-keep-pending (form &optional bytecomp-handler)
(defun byte-compile-keep-pending (form &optional handler)
(if (memq byte-optimize '(t source))
(setq form (byte-optimize-form form t)))
(if bytecomp-handler
(if handler
(let ((byte-compile--for-effect t))
;; To avoid consing up monstrously large forms at load time, we split
;; the output regularly.
(and (memq (car-safe form) '(fset defalias))
(nthcdr 300 byte-compile-output)
(byte-compile-flush-pending))
(funcall bytecomp-handler form)
(funcall handler form)
(if byte-compile--for-effect
(byte-compile-discard)))
(byte-compile-form form t))
@ -2219,11 +2195,11 @@ list that represents a doc string reference.
;; byte-hunk-handlers can call this.
(defun byte-compile-file-form (form)
(let (bytecomp-handler)
(let (handler)
(cond ((and (consp form)
(symbolp (car form))
(setq bytecomp-handler (get (car form) 'byte-hunk-handler)))
(cond ((setq form (funcall bytecomp-handler form))
(setq handler (get (car form) 'byte-hunk-handler)))
(cond ((setq form (funcall handler form))
(byte-compile-flush-pending)
(byte-compile-output-file-form form))))
(t
@ -2385,32 +2361,30 @@ by side-effects."
res))
(defun byte-compile-file-form-defmumble (form macrop)
(let* ((bytecomp-name (car (cdr form)))
(bytecomp-this-kind (if macrop 'byte-compile-macro-environment
(let* ((name (car (cdr form)))
(this-kind (if macrop 'byte-compile-macro-environment
'byte-compile-function-environment))
(bytecomp-that-kind (if macrop 'byte-compile-function-environment
(that-kind (if macrop 'byte-compile-function-environment
'byte-compile-macro-environment))
(bytecomp-this-one (assq bytecomp-name
(symbol-value bytecomp-this-kind)))
(bytecomp-that-one (assq bytecomp-name
(symbol-value bytecomp-that-kind)))
(this-one (assq name (symbol-value this-kind)))
(that-one (assq name (symbol-value that-kind)))
(byte-compile-free-references nil)
(byte-compile-free-assignments nil))
(byte-compile-set-symbol-position bytecomp-name)
(byte-compile-set-symbol-position name)
;; When a function or macro is defined, add it to the call tree so that
;; we can tell when functions are not used.
(if byte-compile-generate-call-tree
(or (assq bytecomp-name byte-compile-call-tree)
(or (assq name byte-compile-call-tree)
(setq byte-compile-call-tree
(cons (list bytecomp-name nil nil) byte-compile-call-tree))))
(cons (list name nil nil) byte-compile-call-tree))))
(setq byte-compile-current-form bytecomp-name) ; for warnings
(setq byte-compile-current-form name) ; for warnings
(if (byte-compile-warning-enabled-p 'redefine)
(byte-compile-arglist-warn form macrop))
(if byte-compile-verbose
(message "Compiling %s... (%s)"
(or byte-compile-current-file "") (nth 1 form)))
(cond (bytecomp-that-one
(cond (that-one
(if (and (byte-compile-warning-enabled-p 'redefine)
;; don't warn when compiling the stubs in byte-run...
(not (assq (nth 1 form)
@ -2418,8 +2392,8 @@ by side-effects."
(byte-compile-warn
"`%s' defined multiple times, as both function and macro"
(nth 1 form)))
(setcdr bytecomp-that-one nil))
(bytecomp-this-one
(setcdr that-one nil))
(this-one
(when (and (byte-compile-warning-enabled-p 'redefine)
;; hack: don't warn when compiling the magic internal
;; byte-compiler macros in byte-run.el...
@ -2428,8 +2402,8 @@ by side-effects."
(byte-compile-warn "%s `%s' defined multiple times in this file"
(if macrop "macro" "function")
(nth 1 form))))
((and (fboundp bytecomp-name)
(eq (car-safe (symbol-function bytecomp-name))
((and (fboundp name)
(eq (car-safe (symbol-function name))
(if macrop 'lambda 'macro)))
(when (byte-compile-warning-enabled-p 'redefine)
(byte-compile-warn "%s `%s' being redefined as a %s"
@ -2437,9 +2411,9 @@ by side-effects."
(nth 1 form)
(if macrop "macro" "function")))
;; shadow existing definition
(set bytecomp-this-kind
(cons (cons bytecomp-name nil)
(symbol-value bytecomp-this-kind))))
(set this-kind
(cons (cons name nil)
(symbol-value this-kind))))
)
(let ((body (nthcdr 3 form)))
(when (and (stringp (car body))
@ -2454,27 +2428,27 @@ by side-effects."
;; Remove declarations from the body of the macro definition.
(when macrop
(dolist (decl (byte-compile-defmacro-declaration form))
(prin1 decl bytecomp-outbuffer)))
(prin1 decl byte-compile-outbuffer)))
(let* ((new-one (byte-compile-lambda (nthcdr 2 form) t))
(code (byte-compile-byte-code-maker new-one)))
(if bytecomp-this-one
(setcdr bytecomp-this-one new-one)
(set bytecomp-this-kind
(cons (cons bytecomp-name new-one)
(symbol-value bytecomp-this-kind))))
(if this-one
(setcdr this-one new-one)
(set this-kind
(cons (cons name new-one)
(symbol-value this-kind))))
(if (and (stringp (nth 3 form))
(eq 'quote (car-safe code))
(eq 'lambda (car-safe (nth 1 code))))
(cons (car form)
(cons bytecomp-name (cdr (nth 1 code))))
(cons name (cdr (nth 1 code))))
(byte-compile-flush-pending)
(if (not (stringp (nth 3 form)))
;; No doc string. Provide -1 as the "doc string index"
;; so that no element will be treated as a doc string.
(byte-compile-output-docform
"\n(defalias '"
bytecomp-name
name
(cond ((atom code)
(if macrop '(" '(macro . #[" -1 "])") '(" #[" -1 "]")))
((eq (car code) 'quote)
@ -2489,7 +2463,7 @@ by side-effects."
;; b-c-output-file-form analyze the defalias.
(byte-compile-output-docform
"\n(defalias '"
bytecomp-name
name
(cond ((atom code)
(if macrop '(" '(macro . #[" 4 "])") '(" #[" 4 "]")))
((eq (car code) 'quote)
@ -2500,7 +2474,7 @@ by side-effects."
(and (atom code) byte-compile-dynamic
1)
nil))
(princ ")" bytecomp-outbuffer)
(princ ")" byte-compile-outbuffer)
nil))))
;; Print Lisp object EXP in the output file, inside a comment,
@ -2508,13 +2482,13 @@ by side-effects."
;; If QUOTED is non-nil, print with quoting; otherwise, print without quoting.
(defun byte-compile-output-as-comment (exp quoted)
(let ((position (point)))
(with-current-buffer bytecomp-outbuffer
(with-current-buffer byte-compile-outbuffer
;; Insert EXP, and make it a comment with #@LENGTH.
(insert " ")
(if quoted
(prin1 exp bytecomp-outbuffer)
(princ exp bytecomp-outbuffer))
(prin1 exp byte-compile-outbuffer)
(princ exp byte-compile-outbuffer))
(goto-char position)
;; Quote certain special characters as needed.
;; get_doc_string in doc.c does the unquoting.
@ -2693,41 +2667,41 @@ If FORM is a lambda or a macro, byte-compile it as a function."
;; of the list FUN and `byte-compile-set-symbol-position' is not called.
;; Use this feature to avoid calling `byte-compile-set-symbol-position'
;; for symbols generated by the byte compiler itself.
(defun byte-compile-lambda (bytecomp-fun &optional add-lambda reserved-csts)
(defun byte-compile-lambda (fun &optional add-lambda reserved-csts)
(if add-lambda
(setq bytecomp-fun (cons 'lambda bytecomp-fun))
(unless (eq 'lambda (car-safe bytecomp-fun))
(error "Not a lambda list: %S" bytecomp-fun))
(setq fun (cons 'lambda fun))
(unless (eq 'lambda (car-safe fun))
(error "Not a lambda list: %S" fun))
(byte-compile-set-symbol-position 'lambda))
(byte-compile-check-lambda-list (nth 1 bytecomp-fun))
(let* ((bytecomp-arglist (nth 1 bytecomp-fun))
(byte-compile-check-lambda-list (nth 1 fun))
(let* ((arglist (nth 1 fun))
(byte-compile-bound-variables
(append (and (not lexical-binding)
(byte-compile-arglist-vars bytecomp-arglist))
(byte-compile-arglist-vars arglist))
byte-compile-bound-variables))
(bytecomp-body (cdr (cdr bytecomp-fun)))
(bytecomp-doc (if (stringp (car bytecomp-body))
(prog1 (car bytecomp-body)
;; Discard the doc string
;; unless it is the last element of the body.
(if (cdr bytecomp-body)
(setq bytecomp-body (cdr bytecomp-body))))))
(bytecomp-int (assq 'interactive bytecomp-body)))
(body (cdr (cdr fun)))
(doc (if (stringp (car body))
(prog1 (car body)
;; Discard the doc string
;; unless it is the last element of the body.
(if (cdr body)
(setq body (cdr body))))))
(int (assq 'interactive body)))
;; Process the interactive spec.
(when bytecomp-int
(when int
(byte-compile-set-symbol-position 'interactive)
;; Skip (interactive) if it is in front (the most usual location).
(if (eq bytecomp-int (car bytecomp-body))
(setq bytecomp-body (cdr bytecomp-body)))
(cond ((consp (cdr bytecomp-int))
(if (cdr (cdr bytecomp-int))
(if (eq int (car body))
(setq body (cdr body)))
(cond ((consp (cdr int))
(if (cdr (cdr int))
(byte-compile-warn "malformed interactive spec: %s"
(prin1-to-string bytecomp-int)))
(prin1-to-string int)))
;; If the interactive spec is a call to `list', don't
;; compile it, because `call-interactively' looks at the
;; args of `list'. Actually, compile it to get warnings,
;; but don't use the result.
(let* ((form (nth 1 bytecomp-int))
(let* ((form (nth 1 int))
(newform (byte-compile-top-level form)))
(while (memq (car-safe form) '(let let* progn save-excursion))
(while (consp (cdr form))
@ -2739,48 +2713,46 @@ If FORM is a lambda or a macro, byte-compile it as a function."
;; it won't be eval'd in the right mode.
(not lexical-binding))
nil
(setq bytecomp-int `(interactive ,newform)))))
((cdr bytecomp-int)
(setq int `(interactive ,newform)))))
((cdr int)
(byte-compile-warn "malformed interactive spec: %s"
(prin1-to-string bytecomp-int)))))
(prin1-to-string int)))))
;; Process the body.
(let ((compiled
(byte-compile-top-level (cons 'progn bytecomp-body) nil 'lambda
(byte-compile-top-level (cons 'progn body) nil 'lambda
;; If doing lexical binding, push a new
;; lexical environment containing just the
;; args (since lambda expressions should be
;; closed by now).
(and lexical-binding
(byte-compile-make-lambda-lexenv
bytecomp-fun))
(byte-compile-make-lambda-lexenv fun))
reserved-csts)))
;; Build the actual byte-coded function.
(if (eq 'byte-code (car-safe compiled))
(apply 'make-byte-code
(if lexical-binding
(byte-compile-make-args-desc bytecomp-arglist)
bytecomp-arglist)
(byte-compile-make-args-desc arglist)
arglist)
(append
;; byte-string, constants-vector, stack depth
(cdr compiled)
;; optionally, the doc string.
(cond (lexical-binding
(require 'help-fns)
(list (help-add-fundoc-usage
bytecomp-doc bytecomp-arglist)))
((or bytecomp-doc bytecomp-int)
(list bytecomp-doc)))
(list (help-add-fundoc-usage doc arglist)))
((or doc int)
(list doc)))
;; optionally, the interactive spec.
(if bytecomp-int
(list (nth 1 bytecomp-int)))))
(if int
(list (nth 1 int)))))
(setq compiled
(nconc (if bytecomp-int (list bytecomp-int))
(nconc (if int (list int))
(cond ((eq (car-safe compiled) 'progn) (cdr compiled))
(compiled (list compiled)))))
(nconc (list 'lambda bytecomp-arglist)
(if (or bytecomp-doc (stringp (car compiled)))
(cons bytecomp-doc (cond (compiled)
(bytecomp-body (list nil))))
(nconc (list 'lambda arglist)
(if (or doc (stringp (car compiled)))
(cons doc (cond (compiled)
(body (list nil))))
compiled))))))
(defun byte-compile-closure (form &optional add-lambda)
@ -2951,14 +2923,14 @@ If FORM is a lambda or a macro, byte-compile it as a function."
((cdr body) (cons 'progn (nreverse body)))
((car body)))))
;; Given BYTECOMP-BODY, compile it and return a new body.
(defun byte-compile-top-level-body (bytecomp-body &optional for-effect)
(setq bytecomp-body
(byte-compile-top-level (cons 'progn bytecomp-body) for-effect t))
(cond ((eq (car-safe bytecomp-body) 'progn)
(cdr bytecomp-body))
(bytecomp-body
(list bytecomp-body))))
;; Given BODY, compile it and return a new body.
(defun byte-compile-top-level-body (body &optional for-effect)
(setq body
(byte-compile-top-level (cons 'progn body) for-effect t))
(cond ((eq (car-safe body) 'progn)
(cdr body))
(body
(list body))))
;; Special macro-expander used during byte-compilation.
(defun byte-compile-macroexpand-declare-function (fn file &rest args)
@ -3002,28 +2974,28 @@ If FORM is a lambda or a macro, byte-compile it as a function."
(t
(byte-compile-variable-ref form))))
((symbolp (car form))
(let* ((bytecomp-fn (car form))
(bytecomp-handler (get bytecomp-fn 'byte-compile)))
(when (byte-compile-const-symbol-p bytecomp-fn)
(byte-compile-warn "`%s' called as a function" bytecomp-fn))
(let* ((fn (car form))
(handler (get fn 'byte-compile)))
(when (byte-compile-const-symbol-p fn)
(byte-compile-warn "`%s' called as a function" fn))
(and (byte-compile-warning-enabled-p 'interactive-only)
(memq bytecomp-fn byte-compile-interactive-only-functions)
(memq fn byte-compile-interactive-only-functions)
(byte-compile-warn "`%s' used from Lisp code\n\
That command is designed for interactive use only" bytecomp-fn))
That command is designed for interactive use only" fn))
(if (and (fboundp (car form))
(eq (car-safe (symbol-function (car form))) 'macro))
(byte-compile-report-error
(format "Forgot to expand macro %s" (car form))))
(if (and bytecomp-handler
(if (and handler
;; Make sure that function exists. This is important
;; for CL compiler macros since the symbol may be
;; `cl-byte-compile-compiler-macro' but if CL isn't
;; loaded, this function doesn't exist.
(and (not (eq bytecomp-handler
(and (not (eq handler
;; Already handled by macroexpand-all.
'cl-byte-compile-compiler-macro))
(functionp bytecomp-handler)))
(funcall bytecomp-handler form)
(functionp handler)))
(funcall handler form)
(byte-compile-normal-call form))
(if (byte-compile-warning-enabled-p 'cl-functions)
(byte-compile-cl-warn form))))
@ -3609,14 +3581,14 @@ discarding."
(byte-defop-compiler-1 quote)
(defun byte-compile-setq (form)
(let ((bytecomp-args (cdr form)))
(if bytecomp-args
(while bytecomp-args
(byte-compile-form (car (cdr bytecomp-args)))
(or byte-compile--for-effect (cdr (cdr bytecomp-args))
(let ((args (cdr form)))
(if args
(while args
(byte-compile-form (car (cdr args)))
(or byte-compile--for-effect (cdr (cdr args))
(byte-compile-out 'byte-dup 0))
(byte-compile-variable-set (car bytecomp-args))
(setq bytecomp-args (cdr (cdr bytecomp-args))))
(byte-compile-variable-set (car args))
(setq args (cdr (cdr args))))
;; (setq), with no arguments.
(byte-compile-form nil byte-compile--for-effect))
(setq byte-compile--for-effect nil)))
@ -3653,14 +3625,14 @@ discarding."
;;; control structures
(defun byte-compile-body (bytecomp-body &optional for-effect)
(while (cdr bytecomp-body)
(byte-compile-form (car bytecomp-body) t)
(setq bytecomp-body (cdr bytecomp-body)))
(byte-compile-form (car bytecomp-body) for-effect))
(defun byte-compile-body (body &optional for-effect)
(while (cdr body)
(byte-compile-form (car body) t)
(setq body (cdr body)))
(byte-compile-form (car body) for-effect))
(defsubst byte-compile-body-do-effect (bytecomp-body)
(byte-compile-body bytecomp-body byte-compile--for-effect)
(defsubst byte-compile-body-do-effect (body)
(byte-compile-body body byte-compile--for-effect)
(setq byte-compile--for-effect nil))
(defsubst byte-compile-form-do-effect (form)
@ -3818,10 +3790,10 @@ that suppresses all warnings during execution of BODY."
(defun byte-compile-and (form)
(let ((failtag (byte-compile-make-tag))
(bytecomp-args (cdr form)))
(if (null bytecomp-args)
(args (cdr form)))
(if (null args)
(byte-compile-form-do-effect t)
(byte-compile-and-recursion bytecomp-args failtag))))
(byte-compile-and-recursion args failtag))))
;; Handle compilation of a nontrivial `and' call.
;; We use tail recursion so we can use byte-compile-maybe-guarded.
@ -3837,10 +3809,10 @@ that suppresses all warnings during execution of BODY."
(defun byte-compile-or (form)
(let ((wintag (byte-compile-make-tag))
(bytecomp-args (cdr form)))
(if (null bytecomp-args)
(args (cdr form)))
(if (null args)
(byte-compile-form-do-effect nil)
(byte-compile-or-recursion bytecomp-args wintag))))
(byte-compile-or-recursion args wintag))))
;; Handle compilation of a nontrivial `or' call.
;; We use tail recursion so we can use byte-compile-maybe-guarded.
@ -4554,57 +4526,54 @@ already up-to-date."
(defvar command-line-args-left) ;Avoid 'free variable' warning
(if (not noninteractive)
(error "`batch-byte-compile' is to be used only with -batch"))
(let ((bytecomp-error nil))
(let ((error nil))
(while command-line-args-left
(if (file-directory-p (expand-file-name (car command-line-args-left)))
;; Directory as argument.
(let ((bytecomp-files (directory-files (car command-line-args-left)))
bytecomp-source bytecomp-dest)
(dolist (bytecomp-file bytecomp-files)
(if (and (string-match emacs-lisp-file-regexp bytecomp-file)
(not (auto-save-file-name-p bytecomp-file))
(setq bytecomp-source
(expand-file-name bytecomp-file
(let (source dest)
(dolist (file (directory-files (car command-line-args-left)))
(if (and (string-match emacs-lisp-file-regexp file)
(not (auto-save-file-name-p file))
(setq source
(expand-file-name file
(car command-line-args-left)))
(setq bytecomp-dest (byte-compile-dest-file
bytecomp-source))
(file-exists-p bytecomp-dest)
(file-newer-than-file-p bytecomp-source bytecomp-dest))
(if (null (batch-byte-compile-file bytecomp-source))
(setq bytecomp-error t)))))
(setq dest (byte-compile-dest-file source))
(file-exists-p dest)
(file-newer-than-file-p source dest))
(if (null (batch-byte-compile-file source))
(setq error t)))))
;; Specific file argument
(if (or (not noforce)
(let* ((bytecomp-source (car command-line-args-left))
(bytecomp-dest (byte-compile-dest-file
bytecomp-source)))
(or (not (file-exists-p bytecomp-dest))
(file-newer-than-file-p bytecomp-source bytecomp-dest))))
(let* ((source (car command-line-args-left))
(dest (byte-compile-dest-file source)))
(or (not (file-exists-p dest))
(file-newer-than-file-p source dest))))
(if (null (batch-byte-compile-file (car command-line-args-left)))
(setq bytecomp-error t))))
(setq error t))))
(setq command-line-args-left (cdr command-line-args-left)))
(kill-emacs (if bytecomp-error 1 0))))
(kill-emacs (if error 1 0))))
(defun batch-byte-compile-file (bytecomp-file)
(defun batch-byte-compile-file (file)
(if debug-on-error
(byte-compile-file bytecomp-file)
(byte-compile-file file)
(condition-case err
(byte-compile-file bytecomp-file)
(byte-compile-file file)
(file-error
(message (if (cdr err)
">>Error occurred processing %s: %s (%s)"
">>Error occurred processing %s: %s")
bytecomp-file
file
(get (car err) 'error-message)
(prin1-to-string (cdr err)))
(let ((bytecomp-destfile (byte-compile-dest-file bytecomp-file)))
(if (file-exists-p bytecomp-destfile)
(delete-file bytecomp-destfile)))
(let ((destfile (byte-compile-dest-file file)))
(if (file-exists-p destfile)
(delete-file destfile)))
nil)
(error
(message (if (cdr err)
">>Error occurred processing %s: %s (%s)"
">>Error occurred processing %s: %s")
bytecomp-file
file
(get (car err) 'error-message)
(prin1-to-string (cdr err)))
nil))))