Remove old CVS $Id$ keyword
[uffi.git] / src / objects.lisp
index f777f3c242d6b6dd7ffbf381bdbe81a01b135745..c9935b755dfa64867a27e4c6c1e155264b67daa0 100644 (file)
@@ -7,9 +7,7 @@
 ;;;; Programmer:    Kevin M. Rosenberg
 ;;;; Date Started:  Feb 2002
 ;;;;
-;;;; $Id$
-;;;;
-;;;; This file, part of UFFI, is Copyright (c) 2002-2005 by Kevin M. Rosenberg
+;;;; This file, part of UFFI, is Copyright (c) 2002-2010 by Kevin M. Rosenberg
 ;;;;
 ;;;; *************************************************************************
 
     #+clisp (values (ffi:size-of type))
     #+digitool
     (let ((mcl-type (ccl:find-mactype type nil t)))
-      (if mcl-type 
-         (ccl::mactype-record-size mcl-type)
-         (ccl::record-descriptor-length (ccl:find-record-descriptor type t t)))) ;error if not a record
+      (if mcl-type
+          (ccl::mactype-record-size mcl-type)
+          (ccl::record-descriptor-length (ccl:find-record-descriptor type t t)))) ;error if not a record
     #+openmcl (ccl::%foreign-type-or-record-size type :bytes)
     ))
-  
+
 (defmacro allocate-foreign-object (type &optional (size :unspecified))
   "Allocates an instance of TYPE. If size is specified, then allocate
 an array of TYPE with size SIZE. The TYPE parameter is evaluated."
   (if (eq size :unspecified)
       (progn
-       #+(or cmu scl)
-       `(alien:make-alien ,(convert-from-uffi-type (eval type) :allocation))
-       #+sbcl
-       `(sb-alien:make-alien ,(convert-from-uffi-type (eval type) :allocation))
-       #+lispworks
-       `(fli:allocate-foreign-object :type ',(convert-from-uffi-type type :allocate))
-       #+allegro
-       `(ff:allocate-fobject ',(convert-from-uffi-type type :allocate) :c)
-       #+(or openmcl digitool)
-       `(new-ptr ,(size-of-foreign-type (convert-from-uffi-type type :allocation)))
-       )
+        #+(or cmu scl)
+        `(alien:make-alien ,(convert-from-uffi-type (eval type) :allocation))
+        #+sbcl
+        `(sb-alien:make-alien ,(convert-from-uffi-type (eval type) :allocation))
+        #+lispworks
+        `(fli:allocate-foreign-object :type ',(convert-from-uffi-type type :allocate))
+        #+allegro
+        `(ff:allocate-fobject ',(convert-from-uffi-type type :allocate) :c)
+        #+(or openmcl digitool)
+        `(new-ptr ,(size-of-foreign-type (convert-from-uffi-type type :allocation)))
+        )
       (progn
-       #+(or cmu scl)
-       `(alien:make-alien ,(convert-from-uffi-type (eval type) :allocation) ,size)
-       #+sbcl
-       `(sb-alien:make-alien ,(convert-from-uffi-type (eval type) :allocation) ,size)
-       #+lispworks
-       `(fli:allocate-foreign-object :type ',(convert-from-uffi-type type :allocate) :nelems ,size)
-       #+allegro
-       `(ff:allocate-fobject (list :array (quote ,(convert-from-uffi-type type :allocate)) ,size) :c)
-       #+(or openmcl digitool)
-       `(new-ptr (* ,size ,(size-of-foreign-type (convert-from-uffi-type type :allocation))))
-       )))
+        #+(or cmu scl)
+        `(alien:make-alien ,(convert-from-uffi-type (eval type) :allocation) ,size)
+        #+sbcl
+        `(sb-alien:make-alien ,(convert-from-uffi-type (eval type) :allocation) ,size)
+        #+lispworks
+        `(fli:allocate-foreign-object :type ',(convert-from-uffi-type type :allocate) :nelems ,size)
+        #+allegro
+        `(ff:allocate-fobject (list :array (quote ,(convert-from-uffi-type type :allocate)) ,size) :c)
+        #+(or openmcl digitool)
+        `(new-ptr (* ,size ,(size-of-foreign-type (convert-from-uffi-type type :allocation))))
+        )))
 
 (defmacro free-foreign-object (obj)
   #+(or cmu scl)
@@ -103,7 +101,7 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
   #+(or cmu scl) `(alien:cast ,obj (* (alien:unsigned 8)))
   #+sbcl `(sb-alien:cast ,obj (* (sb-alien:unsigned 8)))
   #+lispworks `(fli:make-pointer :type '(:unsigned :char)
-                               :address (fli:pointer-address ,obj))
+                                :address (fli:pointer-address ,obj))
   #+allegro obj
   #+(or openmcl digitool) obj
   )
@@ -130,7 +128,7 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
   #+(or allegro cmu sbcl scl openmcl) `(code-char ,obj)
   ;; lispworks varies whether deref'ing array vs. slot access of a char
   #+lispworks `(if (characterp ,obj) ,obj (code-char ,obj)))
-  
+
 (defmacro ensure-char-integer (obj)
   #+(or digitool) `(char-code ,obj)
   #+(or allegro cmu sbcl scl openmcl) obj
@@ -139,8 +137,9 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
   `(if (integerp ,obj) ,obj (char-code ,obj)))
 
 (defmacro ensure-char-storable (obj)
-  #+(or lispworks digitool) obj
-  #+(or allegro cmu sbcl scl openmcl) `(char-code ,obj))
+  #+(or digitool (and lispworks (not lispworks5) (not lispworks6))) obj
+  #+(or allegro cmu lispworks5 lispworks6 openmcl sbcl scl)
+  `(char-code ,obj))
 
 (defmacro pointer-address (obj)
   #+(or cmu scl)
@@ -152,7 +151,7 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
   #+allegro
   obj
   #+(or openmcl digitool)
-  `(ccl:%ptr-to-int ,obj)  
+  `(ccl:%ptr-to-int ,obj)
   )
 
 ;; TYPE is evaluated.
@@ -161,31 +160,31 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
   #-(or cmu sbcl lispworks scl) ; default version
   `(let ((,var (allocate-foreign-object ,type)))
     (unwind-protect
-        (progn ,@body)
+         (progn ,@body)
       (free-foreign-object ,var)))
   #+(or cmu scl)
   (let ((obj (gensym))
-       (ctype (convert-from-uffi-type (eval type) :allocate)))
+        (ctype (convert-from-uffi-type (eval type) :allocate)))
     (if (and (consp ctype) (eq 'array (car ctype)))
-       `(alien:with-alien ((,obj ,ctype))
-         (let* ((,var ,obj))
-           ,@body))
-       `(alien:with-alien ((,obj ,ctype))
-         (let* ((,var (alien:addr ,obj)))
-           ,@body))))
+        `(alien:with-alien ((,obj ,ctype))
+          (let* ((,var ,obj))
+            ,@body))
+        `(alien:with-alien ((,obj ,ctype))
+          (let* ((,var (alien:addr ,obj)))
+            ,@body))))
   #+sbcl
   (let ((obj (gensym))
-       (ctype (convert-from-uffi-type (eval type) :allocate)))
+        (ctype (convert-from-uffi-type (eval type) :allocate)))
     (if (and (consp ctype) (eq 'array (car ctype)))
-       `(sb-alien:with-alien ((,obj ,ctype))
-         (let* ((,var ,obj))
-           ,@body))
-       `(sb-alien:with-alien ((,obj ,ctype))
-         (let* ((,var (sb-alien:addr ,obj)))
-           ,@body))))
+        `(sb-alien:with-alien ((,obj ,ctype))
+          (let* ((,var ,obj))
+            ,@body))
+        `(sb-alien:with-alien ((,obj ,ctype))
+          (let* ((,var (sb-alien:addr ,obj)))
+            ,@body))))
   #+lispworks
   `(fli:with-dynamic-foreign-objects ((,var ,(convert-from-uffi-type
-                                             (eval type) :allocate)))
+                                              (eval type) :allocate)))
     ,@body)
   )
 
@@ -193,8 +192,8 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
 (defmacro with-foreign-objects (bindings &rest body)
   (if bindings
       `(with-foreign-object ,(car bindings)
-       (with-foreign-objects ,(cdr bindings)
-         ,@body))
+        (with-foreign-objects ,(cdr bindings)
+          ,@body))
       `(progn ,@body)))
 
 #+(or openmcl digitool)
@@ -209,10 +208,10 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
         (setf type (nth 1 type)))
       (push (list (first spec) (* count (size-of-foreign-type type))) params))
     `(ccl:%stack-block ,params ,@body)))
