0.7.8.36:
[sbcl.git] / src / code / target-alieneval.lisp
index baf1b79..66a2e56 100644 (file)
@@ -45,7 +45,7 @@
         (error "badly formed alien name"))
        (values (cadr name) (car name))))))
 
-(defmacro def-alien-variable (name type &environment env)
+(defmacro define-alien-variable (name type &environment env)
   #!+sb-doc
   "Define NAME as an external alien variable of type TYPE. NAME should be
    a list of a string holding the alien name and a symbol to use as the Lisp
        `(eval-when (:compile-toplevel :load-toplevel :execute)
           ,@(when *new-auxiliary-types*
               `((%def-auxiliary-alien-types ',*new-auxiliary-types*)))
-          (%def-alien-variable ',lisp-name
-                               ',alien-name
-                               ',alien-type))))))
+          (%define-alien-variable ',lisp-name
+                                  ',alien-name
+                                  ',alien-type))))))
 
-;;; Do the actual work of DEF-ALIEN-VARIABLE.
+(defmacro def-alien-variable (&rest rest)
+  (deprecation-warning 'def-alien-variable 'define-alien-variable)
+  `(define-alien-variable ,@rest))
+
+;;; Do the actual work of DEFINE-ALIEN-VARIABLE.
 (eval-when (:compile-toplevel :load-toplevel :execute)
-  (defun %def-alien-variable (lisp-name alien-name type)
+  (defun %define-alien-variable (lisp-name alien-name type)
     (setf (info :variable :kind lisp-name) :alien)
     (setf (info :variable :where-from lisp-name) :defined)
     (clear-info :variable :constant-value lisp-name)
   (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)
        (let* ((field (slot-or-lose type slot))
              (offset (alien-record-field-offset field))
              (field-type (alien-record-field-type field)))
-        (%sap-alien (sap+ (alien-sap alien) (/ offset sb!vm:byte-bits))
+        (%sap-alien (sap+ (alien-sap alien) (/ offset sb!vm:n-byte-bits))
                     (make-alien-pointer-type :to field-type)))))))
 \f
 ;;;; the DEREF operator
     (etypecase type
       (alien-pointer-type
        (when (cdr indices)
-        (error "too many indices when derefing ~S: ~D"
+        (error "too many indices when DEREF'ing ~S: ~W"
                type
                (length indices)))
        (let ((element-type (alien-pointer-type-to type)))
                     0))))
       (alien-array-type
        (unless (= (length indices) (length (alien-array-type-dimensions type)))
-        (error "incorrect number of indices when derefing ~S: ~D"
+        (error "incorrect number of indices when DEREF'ing ~S: ~W"
                type (length indices)))
        (labels ((frob (dims indices offset)
                  (if (null dims)
           (type list indices)
           (optimize (inhibit-warnings 3)))
   (multiple-value-bind (target-type offset) (deref-guts alien indices)
-    (%sap-alien (sap+ (alien-value-sap alien) (/ offset sb!vm:byte-bits))
+    (%sap-alien (sap+ (alien-value-sap alien) (/ offset sb!vm:n-byte-bits))
                (make-alien-pointer-type :to target-type))))
 \f
 ;;;; accessing heap alien variables
         (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)
        (values (ceiling bits
                         (ecase units
                           (:bits 1)
-                          (:bytes sb!vm:byte-bits)
+                          (:bytes sb!vm:n-byte-bits)
                           (:words sb!vm:n-word-bits))))
        (error "unknown size for alien type ~S"
               (unparse-alien-type alien-type)))))
   (funcall (coerce (compute-deposit-lambda type) 'function)
           sap offset type value))
 \f
-;;;; ALIEN-FUNCALL, DEF-ALIEN-ROUTINE
+;;;; ALIEN-FUNCALL, DEFINE-ALIEN-ROUTINE
 
 (defun alien-funcall (alien &rest args)
   #!+sb-doc
       (alien-fun-type
        (unless (= (length (alien-fun-type-arg-types type))
                  (length args))
-        (error "wrong number of arguments for ~S~%expected ~D, got ~D"
+        (error "wrong number of arguments for ~S~%expected ~W, got ~W"
                type
                (length (alien-fun-type-arg-types type))
                (length args)))
       (t
        (error "~S is not an alien function." alien)))))
 
-(defmacro def-alien-routine (name result-type &rest args &environment lexenv)
+(defmacro define-alien-routine (name result-type
+                                    &rest args
+                                    &environment lexenv)
   #!+sb-doc
-  "DEF-ALIEN-ROUTINE Name Result-Type {(Arg-Name Arg-Type [Style])}*
+  "DEFINE-ALIEN-ROUTINE Name Result-Type {(Arg-Name Arg-Type [Style])}*
 
   Define a foreign interface function for the routine with the specified NAME.
   Also automatically DECLAIM the FTYPE of the defined function.
         ;; 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)
                      (values ,@temps ,@(results))))
                 `(values (alien-funcall ,lisp-name ,@(alien-args))
                          ,@(results)))))))))
+
+(defmacro def-alien-routine (&rest rest)
+  (deprecation-warning 'def-alien-routine 'define-alien-routine)
+  `(define-alien-routine ,@rest))
 \f
 (defun alien-typep (object type)
   #!+sb-doc