changeset 109837:b668431e0039

* lisp/emacs-lisp/autoload.el (make-autoload): Preload the macros's declarations that are useful before running the macro. * src/eval.c (Fdefmacro): Only obey one declaration.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Wed, 18 Aug 2010 12:21:43 +0200
parents 9212e8bdf79b
children 64936c70841e
files lisp/ChangeLog lisp/emacs-lisp/autoload.el src/ChangeLog src/eval.c
diffstat 4 files changed, 47 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/ChangeLog	Wed Aug 18 11:27:53 2010 +0200
+++ b/lisp/ChangeLog	Wed Aug 18 12:21:43 2010 +0200
@@ -1,3 +1,8 @@
+2010-08-18  Stefan Monnier  <monnier@iro.umontreal.ca>
+
+	* emacs-lisp/autoload.el (make-autoload): Preload the macros's
+	declarations that are useful before running the macro.
+
 2010-08-18  Katsumi Yamaoka  <yamaoka@jpl.org>
 
 	* image.el (create-animated-image): Don't add heuristic mask to image
@@ -5,8 +10,8 @@
 
 2010-08-18  Jan Djärv  <jan.h.d@swipnet.se>
 
-	* term/ns-win.el (ns-get-pasteboard, ns-set-pasteboard): Use
-	QCLIPBOARD instead of QPRIMARY (Bug#6677).
+	* term/ns-win.el (ns-get-pasteboard, ns-set-pasteboard):
+	Use QCLIPBOARD instead of QPRIMARY (Bug#6677).
 
 2010-08-17  Stefan Monnier  <monnier@iro.umontreal.ca>
 
--- a/lisp/emacs-lisp/autoload.el	Wed Aug 18 11:27:53 2010 +0200
+++ b/lisp/emacs-lisp/autoload.el	Wed Aug 18 12:21:43 2010 +0200
@@ -109,29 +109,48 @@
       (let* ((macrop (memq car '(defmacro defmacro*)))
 	     (name (nth 1 form))
 	     (args (case car
-		    ((defun defmacro defun* defmacro*
-		       define-overloadable-function) (nth 2 form))
-		    ((define-skeleton) '(&optional str arg))
-		    ((define-generic-mode define-derived-mode
-                       define-compilation-mode) nil)
-		    (t)))
+                     ((defun defmacro defun* defmacro*
+                        define-overloadable-function) (nth 2 form))
+                     ((define-skeleton) '(&optional str arg))
+                     ((define-generic-mode define-derived-mode
+                        define-compilation-mode) nil)
+                     (t)))
 	     (body (nthcdr (get car 'doc-string-elt) form))
 	     (doc (if (stringp (car body)) (pop body))))
 	(when (listp args)
 	  ;; Add the usage form at the end where describe-function-1
 	  ;; can recover it.
 	  (setq doc (help-add-fundoc-usage doc args)))
-	;; `define-generic-mode' quotes the name, so take care of that
-	(list 'autoload (if (listp name) name (list 'quote name)) file doc
-	      (or (and (memq car '(define-skeleton define-derived-mode
-				    define-generic-mode
-				    easy-mmode-define-global-mode
-				    define-global-minor-mode
-				    define-globalized-minor-mode
-				    easy-mmode-define-minor-mode
-				    define-minor-mode)) t)
-		  (eq (car-safe (car body)) 'interactive))
-	      (if macrop (list 'quote 'macro) nil))))
+        (let ((exp
+               ;; `define-generic-mode' quotes the name, so take care of that
+               (list 'autoload (if (listp name) name (list 'quote name))
+                     file doc
+                     (or (and (memq car '(define-skeleton define-derived-mode
+                                           define-generic-mode
+                                           easy-mmode-define-global-mode
+                                           define-global-minor-mode
+                                           define-globalized-minor-mode
+                                           easy-mmode-define-minor-mode
+                                           define-minor-mode)) t)
+                         (eq (car-safe (car body)) 'interactive))
+                     (if macrop (list 'quote 'macro) nil))))
+          (when macrop
+            ;; Special case to autoload some of the macro's declarations.
+            (let ((decls (nth (if (stringp (nth 3 form)) 4 3) form))
+                  (exps '()))
+              (when (eq (car decls) 'declare)
+                ;; FIXME: We'd like to reuse macro-declaration-function,
+                ;; but we can't since it doesn't return anything.
+                (dolist (decl decls)
+                  (case (car-safe decl)
+                    (indent
+                     (push `(put ',name 'lisp-indent-function ',(cadr decl))
+                           exps))
+                    (doc-string
+                     (push `(put ',name 'doc-string-elt ',(cadr decl)) exps))))
+                (when exps
+                  (setq exp `(progn ,exp ,@exps))))))
+          exp)))
 
      ;; For defclass forms, use `eieio-defclass-autoload'.
      ((eq car 'defclass)
--- a/src/ChangeLog	Wed Aug 18 11:27:53 2010 +0200
+++ b/src/ChangeLog	Wed Aug 18 12:21:43 2010 +0200
@@ -1,5 +1,7 @@
 2010-08-18  Stefan Monnier  <monnier@iro.umontreal.ca>
 
+	* eval.c (Fdefmacro): Only obey one declaration.
+
 	* casefiddle.c (casify_region): Setup gl_state.
 
 2010-08-18  Jan Djärv  <jan.h.d@swipnet.se>
--- a/src/eval.c	Wed Aug 18 11:27:53 2010 +0200
+++ b/src/eval.c	Wed Aug 18 12:21:43 2010 +0200
@@ -690,8 +690,8 @@
       tail = XCDR (tail);
     }
 
-  while (CONSP (Fcar (tail))
-	 && EQ (Fcar (Fcar (tail)), Qdeclare))
+  if (CONSP (Fcar (tail))
+      && EQ (Fcar (Fcar (tail)), Qdeclare))
     {
       if (!NILP (Vmacro_declaration_function))
 	{