X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-alieneval.lisp;h=66a2e56c0d36d49621bdf58527e882f7dde64588;hb=34e8e7fd14989e1c86e9408733b4a73c46dd0a92;hp=deaff2c39c697555e089270be603ca96d8e903ef;hpb=9a241987c408980164f71237f7d840265302bbc1;p=sbcl.git diff --git a/src/code/target-alieneval.lisp b/src/code/target-alieneval.lisp index deaff2c..66a2e56 100644 --- a/src/code/target-alieneval.lisp +++ b/src/code/target-alieneval.lisp @@ -659,9 +659,25 @@ ;; 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) (lisp-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)