diff options
Diffstat (limited to 'lisp/emacs-lisp/bytecomp.el')
-rw-r--r-- | lisp/emacs-lisp/bytecomp.el | 149 |
1 files changed, 101 insertions, 48 deletions
diff --git a/lisp/emacs-lisp/bytecomp.el b/lisp/emacs-lisp/bytecomp.el index e878f5dea5f..6e7886e70bc 100644 --- a/lisp/emacs-lisp/bytecomp.el +++ b/lisp/emacs-lisp/bytecomp.el @@ -8,7 +8,9 @@ ;; Subsequently modified by RMS. -(defconst byte-compile-version "FSF 2.1") +;;; This version incorporates changes up to version 2.08 of the +;;; Zawinski-Furuseth compiler. +(defconst byte-compile-version "FSF 2.08") ;; This file is part of GNU Emacs. @@ -95,9 +97,13 @@ ;;; generic emacs 18. ;;; byte-compile-single-version Normally the byte-compiler will consult the ;;; above two variables at runtime, but if this -;;; variable is true when the compiler itself is +;;; is true before the compiler itself is loaded/ ;;; compiled, then the runtime checks will not be ;;; made, and compilation will be slightly faster. +;;; To use this, start up a fresh emacs, set this +;;; to t, reload the compiler's .el files, and +;;; recompile. Don't do this in an emacs that has +;;; already had the compiler loaded. ;;; byte-compile-overwrite-file If nil, delete old .elc files before saving. ;;; New Features: @@ -242,19 +248,17 @@ If it is 'byte, then only byte-level optimizations will be logged.") of `message.'") (defconst byte-compile-warning-types '(redefine callargs free-vars unresolved)) -(defvar byte-compile-warnings (not noninteractive) +(defvar byte-compile-warnings t "*List of warnings that the byte-compiler should issue (t for all). -Valid elements of this list are: -`free-vars' (references to variables not in the - current lexical scope) -`unresolved' (calls to unknown functions) -`callargs' (lambda calls with args that don't - match the lambda's definition) -`redefine' (function cell redefined from - a macro to a lambda or vice versa, - or redefined to take other args) -This variable defaults to nil in -batch mode, which is -slightly faster.") +Elements of the list may be be: + + free-vars references to variables not in the current lexical scope. + unresolved calls to unknown functions. + callargs lambda calls with args that don't match the definition. + redefine function cell redefined from a macro to a lambda or vice + versa, or redefined to take a different number of arguments. + +See also the macro byte-compiler-options.") (defvar byte-compile-generate-call-tree nil "*Non-nil means collect call-graph information when compiling. @@ -388,7 +392,7 @@ Each element is (INDEX . VALUE)") (byte-defop 24 -1 byte-varbind "for binding a variable") (byte-defop 32 0 byte-call "for calling a function") (byte-defop 40 0 byte-unbind "for unbinding special bindings") -;; codes 41-47 are consumed by the preceeding opcodes +;; codes 8-47 are consumed by the preceeding opcodes ;; unused: 48-55 @@ -684,7 +688,7 @@ otherwise pop it") (defconst byte-compile-last-warned-form nil) -(defun byte-compile-log-1 (string) +(defun byte-compile-log-1 (string &optional fill) (cond (noninteractive (if (or byte-compile-current-file (and byte-compile-last-warned-form @@ -719,7 +723,12 @@ otherwise pop it") (insert " in buffer " (buffer-name byte-compile-current-file)))) (insert ":\n"))) - (insert " " string "\n")))) + (insert " " string "\n") + (if (and fill (not (string-match "\n" string))) + (let ((fill-prefix " ") + (fill-column 78)) + (fill-paragraph nil))) + ))) (setq byte-compile-current-file nil byte-compile-last-warned-form byte-compile-current-form)) @@ -727,7 +736,7 @@ otherwise pop it") (setq format (apply 'format format args)) (if byte-compile-error-on-warn (error "%s" format) ; byte-compile-file catches and logs it - (byte-compile-log-1 (concat "** " format)) + (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. @@ -737,10 +746,11 @@ otherwise pop it") ;;; This function should be used to report errors that have halted ;;; compilation of the current file. (defun byte-compile-report-error (error-info) - (setq format (format (if (cdr error-info) "%s (%s)" "%s") - (get (car error-info) 'error-message) - (prin1-to-string (cdr error-info)))) - (byte-compile-log-1 (concat "!! " format))) + (byte-compile-log-1 + (concat "!! " + (format (if (cdr error-info) "%s (%s)" "%s") + (get (car error-info) 'error-message) + (prin1-to-string (cdr error-info)))))) ;;; Used by make-obsolete. (defun byte-compile-obsolete (form) @@ -1036,26 +1046,49 @@ This is if a `.elc' file exists but is older than the `.el' file. If the `.elc' file does not exist, normally the `.el' file is *not* compiled. But a prefix argument (optional second arg) means ask user, -for each such `.el' file, whether to compile it." +for each such `.el' file, whether to compile it. Prefix argument 0 means +don't ask and compile the file anyway." (interactive "DByte recompile directory: \nP") (save-some-buffers) - (set-buffer-modified-p (buffer-modified-p)) ;Update the mode line. - (setq directory (expand-file-name directory)) - (let ((files (directory-files directory nil emacs-lisp-file-regexp)) - (count 0) - source dest) - (while files - (if (and (not (auto-save-file-name-p (car files))) - (setq source (expand-file-name (car files) directory)) - (setq dest (byte-compile-dest-file source)) - (if (file-exists-p dest) - (file-newer-than-file-p source dest) - (and arg (y-or-n-p (concat "Compile " source "? "))))) - (progn (byte-compile-file source) - (setq count (1+ count)))) - (setq files (cdr files))) - (message "Done (Total of %d file%s compiled)" - count (if (= count 1) "" "s")))) + (set-buffer-modified-p (buffer-modified-p)) ;Update the mode line. + (let ((directories (list (expand-file-name directory))) + (file-count 0) + (dir-count 0) + last-dir) + (displaying-byte-compile-warnings + (while directories + (setq directory (car directories)) + (message "Checking %s..." directory) + (let ((files (directory-files directory)) + source dest) + (while files + (setq source (expand-file-name (car files) directory)) + (if (and (not (member (car files) '("." ".." "RCS" "CVS"))) + (file-directory-p source)) + (if (or (null arg) + (eq arg 0) + (y-or-n-p (concat "Check " source "? "))) + (setq directories + (nconc directories (list source)))) + (if (and (string-match emacs-lisp-file-regexp source) + (not (auto-save-file-name-p source)) + (setq dest (byte-compile-dest-file source)) + (if (file-exists-p dest) + (file-newer-than-file-p source dest) + (and arg + (or (zerop arg) + (y-or-n-p (concat "Compile " source "? ")))))) + (progn (byte-compile-file source) + (setq file-count (1+ file-count)) + (if (not (eq last-dir directory)) + (setq last-dir directory + dir-count (1+ dir-count))) + ))) + (setq files (cdr files)))) + (setq directories (cdr directories)))) + (message "Done (Total of %d file%s compiled%s)" + file-count (if (= file-count 1) "" "s") + (if (> dir-count 1) (format " in %d directories" dir-count) "")))) ;;;###autoload (defun byte-compile-file (filename &optional load) @@ -1276,7 +1309,8 @@ With argument, insert value in current buffer after the form." (stringp (nth 3 form))) (byte-compile-output-docform '("\n(" 3 ")") form) (let ((print-escape-newlines t) - (print-readably t)) + (print-readably t) ; print #[] for bytecode, 'x for (quote x) + (print-gensym nil)) ; this is too dangerous for now (princ "\n" outbuffer) (prin1 form outbuffer) nil))) @@ -1289,7 +1323,8 @@ With argument, insert value in current buffer after the form." (insert (car info)) (let ((docl (nthcdr (nth 1 info) form)) (print-escape-newlines t) - (print-readably t)) + (print-readably t) ; print #[] for bytecode, 'x for (quote x) + (print-gensym nil)) ; this is too dangerous for now (prin1 (car form) outbuffer) (while (setq form (cdr form)) (insert " ") @@ -1813,6 +1848,8 @@ If FORM is a lambda or a macro, byte-compile it as a function." ((symbolp (car form)) (let* ((fn (car form)) (handler (get fn 'byte-compile))) + (if (memq fn '(t nil)) + (byte-compile-warn "%s called as a function" fn)) (if (and handler (or (byte-compile-version-cond byte-compile-compatibility) @@ -1846,6 +1883,12 @@ If FORM is a lambda or a macro, byte-compile it as a function." "Variable reference to %s %s") (if (symbolp var) "constant" "nonvariable") (prin1-to-string var)) + (if (get var 'byte-obsolete-variable) + (let ((ob (get var 'byte-obsolete-variable))) + (byte-compile-warn "%s is an obsolete variable; %s" var + (if (stringp ob) + ob + (format "use %s instead." ob))))) (if (memq 'free-vars byte-compile-warnings) (if (eq base-op 'byte-varbind) (setq byte-compile-bound-variables @@ -1933,6 +1976,9 @@ If FORM is a lambda or a macro, byte-compile it as a function." ;; be used when byte-compile-compatibility is true. (if (and (byte-compile-single-version) (not byte-compile-compatibility)) + ;; #### instead of doing nothing, this should do some remprops, + ;; #### to protect against the case where a single-version compiler + ;; #### is loaded into a world that has contained a multi-version one. nil (list 'progn (list 'put @@ -2020,7 +2066,7 @@ If FORM is a lambda or a macro, byte-compile it as a function." (byte-defop-compiler get 2) (byte-defop-compiler nth 2) (byte-defop-compiler substring 2-3) -(byte-defop-compiler (move-marker byte-set-marker) 2-3) +(byte-defop-compiler19 (move-marker byte-set-marker) 2-3) (byte-defop-compiler19 set-marker 2-3) (byte-defop-compiler19 match-beginning 1) (byte-defop-compiler19 match-end 1) @@ -2028,21 +2074,21 @@ If FORM is a lambda or a macro, byte-compile it as a function." (byte-defop-compiler19 downcase 1) (byte-defop-compiler19 string= 2) (byte-defop-compiler19 string< 2) -(byte-defop-compiler (string-equal byte-string=) 2) -(byte-defop-compiler (string-lessp byte-string<) 2) +(byte-defop-compiler19 (string-equal byte-string=) 2) +(byte-defop-compiler19 (string-lessp byte-string<) 2) (byte-defop-compiler19 equal 2) (byte-defop-compiler19 nthcdr 2) (byte-defop-compiler19 elt 2) (byte-defop-compiler19 member 2) (byte-defop-compiler19 assq 2) -(byte-defop-compiler (rplaca byte-setcar) 2) -(byte-defop-compiler (rplacd byte-setcdr) 2) +(byte-defop-compiler19 (rplaca byte-setcar) 2) +(byte-defop-compiler19 (rplacd byte-setcdr) 2) (byte-defop-compiler19 setcar 2) (byte-defop-compiler19 setcdr 2) (byte-defop-compiler19 buffer-substring 2) (byte-defop-compiler19 delete-region 2) (byte-defop-compiler19 narrow-to-region 2) -(byte-defop-compiler (mod byte-rem) 2) +(byte-defop-compiler19 (mod byte-rem) 2) (byte-defop-compiler19 (% byte-rem) 2) (byte-defop-compiler aset 3) @@ -2903,6 +2949,13 @@ For example, invoke \"emacs -batch -f batch-byte-compile $emacs/ ~/*.el\"" (make-obsolete 'buffer-flush-undo 'buffer-disable-undo) (make-obsolete 'baud-rate "use the baud-rate variable instead") +(make-obsolete-variable 'auto-fill-hook 'auto-fill-function) +(make-obsolete-variable 'blink-paren-hook 'blink-paren-function) +(make-obsolete-variable 'lisp-indent-hook 'lisp-indent-function) +(make-obsolete-variable 'temp-buffer-show-hook + 'temp-buffer-show-function) +(make-obsolete-variable 'inhibit-local-variables + "use enable-local-variables (with the reversed sense.)") (provide 'byte-compile) |