From 53aacf21b41d567ff41cc33b91a44b018ceb4195 Mon Sep 17 00:00:00 2001 From: Stefan Monnier Date: Tue, 5 Jun 2012 12:43:43 -0400 Subject: [PATCH] * lisp/emacs-lisp/macroexp.el (macroexpand-all-1): Tolerate errors during compiler-macro expansion. --- lisp/ChangeLog | 3 +++ lisp/emacs-lisp/cl-loaddefs.el | 2 +- lisp/emacs-lisp/macroexp.el | 15 +++++++++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 38c4c74dab7..efae4584643 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,8 @@ 2012-06-05 Stefan Monnier + * emacs-lisp/macroexp.el (macroexpand-all-1): Tolerate errors during + compiler-macro expansion. + Add native compiler-macro support. * emacs-lisp/macroexp.el (macroexpand-all-1): Support compiler-macros directly. Properly follow aliases and apply diff --git a/lisp/emacs-lisp/cl-loaddefs.el b/lisp/emacs-lisp/cl-loaddefs.el index 6d4f60b1029..d521ea32117 100644 --- a/lisp/emacs-lisp/cl-loaddefs.el +++ b/lisp/emacs-lisp/cl-loaddefs.el @@ -289,7 +289,7 @@ This also does some trivial optimizations to make the form prettier. ;;;;;; cl-return cl-block cl-etypecase cl-typecase cl-ecase cl-case ;;;;;; cl-load-time-value cl-eval-when cl-destructuring-bind cl-function ;;;;;; cl-defmacro cl-defun cl-gentemp cl-gensym) "cl-macs" "cl-macs.el" -;;;;;; "35e128b3ab7780c4f9c25da5a0adea7a") +;;;;;; "f3973150add70d26cadb8530147dfc99") ;;; Generated autoloads from cl-macs.el (autoload 'cl-gensym "cl-macs" "\ diff --git a/lisp/emacs-lisp/macroexp.el b/lisp/emacs-lisp/macroexp.el index 953b4b7eab5..b021abe71ea 100644 --- a/lisp/emacs-lisp/macroexp.el +++ b/lisp/emacs-lisp/macroexp.el @@ -187,7 +187,8 @@ Assumes the caller has bound `macroexpand-all-environment'." (fboundp func) (or (not (eq (car-safe (symbol-function func)) 'autoload)) - (load (nth 1 (symbol-function func))))) + (ignore-errors + (load (nth 1 (symbol-function func)))))) ;; Follow the sequence of aliases. (setq func (symbol-function func))) (if (null handler) @@ -195,15 +196,21 @@ Assumes the caller has bound `macroexpand-all-environment'." ;; setq/setq-default this works alright because the variable names ;; are symbols). (macroexpand-all-forms form 1) - (let ((newform (apply handler form (cdr form)))) + (let ((newform (condition-case err + (apply handler form (cdr form)) + (error (message "Compiler-macro error: %S" err) + form)))) (if (eq form newform) ;; The compiler macro did not find anything to do. (if (equal form (setq newform (macroexpand-all-forms form 1))) form ;; Maybe after processing the args, some new opportunities ;; appeared, so let's try the compiler macro again. - (if (eq newform - (setq form (apply handler newform (cdr newform)))) + (setq form (condition-case err + (apply handler newform (cdr newform)) + (error (message "Compiler-macro error: %S" err) + newform))) + (if (eq newform form) newform (macroexpand-all-1 newform))) (macroexpand-all-1 newform)))))) -- 2.39.2