X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-alieneval.lisp;h=66a2e56c0d36d49621bdf58527e882f7dde64588;hb=6c4d4d984b1af6b2a73568cec3ab9c8795cff2da;hp=f399057c88f2a3de79461e90d32746d5e88ef465;hpb=e33fb894f991b2926d8f3bace9058e4c0b2c3a37;p=sbcl.git diff --git a/src/code/target-alieneval.lisp b/src/code/target-alieneval.lisp index f399057..66a2e56 100644 --- a/src/code/target-alieneval.lisp +++ b/src/code/target-alieneval.lisp @@ -195,7 +195,7 @@ (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) @@ -436,10 +436,10 @@ (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) @@ -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)