changeset 57518:25bf13fe1c10

(byte-compile-eval): Don't process "cl" like other files. Instead, call byte-compile-find-cl-functions. (byte-compile-file-form-require): Detect "cl" from the arg value. (byte-compile-log-1): Bind inhibit-read-only. (byte-compile-warning-prefix, byte-compile-log-file): Likewise. (byte-compile-log-warning): Likewise.
author Richard M. Stallman <rms@gnu.org>
date Sat, 16 Oct 2004 15:20:24 +0000
parents 7a899182458c
children 817362bee028
files lisp/emacs-lisp/bytecomp.el
diffstat 1 files changed, 36 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/emacs-lisp/bytecomp.el	Sat Oct 16 15:12:25 2004 +0000
+++ b/lisp/emacs-lisp/bytecomp.el	Sat Oct 16 15:20:24 2004 +0000
@@ -792,7 +792,8 @@
 	    (let ((xs (pop hist-new))
 		  old-autoloads)
 	      ;; Make sure the file was not already loaded before.
-	      (unless (assoc (car xs) hist-orig)
+	      (unless (or (assoc (car xs) hist-orig)
+			  (equal (car xs) "cl"))
 		(dolist (s xs)
 		  (cond
 		   ((symbolp s)
@@ -809,7 +810,18 @@
 		(when (and (symbolp s) (not (memq s old-autoloads)))
 		  (push s byte-compile-noruntime-functions))
 		(when (and (consp s) (eq t (car s)))
-		  (push (cdr s) old-autoloads))))))))))
+		  (push (cdr s) old-autoloads)))))))
+      (when (memq 'cl-functions byte-compile-warnings)
+	(let ((hist-new load-history)
+	      (hist-nil-new current-load-list))
+	  ;; Go through load-history, look for newly loaded files
+	  ;; and mark all the functions defined therein.
+	  (while (and hist-new (not (eq hist-new hist-orig)))
+	    (let ((xs (pop hist-new))
+		  old-autoloads)
+	      ;; Make sure the file was not already loaded before.
+	      (when (and (equal (car xs) "cl") (not (assoc (car xs) hist-orig)))
+		(byte-compile-find-cl-functions)))))))))
 
 (defun byte-compile-eval-before-compile (form)
   "Evaluate FORM for `eval-and-compile'."
@@ -848,12 +860,13 @@
 ;; Log something that isn't a warning.
 (defun byte-compile-log-1 (string)
   (with-current-buffer "*Compile-Log*"
-    (goto-char (point-max))
-    (byte-compile-warning-prefix nil nil)
-    (cond (noninteractive
-	   (message " %s" string))
-	  (t
-	   (insert (format "%s\n" string))))))
+    (let ((inhibit-read-only t))
+      (goto-char (point-max))
+      (byte-compile-warning-prefix nil nil)
+      (cond (noninteractive
+	     (message " %s" string))
+	    (t
+	     (insert (format "%s\n" string)))))))
 
 (defvar byte-compile-read-position nil
   "Character position we began the last `read' from.")
@@ -904,7 +917,8 @@
 ;; This is used as warning-prefix for the compiler.
 ;; It is always called with the warnings buffer current.
 (defun byte-compile-warning-prefix (level entry)
-  (let* ((dir default-directory)
+  (let* ((inhibit-read-only t)
+	 (dir default-directory)
 	 (file (cond ((stringp byte-compile-current-file)
 		      (format "%s:" (file-relative-name byte-compile-current-file dir)))
 		     ((bufferp byte-compile-current-file)
@@ -950,7 +964,8 @@
        (save-excursion
 	 (set-buffer (get-buffer-create "*Compile-Log*"))
 	 (goto-char (point-max))
-	 (let* ((dir (and byte-compile-current-file
+	 (let* ((inhibit-read-only t)
+		(dir (and byte-compile-current-file
 			  (file-name-directory byte-compile-current-file)))
 		(was-same (equal default-directory dir))
 		pt)
@@ -984,7 +999,8 @@
 (defun byte-compile-log-warning (string &optional fill level)
   (let ((warning-prefix-function 'byte-compile-warning-prefix)
 	(warning-type-format "")
-	(warning-fill-prefix (if fill "    ")))
+	(warning-fill-prefix (if fill "    "))
+	(inhibit-read-only t))
     (display-warning 'bytecomp string level "*Compile-Log*")))
 
 (defun byte-compile-warn (format &rest args)
@@ -2140,17 +2156,15 @@
       (setq tail (cdr tail))))
   form)
 
-(put 'require 'byte-hunk-handler 'byte-compile-file-form-eval-boundary)
-(defun byte-compile-file-form-eval-boundary (form)
-  (let ((old-load-list current-load-list))
-    (eval form)
-    ;; (require 'cl) turns off warnings for cl functions.
-    (let ((tem current-load-list))
-      (while (not (eq tem old-load-list))
-	(when (equal (car tem) '(require . cl))
-	  (setq byte-compile-warnings
-		(remq 'cl-functions byte-compile-warnings)))
-	(setq tem (cdr tem)))))
+(put 'require 'byte-hunk-handler 'byte-compile-file-form-require)
+(defun byte-compile-file-form-require (form)
+  (let ((old-load-list current-load-list)
+	(args (mapcar 'eval (cdr form))))
+    (apply 'require args)
+    ;; Detech (require 'cl) in a way that works even if cl is already loaded.
+    (if (member (car args) '("cl" cl))
+	(setq byte-compile-warnings
+	      (remq 'cl-functions byte-compile-warnings))))
   (byte-compile-keep-pending form 'byte-compile-normal-call))
 
 (put 'progn 'byte-hunk-handler 'byte-compile-file-form-progn)