X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/4307347660f48628e307f299eb4fac58ba35fd1a..89ef4001b93c0219096c94125e7e9fdb745d2c97:/src/method-impl.lisp diff --git a/src/method-impl.lisp b/src/method-impl.lisp index 963f2fe..9f1a48f 100644 --- a/src/method-impl.lisp +++ b/src/method-impl.lisp @@ -30,8 +30,7 @@ (export 'basic-message) (defclass basic-message (sod-message) - ((argument-tail :type list :reader sod-message-argument-tail) - (no-varargs-tail :type list :reader sod-message-no-varargs-tail)) + ((argument-tail :type list :reader sod-message-argument-tail)) (:documentation "Base class for built-in message classes. @@ -52,9 +51,6 @@ (argument-type arg)))) (c-function-arguments (sod-message-type message))))) -(define-on-demand-slot basic-message no-varargs-tail (message) - (reify-variable-argument-tail (sod-message-argument-tail message))) - (defmethod sod-message-method-class ((message basic-message) (class sod-class) pset) (let ((role (get-property pset :role :keyword nil))) @@ -248,21 +244,28 @@ ;;;-------------------------------------------------------------------------- ;;; Effective method classes. +(defmethod method-keyword-argument-lists + ((method effective-method) direct-methods) + (with-slots (message) method + (and (keyword-message-p message) + (mapcar (lambda (m) + (let ((type (sod-method-type m))) + (cons (c-function-keywords type) + (format nil "method for ~A on ~A (at ~A)" + message + (sod-method-class m) + (file-location m))))) + direct-methods)))) + (defmethod shared-initialize :after ((method effective-method) slot-names &key direct-methods) (declare (ignore slot-names)) ;; Set the keyword argument list. (with-slots (message keywords) method - (setf keywords (and (keyword-message-p message) - (merge-keyword-lists - (mapcar (lambda (m) - (let ((type (sod-method-type m))) - (cons (c-function-keywords type) - (format nil "method for ~A on ~A" - message - (sod-method-class m))))) - direct-methods)))))) + (setf keywords + (merge-keyword-lists (method-keyword-argument-lists + method direct-methods))))) (export '(basic-effective-method effective-method-around-methods effective-method-before-methods @@ -288,9 +291,9 @@ using a slot reader method.")) (define-on-demand-slot basic-effective-method basic-argument-names (method) - (let ((message (effective-method-message method))) - (mapcar #'argument-name - (sod-message-no-varargs-tail message)))) + (let* ((message (effective-method-message method)) + (raw-tail (sod-message-argument-tail message))) + (mapcar #'argument-name (reify-variable-argument-tail raw-tail)))) (defmethod effective-method-function-name ((method effective-method)) (let* ((class (effective-method-class method)) @@ -794,9 +797,11 @@ *null-pointer* 0))) (call-next-method))))))) -(defmethod compute-method-entry-functions - ((method simple-effective-method)) - (if (effective-method-primary-methods method) +(defmethod effective-method-live-p ((method simple-effective-method)) + (effective-method-primary-methods method)) + +(defmethod compute-method-entry-functions :around ((method effective-method)) + (if (effective-method-live-p method) (call-next-method) nil))