0.7.1.19:
[sbcl.git] / src / code / target-alieneval.lisp
index f399057..c130387 100644 (file)
   (let ((alien-type (parse-alien-type type env)))
     (if (eq (compute-alien-rep-type alien-type) 'system-area-pointer)
        `(%sap-alien ,sap ',alien-type)
-       (error "cannot make aliens of type ~S out of SAPs" type))))
+       (error "cannot make an alien of type ~S out of a SAP" type))))
 
 (defun %sap-alien (sap type)
   (declare (type system-area-pointer sap)
         (alien-sap (alien-sap alien)))
     (finalize
      alien
-     #'(lambda ()
-        (alien-funcall
-         (extern-alien "free" (function (values) system-area-pointer))
-         alien-sap)))
+     (lambda ()
+       (alien-funcall
+       (extern-alien "free" (function (values) system-area-pointer))
+       alien-sap)))
     alien))
 
 (defun note-local-alien-type (info alien)
         ;; anyway, and (2) such a declamation can be (especially for
         ;; alien values) both messy to do by hand and very important
         ;; for performance of later code which uses the return value.
-        (declaim (ftype (function ,(mapcar (constantly t) args)
-                                  (alien ,result-type))
-                        ,lisp-name))
+        ,(let (;; FIXME: Ideally, we'd actually declare useful types
+               ;; here, so e.g. an alien function of "int" and "char"
+               ;; arguments would get Lisp arg types WORD and CHARACTER
+               ;; or something. Meanwhile, for now we just punt.
+               (lisp-arg-types (mapcar (constantly t) args))
+               ;; KLUDGE: This is a quick hack to solve bug 133,
+               ;; where PROCLAIM trying to translate alien void result
+               ;; types would signal an error here ("cannot use values
+               ;; types here"), and the kludgy SB!ALIEN::*VALUE-TYPE-OKAY*
+               ;; flag to enable values types didn't fit into PROCLAIM
+               ;; in any reasonable way. But there's likely a better
+               ;; way to do this. (If there isn't a suitable utility
+               ;; to systematically translate C return types into
+               ;; Lisp return types, there should be.) -- WHN 2002-01-22
+               (lisp-result-type (if (eql result-type 'void)
+                                     '(values)
+                                     `(alien ,result-type))))
+           `(declaim (ftype (function ,lisp-arg-types ,lisp-result-type)
+                            ,lisp-name)))
 
         (defun ,lisp-name ,(lisp-args)
           ,@(docs)