Mercurial > emacs
changeset 22047:678a1ed22116
(byte-compile-from-buffer):
Insert the output file header after compiling all the input.
(byte-compile-output-file-form): Major cleanup.
If output file contains multibyte chars,
insist on Emacs 20 when loading.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Wed, 13 May 1998 00:03:19 +0000 |
parents | ef9773bd8593 |
children | 26a0c01f7551 |
files | lisp/emacs-lisp/bytecomp.el |
diffstat | 1 files changed, 63 insertions(+), 37 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/emacs-lisp/bytecomp.el Tue May 12 23:27:21 1998 +0000 +++ b/lisp/emacs-lisp/bytecomp.el Wed May 13 00:03:19 1998 +0000 @@ -9,7 +9,7 @@ ;;; This version incorporates changes up to version 2.10 of the ;;; Zawinski-Furuseth compiler. -(defconst byte-compile-version "$Revision: 2.41 $") +(defconst byte-compile-version "$Revision: 2.42 $") ;; This file is part of GNU Emacs. @@ -1408,8 +1408,6 @@ (erase-buffer) ;; (emacs-lisp-mode) (setq case-fold-search nil) - (and filename (byte-compile-insert-header filename inbuffer outbuffer)) - ;; This is a kludge. Some operating systems (OS/2, DOS) need to ;; write files containing binary information specially. ;; Under most circumstances, such files will be in binary @@ -1436,29 +1434,40 @@ ;; Should we always do this? When calling multiple files, it ;; would be useful to delay this warning until all have ;; been compiled. - (setq byte-compile-unresolved-functions nil)))) + (setq byte-compile-unresolved-functions nil))) + ;; Insert the header at the front of the output. + ;; We do this last, so we can check for the presence + ;; of multibyte characters in the compiled code. + (and filename (byte-compile-insert-header filename inbuffer outbuffer))) outbuffer)) (defun byte-compile-insert-header (filename inbuffer outbuffer) (set-buffer inbuffer) (let ((dynamic-docstrings byte-compile-dynamic-docstrings) - (dynamic byte-compile-dynamic)) + (dynamic byte-compile-dynamic) + (some-multibyte-characters + (save-excursion + (goto-char 1) + ;; See if the buffer has any multibyte characters. + (skip-chars-forward "\0-\377") + (setq some-multibyte-characters (not (eobp)))))) + (set-buffer outbuffer) (goto-char 1) - ;; - ;; The magic number of .elc files is ";ELC", or 0x3B454C43. After that is - ;; the file-format version number (18 or 19) as a byte, followed by some - ;; nulls. The primary motivation for doing this is to get some binary - ;; characters up in the first line of the file so that `diff' will simply - ;; say "Binary files differ" instead of actually doing a diff of two .elc - ;; files. An extra benefit is that you can add this to /etc/magic: - ;; + ;; The magic number of .elc files is ";ELC", or 0x3B454C43. After + ;; that is the file-format version number (18, 19 or 20) as a + ;; byte, followed by some nulls. The primary motivation for doing + ;; this is to get some binary characters up in the first line of + ;; the file so that `diff' will simply say "Binary files differ" + ;; instead of actually doing a diff of two .elc files. An extra + ;; benefit is that you can add this to /etc/magic: + ;; 0 string ;ELC GNU Emacs Lisp compiled file, ;; >4 byte x version %d - ;; + (insert ";ELC" - (if (byte-compile-version-cond byte-compile-compatibility) 18 19) + (if (byte-compile-version-cond byte-compile-compatibility) 18 20) "\000\000\000\n" ) (insert ";;; Compiled by " @@ -1481,29 +1490,46 @@ ".\n")) (if dynamic (insert ";;; Function definitions are lazy-loaded.\n")) - (if (not (byte-compile-version-cond byte-compile-compatibility)) - (insert ";;; This file uses opcodes which do not exist in Emacs 18.\n" - ;; Have to check if emacs-version is bound so that this works - ;; in files loaded early in loadup.el. - "\n(if (and (boundp 'emacs-version)\n" - ;; If there is a name at the end of emacs-version, - ;; don't try to check the version number. - "\t (< (aref emacs-version (1- (length emacs-version))) ?A)\n" - "\t (or (and (boundp 'epoch::version) epoch::version)\n" - (if dynamic-docstrings - "\t (string-lessp emacs-version \"19.29\")))\n" - "\t (string-lessp emacs-version \"19\")))\n") - " (error \"`" - ;; prin1-to-string is used to quote backslashes. - (substring (prin1-to-string (file-name-nondirectory filename)) - 1 -1) - (if dynamic-docstrings - "' was compiled for Emacs 19.29 or later\"))\n\n" - "' was compiled for Emacs 19\"))\n\n")) + (if (or some-multibyte-characters + dynamic-docstrings + (not (byte-compile-version-cond byte-compile-compatibility))) + (let (intro-string minimum-version) + ;; Figure out which Emacs version to require, + ;; and what comment to use to explain why. + (if some-multibyte-characters + (setq intro-string + (concat + ";;; This file contains multibyte non-ASCII characters\n" + ";;; and therefore cannot be loaded into Emacs 19.\n") + minimum-version "20") + (if dynamic-docstrings + (setq intro-string + ";;; This file uses dynamic docstrings, first added in Emacs 19.29.\n" + minimum-version "19.29") + (setq intro-string + ";;; This file uses opcodes which do not exist in Emacs 18.\n" + minimum-version "19"))) + ;; Now insert the comment and the error check. + (insert + intro-string + ;; Have to check if emacs-version is bound so that this works + ;; in files loaded early in loadup.el. + "\n(if (and (boundp 'emacs-version)\n" + ;; If there is a name at the end of emacs-version, + ;; don't try to check the version number. + "\t (< (aref emacs-version (1- (length emacs-version))) ?A)\n" + "\t (or (and (boundp 'epoch::version) epoch::version)\n" + (format "\t (string-lessp emacs-version \"%s\")))\n" + minimum-version) + " (error \"`" + ;; prin1-to-string is used to quote backslashes. + (substring (prin1-to-string (file-name-nondirectory filename)) + 1 -1) + (format "' was compiled for Emacs %s or later\"))\n\n" + minimum-version))) + ;; Here if we want Emacs 18 compatibility. (insert "(or (boundp 'current-load-list) (setq current-load-list nil))\n" - "\n") - ))) - + "\n")))) (defun byte-compile-output-file-form (form) ;; writes the given form to the output buffer, being careful of docstrings