chiark / gitweb /
src/c-types-*.lisp: New type for functions which take keyword arguments.
[sod] / src / class-make-impl.lisp
index f7231ef1e830db41dc3a214688f29948fed89c4f..ed6189f982ae27e2862e054e8d9875facf02de48 100644 (file)
@@ -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 --------------------------------------------------