codegen-method generic
codegen-target generic
compute-effective-method-body generic
+ compute-effective-method-keyword-arguments function
compute-effective-methods generic
compute-method-entry-functions generic
compute-sod-effective-method generic
method-entry-function-name generic
method-entry-function-type generic
method-entry-slot-name generic
- method-keyword-argument-lists generic
primary-method-class generic
simple-method-body generic
sod-message-applicable-methods generic
sod-message-argument-tail generic
sod-message-effective-method-class generic
+ sod-message-keyword-argument-lists generic
sod-method-description generic
sod-method-function-name generic
sod-method-function-type generic
method-entry
method-entry-slot-name
method-entry
-method-keyword-argument-lists
- effective-method t t
- sod::initialization-effective-method t t
module-dependencies
module
(setf module-dependencies)
sod::teardown-message
sod-message-kernel-function
aggregating-message
+sod-message-keyword-argument-lists
+ sod::initialization-message sod-class t t
+ sod-message sod-class t t
sod-message-method-class
basic-message sod-class t
simple-message sod-class t
\end{describe}
\begin{describe}{gf}
- {sod-message-effective-method-class @<message> @> @<class>}
+ {sod-message-keyword-argument-lists @<message> @<class>
+ @<direct-methods> @<state>
+ \nlret @<list>}
\end{describe}
-\begin{describe}{gf}{primary-method-class @<message> @> @<class>}
+\begin{describe}{fun}
+ {compute-effective-method-keyword-arguments @<message>
+ @<class>
+ @<direct-methods>
+ \nlret @<list>}
\end{describe}
\begin{describe}{gf}
- {method-keyword-argument-lists @<method> @<direct-methods> @<state>
- @> @<list>}
+ {sod-message-effective-method-class @<message> @> @<class>}
+\end{describe}
+
+\begin{describe}{gf}{primary-method-class @<message> @> @<class>}
\end{describe}
\begin{describe}{gf}
((message initialization-message))
'initialization-effective-method)
-(defmethod method-keyword-argument-lists
- ((method initialization-effective-method) direct-methods state)
+(defmethod sod-message-keyword-argument-lists
+ ((message initialization-message) (class sod-class) direct-methods state)
(append (call-next-method)
(mapcan (lambda (class)
(let* ((initargs (sod-class-initargs class))
(report-inheritance-path
state class))
arglist)))))
- (sod-class-precedence-list
- (effective-method-class method)))))
+ (sod-class-precedence-list class))))
(defmethod lifecycle-method-kernel
((method initialization-effective-method) codegen target)
;;;--------------------------------------------------------------------------
;;; Effective method classes.
-(defmethod method-keyword-argument-lists
- ((method effective-method) direct-methods state)
- (with-slots (message) method
- (and (keyword-message-p message)
- (cons (cons (lambda (arg)
- (let ((class (sod-message-class message)))
- (info-with-location
- message "Type `~A' declared in message ~
- definition in `~A' (here)"
- (argument-type arg) class)
- (report-inheritance-path state class)))
- (c-function-keywords (sod-message-type message)))
- (mapcar (lambda (m)
- (cons (lambda (arg)
- (let ((class (sod-method-class m)))
- (info-with-location
- m "Type `~A' declared in ~A direct ~
- method of `~A' (defined here)"
- (argument-type arg)
- (sod-method-description m) class)
- (report-inheritance-path state class)))
- (c-function-keywords (sod-method-type m))))
- direct-methods)))))
+(defmethod sod-message-keyword-argument-lists
+ ((message sod-message) (class sod-class) direct-methods state)
+ (and (keyword-message-p message)
+ (cons (cons (lambda (arg)
+ (let ((class (sod-message-class message)))
+ (info-with-location
+ message "Type `~A' declared in message ~
+ definition in `~A' (here)"
+ (argument-type arg) class)
+ (report-inheritance-path state class)))
+ (c-function-keywords (sod-message-type message)))
+ (mapcar (lambda (method)
+ (cons (lambda (arg)
+ (let ((class (sod-method-class method)))
+ (info-with-location
+ method "Type `~A' declared in ~A direct ~
+ method of `~A' (defined here)"
+ (argument-type arg)
+ (sod-method-description method) class)
+ (report-inheritance-path state class)))
+ (c-function-keywords (sod-method-type method))))
+ direct-methods))))
+
(defmethod shared-initialize :after
((method effective-method) slot-names &key direct-methods)
;; class construction.
(with-slots ((class %class) message keywords) method
(setf keywords
- (merge-keyword-lists
- (lambda ()
- (values class
- (format nil
- "methods for message `~A' ~
- applicable to class `~A'"
- message class)))
- (method-keyword-argument-lists method direct-methods
- (make-inheritance-path-reporter-state class))))))
+ (compute-effective-method-keyword-arguments message
+ class
+ direct-methods))))
(export '(basic-effective-method
effective-method-around-methods effective-method-before-methods
The list contains all methods applicable for MESSAGE when sent to an
instance of CLASS, most specific first."))
+(export 'sod-message-keyword-argument-lists)
+(defgeneric sod-message-keyword-argument-lists
+ (message class direct-methods state)
+ (:documentation
+ "Returns a list of keyword argument lists to be merged.
+
+ This should return a list suitable for passing to `merge-keyword-lists',
+ i.e., each element should be a pair consisting of a function describing
+ the source of the argument list (returning location and description), and
+ a list of `argument' objects.
+
+ The MESSAGE is the message being processed; CLASS is a receiver class
+ under consideration; DIRECT-METHODS is the complete list of applicable
+ direct methods (most specific first); and STATE is an `inheritance-path-
+ reporter-state' object which can be used by the returned reporting
+ functions."))
+
+(export 'compute-effective-method-keyword-arguments)
+(defun compute-effective-method-keyword-arguments
+ (message class direct-methods)
+ "Return a merged keyword argument list.
+
+ The returned list combines all of the applicable methods, provided as
+ DIRECT-METHODS, applicable to MESSAGE when received by an instance of
+ CLASS, possibly with other keywords as determined by `sod-keyword-
+ argument-lists'."
+ (let ((state (make-inheritance-path-reporter-state class)))
+ (merge-keyword-lists (lambda ()
+ (values class
+ (format nil
+ "methods for message `~A' ~
+ applicable to class `~A'"
+ message class)))
+ (sod-message-keyword-argument-lists message
+ class
+ direct-methods
+ state))))
+
(export 'sod-message-effective-method-class)
(defgeneric sod-message-effective-method-class (message)
(:documentation
This protocol is used by `simple-message' subclasses."))
-(export 'method-keyword-argument-lists)
-(defgeneric method-keyword-argument-lists (method direct-methods state)
- (:documentation
- "Returns a list of keyword argument lists to be merged.
-
- This should return a list suitable for passing to `merge-keyword-lists',
- i.e., each element should be a pair consisting of a function describing
- the source of the argument list (returning location and description), and
- a list of `argument' objects.
-
- The METHOD is the effective method being processed; DIRECT-METHODS is the
- complete list of applicable direct methods (most specific first); and
- STATE is an `inheritance-path-reporter-state' object which can be used by
- the returned reporting functions."))
-
(export 'compute-sod-effective-method)
(defgeneric compute-sod-effective-method (message class)
(:documentation