changeset 66317:3f882faaa9ae

(byte-compile-lambda): Add parameter add-lambda. (byte-compile-file-form-defmumble, byte-compile-defun, byte-compile-defmacro): Use it. (byte-compile-form): Don't call byte-compile-set-symbol-position when a byte-compile handler is called.
author Lars Hansen <larsh@soem.dk>
date Sun, 23 Oct 2005 07:33:18 +0000
parents 71bac038fa51
children d1891e96ceb4
files lisp/emacs-lisp/bytecomp.el
diffstat 1 files changed, 22 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/emacs-lisp/bytecomp.el	Sat Oct 22 17:45:50 2005 +0000
+++ b/lisp/emacs-lisp/bytecomp.el	Sun Oct 23 07:33:18 2005 +0000
@@ -908,6 +908,13 @@
 ;; list.  If our current position is after the symbol's position, we
 ;; assume we've already passed that point, and look for the next
 ;; occurrence of the symbol.
+;;
+;; This function should not be called twice for the same occurrence of
+;; a symbol, and it should not be called for symbols generated by the
+;; byte compiler itself; because rather than just fail looking up the
+;; symbol, we may find an occurrence of the symbol further ahead, and
+;; then `byte-compile-last-position' as advanced too far.
+;;
 ;; So your're probably asking yourself: Isn't this function a
 ;; gross hack?  And the answer, of course, would be yes.
 (defun byte-compile-set-symbol-position (sym &optional allow-previous)
@@ -2304,7 +2311,7 @@
 				 ',name ',declaration))
 		   outbuffer)))))
 
-    (let* ((new-one (byte-compile-lambda (cons 'lambda (nthcdr 2 form))))
+    (let* ((new-one (byte-compile-lambda (nthcdr 2 form) t))
 	   (code (byte-compile-byte-code-maker new-one)))
       (if this-one
 	  (setcdr this-one new-one)
@@ -2500,10 +2507,16 @@
 ;; Byte-compile a lambda-expression and return a valid function.
 ;; The value is usually a compiled function but may be the original
 ;; lambda-expression.
-(defun byte-compile-lambda (fun)
-  (unless (eq 'lambda (car-safe fun))
-    (error "Not a lambda list: %S" fun))
-  (byte-compile-set-symbol-position 'lambda)
+;; When ADD-LAMBDA is non-nil, the symbol `lambda' is added as head
+;; of the list FUN and `byte-compile-set-symbol-position' is not called.
+;; Use this feature to avoid calling `byte-compile-set-symbol-position'
+;; for symbols generated by the byte compiler itself.
+(defun byte-compile-lambda (fun &optional add-lambda)
+  (if add-lambda
+      (setq fun (cons 'lambda fun))
+    (unless (eq 'lambda (car-safe fun))
+      (error "Not a lambda list: %S" fun))
+    (byte-compile-set-symbol-position 'lambda))
   (byte-compile-check-lambda-list (nth 1 fun))
   (let* ((arglist (nth 1 fun))
 	 (byte-compile-bound-variables
@@ -2755,9 +2768,7 @@
 		    (or (not (byte-compile-version-cond
 			      byte-compile-compatibility))
 			(not (get (get fn 'byte-opcode) 'emacs19-opcode))))
-	       (progn
-		 (byte-compile-set-symbol-position fn)
-		 (funcall handler form))
+               (funcall handler form)
 	     (when (memq 'callargs byte-compile-warnings)
 	       (if (memq fn '(custom-declare-group custom-declare-variable custom-declare-face))
 		   (byte-compile-nogroup-warn form))
@@ -3671,7 +3682,7 @@
 	 (list 'fset
 	       (list 'quote (nth 1 form))
 	       (byte-compile-byte-code-maker
-		(byte-compile-lambda (cons 'lambda (cdr (cdr form)))))))
+		(byte-compile-lambda (cdr (cdr form)) t))))
 	(byte-compile-discard))
     ;; We prefer to generate a defalias form so it will record the function
     ;; definition just like interpreting a defun.
@@ -3679,7 +3690,7 @@
      (list 'defalias
 	   (list 'quote (nth 1 form))
 	   (byte-compile-byte-code-maker
-	    (byte-compile-lambda (cons 'lambda (cdr (cdr form))))))
+	    (byte-compile-lambda (cdr (cdr form)) t)))
      t))
   (byte-compile-constant (nth 1 form)))
 
@@ -3688,8 +3699,7 @@
   (byte-compile-body-do-effect
    (list (list 'fset (list 'quote (nth 1 form))
 	       (let ((code (byte-compile-byte-code-maker
-			    (byte-compile-lambda
-			     (cons 'lambda (cdr (cdr form)))))))
+			    (byte-compile-lambda (cdr (cdr form)) t))))
 		 (if (eq (car-safe code) 'make-byte-code)
 		     (list 'cons ''macro code)
 		   (list 'quote (cons 'macro (eval code))))))