changeset 8086:9f6348616e4d

(byte-compile-callargs-warn): Handle function defnition that is not a lambda expression or byte code function. (byte-compile-arglist-warn): Likewise. (byte-compile-defalias): New function, used to compile defalias. (byte-compile-defalias-warn): New function.
author Richard M. Stallman <rms@gnu.org>
date Wed, 29 Jun 1994 18:06:09 +0000
parents c7eb887a1e78
children c22d7c5168f5
files lisp/emacs-lisp/bytecomp.el
diffstat 1 files changed, 36 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/emacs-lisp/bytecomp.el	Wed Jun 29 16:28:50 1994 +0000
+++ b/lisp/emacs-lisp/bytecomp.el	Wed Jun 29 18:06:09 1994 +0000
@@ -834,7 +834,7 @@
 (defun byte-compile-fdefinition (name macro-p)
   (let* ((list (if macro-p
 		   byte-compile-macro-environment
-		   byte-compile-function-environment))
+		 byte-compile-function-environment))
 	 (env (cdr (assq name list))))
     (or env
 	(let ((fn name))
@@ -899,7 +899,9 @@
 	 (sig (and def (byte-compile-arglist-signature
 			 (if (eq 'lambda (car-safe def))
 			     (nth 1 def)
-			     (aref def 0)))))
+			   (if (compiled-function-p def)
+			       (aref def 0)
+			     '(&rest def))))))
 	 (ncall (length (cdr form))))
     (if sig
 	(if (or (< ncall (car sig))
@@ -932,7 +934,9 @@
 	(let ((sig1 (byte-compile-arglist-signature
 		      (if (eq 'lambda (car-safe old))
 			  (nth 1 old)
-			  (aref old 0))))
+			(if (compiled-function-p old)
+			    (aref old 0)
+			  '(&rest def)))))
 	      (sig2 (byte-compile-arglist-signature (nth 2 form))))
 	  (or (byte-compile-arglist-signatures-congruent-p sig1 sig2)
 	      (byte-compile-warn "%s %s used to take %s %s, now takes %s"
@@ -2771,6 +2775,7 @@
 (byte-defop-compiler-1 defconst byte-compile-defvar)
 (byte-defop-compiler-1 autoload)
 (byte-defop-compiler-1 lambda byte-compile-lambda-form)
+(byte-defop-compiler-1 defalias)
 
 (defun byte-compile-defun (form)
   ;; This is not used for file-level defuns with doc strings.
@@ -2827,6 +2832,34 @@
 (defun byte-compile-lambda-form (form)
   (error "`lambda' used as function name is invalid"))
 
+;; Compile normally, but deal with warnings for the function being defined.
+(defun byte-compile-defalias (form)
+  (if (and (consp (cdr form)) (consp (nth 1 form))
+	   (eq (car (nth 1 form)) 'quote)
+	   (consp (cdr (nth 1 form)))
+	   (symbolp (nth 1 (nth 1 form)))
+	   (consp (nthcdr 2 form))
+	   (consp (nth 2 form))
+	   (eq (car (nth 2 form)) 'quote)
+	   (consp (cdr (nth 2 form)))
+	   (symbolp (nth 1 (nth 2 form))))
+      (progn
+	(byte-compile-defalias-warn (nth 1 (nth 1 form))
+				    (nth 1 (nth 2 form)))
+	(setq byte-compile-function-environment
+	      (cons (cons (nth 1 (nth 1 form))
+			  (nth 1 (nth 2 form)))
+		    byte-compile-function-environment))))
+  (byte-compile-normal-call form)))
+
+;; Turn off warnings about prior calls to the function being defalias'd.
+;; This could be smarter and compare those calls with
+;; the function it is being aliased to.
+(defun byte-compile-defalias-warn (new alias)
+  (let ((calls (assq new byte-compile-unresolved-functions)))
+    (if calls
+	(setq byte-compile-unresolved-functions
+	      (delq calls byte-compile-unresolved-functions)))))
 
 ;;; tags