X-Git-Url: http://christophe.rhodes.io/gitweb/?p=specializable.git;a=blobdiff_plain;f=specializable.lisp;fp=specializable.lisp;h=5a0c09606cef65dce583e9e8052074cd1015584d;hp=b74d73fdd506347aa61dd14de4b71f94ecbfe70e;hb=e3834a3e58f7d2571a4ec2dbe58086a825287819;hpb=3ad29ae97f2b75c730b7df5af55c73e316b17606 diff --git a/specializable.lisp b/specializable.lisp index b74d73f..5a0c096 100644 --- a/specializable.lisp +++ b/specializable.lisp @@ -122,7 +122,7 @@ ;;; FIXME: in some kind of order, the discriminating function needs to handle: ;;; - argument count checking; -;;; - keyword argument validity; +;;; - DONE (in effective method) keyword argument validity; ;;; - DONE flushing the emf cache on method addition/removal ;;; - DONE (sort of, using wrappers/g-e-h-k) flushing the cache on class redefinition; ;;; - cache thread-safety. @@ -145,16 +145,17 @@ (compute-applicable-methods-using-generalizers gf generalizers) (if definitivep (let* ((emfun - (compute-effective-method-function gf applicable-methods)) + (compute-effective-method-function gf applicable-methods)) (keys (mapcar (lambda (x) (generalizer-equal-hash-key gf x)) generalizers))) (setf (gethash keys (emf-table gf)) emfun) (sb-pcl::invoke-emf emfun args)) - (sb-pcl::invoke-emf (compute-effective-method-function + (sb-pcl::invoke-emf (compute-effective-method-function gf (sb-mop:compute-applicable-methods gf args)) args)))) (defun compute-effective-method-function (gf methods) (let* ((mc (sb-mop:generic-function-method-combination gf)) + (sb-pcl::*applicable-methods* methods) (em (sb-mop:compute-effective-method gf mc methods))) (sb-pcl::make-effective-method-function gf em)))