:slot slot
:value-kind value-kind
:value-form value-form
- :location location
+ :location (file-location location)
:pset pset))
(defmethod shared-initialize :after
:class class
:type type
:body body
- :location location
+ :location (file-location location)
:pset pset))
(defmethod sod-message-method-class
(every (lambda (arg)
(or (eq arg :ellipsis)
(argument-name arg)
- (eq (argument-type arg) (c-type void))))
+ (c-type-equal-p (argument-type arg)
+ c-type-void)))
(c-function-arguments type)))
(error "Abstract declarators not permitted in method definitions")))
((method sod-method) (message sod-message) (type c-type))
(error "Methods must have function type, not ~A" type))
+(export 'check-method-return-type)
+(defun check-method-return-type (method-type wanted-type)
+ "Signal an error unless METHOD-TYPE does not return the WANTED-TYPE."
+ (let ((method-returns (c-type-subtype method-type)))
+ (unless (c-type-equal-p method-returns wanted-type)
+ (error "Method return type ~A should be ~A"
+ method-returns wanted-type))))
+
+(export 'check-method-return-type-against-message)
+(defun check-method-return-type-against-message (method-type message-type)
+ "Signal an error unless METHOD-TYPE and MESSAGE-TYPE return the same type."
+ (let ((message-returns (c-type-subtype message-type))
+ (method-returns (c-type-subtype method-type)))
+ (unless (c-type-equal-p message-returns method-returns)
+ (error "Method return type ~A doesn't match message ~A"
+ method-returns message-returns))))
+
+(export 'check-method-argument-lists)
+(defun check-method-argument-lists (method-type message-type)
+ "Signal an error unless METHOD-TYPE and MESSAGE-TYPE have matching argument
+ lists.
+
+ This checks that the two types have matching lists of arguments."
+ (unless (argument-lists-compatible-p (c-function-arguments message-type)
+ (c-function-arguments method-type))
+ (error "Method arguments ~A don't match message ~A"
+ method-type message-type)))
+
(defmethod check-method-type
((method sod-method) (message sod-message) (type c-function-type))
(with-slots ((msgtype %type)) message
- (unless (c-type-equal-p (c-type-subtype msgtype)
- (c-type-subtype type))
- (error "Method return type ~A doesn't match message ~A"
- (c-type-subtype msgtype) (c-type-subtype type)))
- (unless (argument-lists-compatible-p (c-function-arguments msgtype)
- (c-function-arguments type))
- (error "Method arguments ~A don't match message ~A" type msgtype))))
+ (check-method-return-type-against-message type msgtype)
+ (check-method-argument-lists type msgtype)))
;;;----- That's all, folks --------------------------------------------------