summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2015-01-15 08:38:00 -0500
committerStefan Monnier <monnier@iro.umontreal.ca>2015-01-16 17:48:59 -0500
commit9d940c667ab1dadc9d25a88cc2af1594b6c1bb49 (patch)
treeb50713180efcb5d3c041909db3e48598740a051f
parent78e6ccc4a5006272b14f352e459a6d3bf52ed07b (diff)
downloademacs-9d940c667ab1dadc9d25a88cc2af1594b6c1bb49.tar.gz
* lisp/emacs-lisp/cl-generic.el (cl--generic-build-combined-method):
Return the value of the primary rather than the after method.
-rw-r--r--lisp/ChangeLog3
-rw-r--r--lisp/emacs-lisp/cl-generic.el7
-rw-r--r--test/automated/cl-generic-tests.el13
3 files changed, 20 insertions, 3 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 57aaea0f4ce..c6e315e1260 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -38,6 +38,9 @@
2015-01-15 Stefan Monnier <monnier@iro.umontreal.ca>
+ * emacs-lisp/cl-generic.el (cl--generic-build-combined-method):
+ Return the value of the primary rather than the after method.
+
* emacs-lisp/eieio-core.el: Provide support for cl-generic.
(eieio--generic-tagcode): New function.
(cl-generic-tagcode-function): Use it.
diff --git a/lisp/emacs-lisp/cl-generic.el b/lisp/emacs-lisp/cl-generic.el
index 41a419a3c4a..21688bef18a 100644
--- a/lisp/emacs-lisp/cl-generic.el
+++ b/lisp/emacs-lisp/cl-generic.el
@@ -411,9 +411,10 @@ for all those different tags in the method-cache.")
(setq fun (lambda (&rest args)
(dolist (bf before)
(apply bf args))
- (apply next args)
- (dolist (af after)
- (apply af args))))))
+ (prog1
+ (apply next args)
+ (dolist (af after)
+ (apply af args)))))))
(cl--generic-nest fun (alist-get :around mets-by-qual))))))))
(defun cl--generic-cache-miss (generic dispatch-arg dispatches-left tags)
diff --git a/test/automated/cl-generic-tests.el b/test/automated/cl-generic-tests.el
index 17bce6a3157..57b17b145e8 100644
--- a/test/automated/cl-generic-tests.el
+++ b/test/automated/cl-generic-tests.el
@@ -129,5 +129,18 @@
(cons "x&y-int" (cl-call-next-method)))
(should (equal (cl--generic-1 1 2) '("x&y-int" "y-int" "x-int" 1 2))))
+(ert-deftest cl-generic-test-7-after/before ()
+ (let ((log ()))
+ (cl-defgeneric cl--generic-1 (x y))
+ (cl-defmethod cl--generic-1 ((_x t) y) (cons y log))
+ (cl-defmethod cl--generic-1 ((_x (eql 4)) _y)
+ (cons "quatre" (cl-call-next-method)))
+ (cl-defmethod cl--generic-1 :after (x _y)
+ (push (list :after x) log))
+ (cl-defmethod cl--generic-1 :before (x _y)
+ (push (list :before x) log))
+ (should (equal (cl--generic-1 4 6) '("quatre" 6 (:before 4))))
+ (should (equal log '((:after 4) (:before 4))))))
+
(provide 'cl-generic-tests)
;;; cl-generic-tests.el ends here