-                                
+
 #+(or openmcl digitool)
 (defmacro with-foreign-object ((var type) &rest body)
-  `(with-foreign-objects ((,var ,type)) 
+  `(with-foreign-objects ((,var ,type))
      ,@body))
 
 #+lispworks
@@ -243,7 +242,7 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
           (lisp-implementation-type)))
 
 #+(or allegro openmcl)
-(defun convert-external-name (name) 
+(defun convert-external-name (name)
   "Add an underscore to NAME if necessary for the ABI."
   #+(or macosx darwinppc-target) (concatenate 'string "_" name)
   #-(or macosx darwinppc-target) name)
@@ -278,3 +277,13 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
     `(define-symbol-macro ,lisp-name
       '(error "DEF-FOREIGN-VAR not (yet) defined for ~A"
         (lisp-implementation-type)))))
+
+
+;;; Define a special variable, like DEFVAR, that will be initialized
+;;; to a pointer which may need to be reset when a saved image is
+;;; loaded.  This is needed for OpenMCL, which sets pointers to "dead
+;;; macptrs" when a saved image is loaded.
+;; This may possibly be needed for sbcl's SAVE-LISP-AND-DIE
+(defmacro def-pointer-var (name value &optional doc)
+  #-openmcl `(defvar ,name ,value ,@(if doc (list doc)))
+  #+openmcl `(ccl::defloadvar ,name ,value ,doc))