X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/sod/blobdiff_plain/981b6fb624186a54320cea34e53e16276aee2bdb..ced609b8c5cc865f25cf5cce91a3d7dc9c85bdee:/src/class-make-impl.lisp?ds=sidebyside diff --git a/src/class-make-impl.lisp b/src/class-make-impl.lisp index f7231ef..ed6189f 100644 --- a/src/class-make-impl.lisp +++ b/src/class-make-impl.lisp @@ -124,7 +124,7 @@ (defmethod make-sod-initializer-using-slot :slot slot :value-kind value-kind :value-form value-form - :location location + :location (file-location location) :pset pset)) (defmethod shared-initialize :after @@ -190,7 +190,7 @@ (defmethod make-sod-method-using-message :class class :type type :body body - :location location + :location (file-location location) :pset pset)) (defmethod sod-message-method-class @@ -208,7 +208,8 @@ (defmethod shared-initialize :after (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"))) @@ -220,15 +221,38 @@ (defmethod check-method-type ((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 --------------------------------------------------