Fix the cheneygc build
[sbcl.git] / contrib / sb-posix / designator.lisp
index e3c0df7..ef33e40 100644 (file)
@@ -1,18 +1,26 @@
 (in-package :sb-posix)
 (defvar *designator-types* (make-hash-table :test #'equal))
 
-(defmacro define-designator (name result &body conversions)
-  (let ((type `(quote (or ,@(mapcar #'car conversions))))
-        (typename (intern (format nil "~A-~A"
-                                  (symbol-name name)
+(defmacro define-designator (name (lisp-type alien-type) doc
+                             &body conversions)
+  (let ((designator-type `(or ,@(mapcar #'car conversions)))
+        (designator-name (intern (format nil "~A-~A"
+                                         (symbol-name name)
                                   (symbol-name :designator))
-                          #.*package*)))
+                                 #.*package*))
+        (name (intern (symbol-name name) :sb-posix)))
     `(progn
+       (deftype ,name ()
+         ,@(when doc (list (first doc)))
+         ',lisp-type)
+       (deftype ,designator-name ()
+         ,@(when doc (list (second doc)))
+         ',designator-type)
       (eval-when (:compile-toplevel :load-toplevel :execute)
-        (deftype ,typename () ,type)
-        (setf (gethash ',name *designator-types*) ',result))
-      (defun ,(intern (symbol-name name) :sb-posix) (,name)
-        (declare (type ,typename ,name))
+        (setf (gethash ',name *designator-types*) ',alien-type))
+      (declaim (ftype (function (t) (values ,lisp-type &optional)) ,name))
+      (defun ,name (,name)
+        ,@(when doc (list (third doc)))
         (etypecase ,name
           ,@conversions)))))