Mercurial > emacs
changeset 15954:57a05abfc723
(byte-compile-out-toplevel): Always compile to byte code
if an uninterned symbol appears.
(byte-compile-byte-code-maker): Handle uninterned symbols
in the constant vector.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Wed, 28 Aug 1996 22:40:09 +0000 |
parents | 38a50022d610 |
children | 32d772cba2c1 |
files | lisp/emacs-lisp/bytecomp.el |
diffstat | 1 files changed, 47 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/emacs-lisp/bytecomp.el Wed Aug 28 21:33:50 1996 +0000 +++ b/lisp/emacs-lisp/bytecomp.el Wed Aug 28 22:40:09 1996 +0000 @@ -10,7 +10,7 @@ ;;; This version incorporates changes up to version 2.10 of the ;;; Zawinski-Furuseth compiler. -(defconst byte-compile-version "$Revision: 2.14 $") +(defconst byte-compile-version "$Revision: 2.15 $") ;; This file is part of GNU Emacs. @@ -1846,7 +1846,38 @@ ((atom fun) ; compiled function. ;; generate-emacs19-bytecodes must be on, otherwise byte-compile-lambda ;; would have produced a lambda. - fun) + (let ((const-vector (aref fun 2)) + (i 0) + (uninterned nil)) + ;; Find all the uninterned symbols that appear + ;; as constants in this function. + (while (< i (length const-vector)) + (and (symbolp (aref const-vector i)) + (not (eq (aref const-vector i) + (intern-soft (symbol-name (aref const-vector i))))) + (setq uninterned (cons i uninterned))) + (setq i (1+ i))) + ;; Arrange to regenrate the uninterned symbols + ;; when we read in this code to produce the compiled function. + (if uninterned + (let (modifiers) + (while uninterned + (let ((symbol (aref const-vector (car uninterned))) + fixup) + (setq fixup + ;; Some uninterned symbols specify how to + ;; regenerate them. + (if (get symbol 'byte-compile-regenerate) + `(aset const-vector ,(car uninterned) + ,(get symbol 'byte-compile-regenerate)) + `(aset const-vector ,(car uninterned) + (make-symbol ',(symbol-name symbol))))) + (setq modifiers (cons fixup modifiers))) + (setq uninterned (cdr uninterned))) + `(let* ((function ,fun) (const-vector (aref function 2))) + ,@modifiers + function)) + fun))) ;; b-c-lambda didn't produce a compiled-function, so it's either a trivial ;; function, or this is Emacs 18, or generate-emacs19-bytecodes is off. ((let (tmp) @@ -2057,13 +2088,20 @@ (while (cond ((memq (car (car rest)) '(byte-varref byte-constant)) (setq tmp (car (cdr (car rest)))) - (if (if (eq (car (car rest)) 'byte-constant) - (or (consp tmp) - (and (symbolp tmp) - (not (memq tmp '(nil t)))))) - (if maycall - (setq body (cons (list 'quote tmp) body))) - (setq body (cons tmp body)))) + ;; If we find an uninterned symbol as a constant + ;; or variable, this expression must be compiled! + ;; That is because byte-compile-byte-code-maker + ;; must get a chance to process the uninterned symbol. + (if (and (symbolp tmp) + (not (eq tmp (intern-soft (symbol-name tmp))))) + nil + (if (if (eq (car (car rest)) 'byte-constant) + (or (consp tmp) + (and (symbolp tmp) + (not (memq tmp '(nil t)))))) + (if maycall + (setq body (cons (list 'quote tmp) body))) + (setq body (cons tmp body))))) ((and maycall ;; Allow a funcall if at most one atom follows it. (null (nthcdr 3 rest))