mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-12-13 09:32:47 +00:00
(byte-recompile-directory): Make sure the file is readable.
(byte-compile-file): Don't compile if `no-byte-compile' is set. (byte-compile-defvar): Update to reflect the change in Fdefvar. (batch-byte-recompile-directory): Pass arg=0.
This commit is contained in:
parent
a273d3e0c5
commit
3614fc84de
@ -10,7 +10,7 @@
|
||||
|
||||
;;; This version incorporates changes up to version 2.10 of the
|
||||
;;; Zawinski-Furuseth compiler.
|
||||
(defconst byte-compile-version "$Revision: 2.84 $")
|
||||
(defconst byte-compile-version "$Revision: 2.85.2.1 $")
|
||||
|
||||
;; This file is part of GNU Emacs.
|
||||
|
||||
@ -161,16 +161,16 @@
|
||||
;; This really ought to be loaded already!
|
||||
(load-library "byte-run"))
|
||||
|
||||
;;; The feature of compiling in a specific target Emacs version
|
||||
;;; has been turned off because compile time options are a bad idea.
|
||||
;; The feature of compiling in a specific target Emacs version
|
||||
;; has been turned off because compile time options are a bad idea.
|
||||
(defmacro byte-compile-single-version () nil)
|
||||
(defmacro byte-compile-version-cond (cond) cond)
|
||||
|
||||
;;; The crud you see scattered through this file of the form
|
||||
;;; (or (and (boundp 'epoch::version) epoch::version)
|
||||
;;; (string-lessp emacs-version "19"))
|
||||
;;; is because the Epoch folks couldn't be bothered to follow the
|
||||
;;; normal emacs version numbering convention.
|
||||
;; The crud you see scattered through this file of the form
|
||||
;; (or (and (boundp 'epoch::version) epoch::version)
|
||||
;; (string-lessp emacs-version "19"))
|
||||
;; is because the Epoch folks couldn't be bothered to follow the
|
||||
;; normal emacs version numbering convention.
|
||||
|
||||
;; (if (byte-compile-version-cond
|
||||
;; (or (and (boundp 'epoch::version) epoch::version)
|
||||
@ -663,35 +663,35 @@ otherwise pop it")
|
||||
(byte-extrude-byte-code-vectors)
|
||||
|
||||
;;; lapcode generator
|
||||
;;;
|
||||
;;; the byte-compiler now does source -> lapcode -> bytecode instead of
|
||||
;;; source -> bytecode, because it's a lot easier to make optimizations
|
||||
;;; on lapcode than on bytecode.
|
||||
;;;
|
||||
;;; Elements of the lapcode list are of the form (<instruction> . <parameter>)
|
||||
;;; where instruction is a symbol naming a byte-code instruction,
|
||||
;;; and parameter is an argument to that instruction, if any.
|
||||
;;;
|
||||
;;; The instruction can be the pseudo-op TAG, which means that this position
|
||||
;;; in the instruction stream is a target of a goto. (car PARAMETER) will be
|
||||
;;; the PC for this location, and the whole instruction "(TAG pc)" will be the
|
||||
;;; parameter for some goto op.
|
||||
;;;
|
||||
;;; If the operation is varbind, varref, varset or push-constant, then the
|
||||
;;; parameter is (variable/constant . index_in_constant_vector).
|
||||
;;;
|
||||
;;; First, the source code is macroexpanded and optimized in various ways.
|
||||
;;; Then the resultant code is compiled into lapcode. Another set of
|
||||
;;; optimizations are then run over the lapcode. Then the variables and
|
||||
;;; constants referenced by the lapcode are collected and placed in the
|
||||
;;; constants-vector. (This happens now so that variables referenced by dead
|
||||
;;; code don't consume space.) And finally, the lapcode is transformed into
|
||||
;;; compacted byte-code.
|
||||
;;;
|
||||
;;; A distinction is made between variables and constants because the variable-
|
||||
;;; referencing instructions are more sensitive to the variables being near the
|
||||
;;; front of the constants-vector than the constant-referencing instructions.
|
||||
;;; Also, this lets us notice references to free variables.
|
||||
;;
|
||||
;; the byte-compiler now does source -> lapcode -> bytecode instead of
|
||||
;; source -> bytecode, because it's a lot easier to make optimizations
|
||||
;; on lapcode than on bytecode.
|
||||
;;
|
||||
;; Elements of the lapcode list are of the form (<instruction> . <parameter>)
|
||||
;; where instruction is a symbol naming a byte-code instruction,
|
||||
;; and parameter is an argument to that instruction, if any.
|
||||
;;
|
||||
;; The instruction can be the pseudo-op TAG, which means that this position
|
||||
;; in the instruction stream is a target of a goto. (car PARAMETER) will be
|
||||
;; the PC for this location, and the whole instruction "(TAG pc)" will be the
|
||||
;; parameter for some goto op.
|
||||
;;
|
||||
;; If the operation is varbind, varref, varset or push-constant, then the
|
||||
;; parameter is (variable/constant . index_in_constant_vector).
|
||||
;;
|
||||
;; First, the source code is macroexpanded and optimized in various ways.
|
||||
;; Then the resultant code is compiled into lapcode. Another set of
|
||||
;; optimizations are then run over the lapcode. Then the variables and
|
||||
;; constants referenced by the lapcode are collected and placed in the
|
||||
;; constants-vector. (This happens now so that variables referenced by dead
|
||||
;; code don't consume space.) And finally, the lapcode is transformed into
|
||||
;; compacted byte-code.
|
||||
;;
|
||||
;; A distinction is made between variables and constants because the variable-
|
||||
;; referencing instructions are more sensitive to the variables being near the
|
||||
;; front of the constants-vector than the constant-referencing instructions.
|
||||
;; Also, this lets us notice references to free variables.
|
||||
|
||||
(defun byte-compile-lapcode (lap)
|
||||
"Turns lapcode into bytecode. The lapcode is destroyed."
|
||||
@ -842,23 +842,23 @@ Each function's symbol gets marked with the `byte-compile-noruntime' property."
|
||||
(and byte-compile-last-warned-form
|
||||
(not (eq byte-compile-current-form
|
||||
byte-compile-last-warned-form))))
|
||||
;;; This is redundant, since it is given at the start of the file,
|
||||
;;; and the extra clutter gets in the way -- rms.
|
||||
;;; (if (and byte-compile-current-file
|
||||
;;; (not (equal byte-compile-current-file
|
||||
;;; byte-compile-last-logged-file)))
|
||||
;;; (insert "\n\^L\n" (current-time-string) "\n"))
|
||||
;; This is redundant, since it is given at the start of the
|
||||
;; file, and the extra clutter gets in the way -- rms.
|
||||
;; (if (and byte-compile-current-file
|
||||
;; (not (equal byte-compile-current-file
|
||||
;; byte-compile-last-logged-file)))
|
||||
;; (insert "\n\^L\n" (current-time-string) "\n"))
|
||||
(insert "\nWhile compiling "
|
||||
(if byte-compile-current-form
|
||||
(format "%s" byte-compile-current-form)
|
||||
"toplevel forms"))
|
||||
;;; This is redundant, since it is given at the start of the file,
|
||||
;;; and the extra clutter gets in the way -- rms.
|
||||
;;; (if byte-compile-current-file
|
||||
;;; (if (stringp byte-compile-current-file)
|
||||
;;; (insert " in file " byte-compile-current-file)
|
||||
;;; (insert " in buffer "
|
||||
;;; (buffer-name byte-compile-current-file))))
|
||||
;; This is redundant, since it is given at the start of the file,
|
||||
;; and the extra clutter gets in the way -- rms.
|
||||
;; (if byte-compile-current-file
|
||||
;; (if (stringp byte-compile-current-file)
|
||||
;; (insert " in file " byte-compile-current-file)
|
||||
;; (insert " in buffer "
|
||||
;; (buffer-name byte-compile-current-file))))
|
||||
(insert ":\n")))
|
||||
(insert " " string "\n")
|
||||
(if (and fill (not (string-match "\n" string)))
|
||||
@ -890,10 +890,10 @@ Each function's symbol gets marked with the `byte-compile-noruntime' property."
|
||||
(if byte-compile-error-on-warn
|
||||
(error "%s" format) ; byte-compile-file catches and logs it
|
||||
(byte-compile-log-1 (concat "** " format) t)
|
||||
;;; It is useless to flash warnings too fast to be read.
|
||||
;;; Besides, they will all be shown at the end.
|
||||
;;; (or noninteractive ; already written on stdout.
|
||||
;;; (message "Warning: %s" format))
|
||||
;; It is useless to flash warnings too fast to be read.
|
||||
;; Besides, they will all be shown at the end.
|
||||
;; (or noninteractive ; already written on stdout.
|
||||
;; (message "Warning: %s" format))
|
||||
))
|
||||
|
||||
;;; This function should be used to report errors that have halted
|
||||
@ -1295,6 +1295,7 @@ recompile every `.el' file that already has a `.elc' file."
|
||||
(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))
|
||||
(setq dest (byte-compile-dest-file source))
|
||||
(if (file-exists-p dest)
|
||||
@ -1324,7 +1325,7 @@ recompile every `.el' file that already has a `.elc' file."
|
||||
(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 made by appending `c' to the end of FILENAME.
|
||||
With prefix arg (noninteractively: 2nd arg), load the file after compiling.
|
||||
With prefix arg (noninteractively: 2nd arg), LOAD the file after compiling.
|
||||
The value is t if there were no errors, nil if errors."
|
||||
;; (interactive "fByte compile file: \nP")
|
||||
(interactive
|
||||
@ -1352,8 +1353,6 @@ The value is t if there were no errors, nil if errors."
|
||||
(y-or-n-p (format "Save buffer %s first? " (buffer-name b))))
|
||||
(save-excursion (set-buffer b) (save-buffer)))))
|
||||
|
||||
(if byte-compile-verbose
|
||||
(message "Compiling %s..." filename))
|
||||
(let ((byte-compile-current-file filename)
|
||||
(byte-compile-last-logged-file nil)
|
||||
(set-auto-coding-for-load t)
|
||||
@ -1386,6 +1385,18 @@ The value is t if there were no errors, nil if errors."
|
||||
(setq filename buffer-file-name))
|
||||
;; Set the default directory, in case an eval-when-compile uses it.
|
||||
(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
|
||||
(and (boundp 'no-byte-compile) no-byte-compile))
|
||||
(progn
|
||||
(message "%s not compiled because of `no-byte-compile: %s'"
|
||||
(file-relative-name filename)
|
||||
(with-current-buffer input-buffer no-byte-compile))
|
||||
(if (file-exists-p target-file)
|
||||
(condition-case nil (delete-file target-file) (error nil))))
|
||||
(if byte-compile-verbose
|
||||
(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
|
||||
@ -1430,7 +1441,7 @@ The value is t if there were no errors, nil if errors."
|
||||
(display-call-tree filename)))
|
||||
(if load
|
||||
(load target-file))
|
||||
t)))
|
||||
t))))
|
||||
|
||||
;;(defun byte-compile-and-load-file (&optional filename)
|
||||
;; "Compile a file of Lisp code named FILENAME into a file of byte code,
|
||||
@ -3249,7 +3260,7 @@ If FORM is a lambda or a macro, byte-compile it as a function."
|
||||
(list
|
||||
;; Put the defined variable in this library's load-history entry
|
||||
;; just as a real defvar would, but only in top-level forms.
|
||||
(when (null byte-compile-current-form)
|
||||
(when (and (cddr form) (null byte-compile-current-form))
|
||||
`(push ',var current-load-list))
|
||||
(when (> (length form) 3)
|
||||
(when (and string (not (stringp string)))
|
||||
@ -3566,7 +3577,7 @@ For example, invoke `emacs -batch -f batch-byte-recompile-directory .'."
|
||||
(or command-line-args-left
|
||||
(setq command-line-args-left '(".")))
|
||||
(while command-line-args-left
|
||||
(byte-recompile-directory (car command-line-args-left))
|
||||
(byte-recompile-directory (car command-line-args-left) 0)
|
||||
(setq command-line-args-left (cdr command-line-args-left)))
|
||||
(kill-emacs 0))
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user