Author: hhubner
Date: Mon Feb 18 03:38:51 2008
New Revision: 2526
Modified:
branches/trunk-reorg/thirdparty/uffi-1.6.0/src/aggregates.lisp
Log:
fix :pointer-self for unions
Modified: branches/trunk-reorg/thirdparty/uffi-1.6.0/src/aggregates.lisp
==============================================================================
--- branches/trunk-reorg/thirdparty/uffi-1.6.0/src/aggregates.lisp (original)
+++ branches/trunk-reorg/thirdparty/uffi-1.6.0/src/aggregates.lisp Mon Feb 18 03:38:51 2008
@@ -67,40 +67,48 @@
`(ccl::def-foreign-type ,name-array (:array ,(convert-from-uffi-type type :array)))
)
-(defun process-struct-fields (name fields &optional (variant nil))
+(defun process-aggregate-fields (name fields &key (variant nil) (aggregate-type :struct))
(let (processed)
(dolist (field fields)
(let* ((field-name (car field))
(type (cadr field))
(def (append (list field-name)
- (if (eq type :pointer-self)
- #+(or cmu scl) `((* (alien:struct ,name)))
- #+sbcl `((* (sb-alien:struct ,name)))
- #+(or openmcl digitool) `((:* (:struct ,name)))
- #+lispworks `((:pointer ,name))
- #-(or cmu sbcl scl openmcl digitool lispworks) `((* ,name))
- `(,(convert-from-uffi-type type :struct))))))
+ (if (eq type :pointer-self)
+ (ecase aggregate-type
+ (:struct
+ #+(or cmu scl) `((* (alien:struct ,name)))
+ #+sbcl `((* (sb-alien:struct ,name)))
+ #+(or openmcl digitool) `((:* (:struct ,name)))
+ #+lispworks `((:pointer ,name))
+ #-(or cmu sbcl scl openmcl digitool lispworks) `((* ,name)))
+ (:union
+ #+(or cmu scl) `((* (alien:union ,name)))
+ #+sbcl `((* (sb-alien:union ,name)))
+ #+(or openmcl digitool) `((:* (:union ,name)))
+ #+lispworks `((:pointer ,name))
+ #-(or cmu sbcl scl openmcl digitool lispworks) `((* ,name))))
+ `(,(convert-from-uffi-type type aggregate-type))))))
(if variant
(push (list def) processed)
- (push def processed))))
+ (push def processed))))
(nreverse processed)))
(defmacro def-struct (name &rest fields)
#+(or cmu scl)
- `(alien:def-alien-type ,name (alien:struct ,name ,@(process-struct-fields name fields)))
+ `(alien:def-alien-type ,name (alien:struct ,name ,@(process-aggregate-fields name fields)))
#+sbcl
- `(sb-alien:define-alien-type ,name (sb-alien:struct ,name ,@(process-struct-fields name fields)))
+ `(sb-alien:define-alien-type ,name (sb-alien:struct ,name ,@(process-aggregate-fields name fields)))
#+allegro
- `(ff:def-foreign-type ,name (:struct ,@(process-struct-fields name fields)))
+ `(ff:def-foreign-type ,name (:struct ,@(process-aggregate-fields name fields)))
#+lispworks
- `(fli:define-c-struct ,name ,@(process-struct-fields name fields))
+ `(fli:define-c-struct ,name ,@(process-aggregate-fields name fields))
#+digitool
- `(ccl:defrecord ,name ,@(process-struct-fields name fields))
+ `(ccl:defrecord ,name ,@(process-aggregate-fields name fields))
#+openmcl
`(ccl::def-foreign-type
nil
- (:struct ,name ,@(process-struct-fields name fields)))
+ (:struct ,name ,@(process-aggregate-fields name fields)))
)
@@ -192,19 +200,26 @@
(defmacro def-union (name &rest fields)
#+allegro
- `(ff:def-foreign-type ,name (:union ,@(process-struct-fields name fields)))
+ `(ff:def-foreign-type ,name (:union ,@(process-aggregate-fields name fields
+ :aggregate-type :union)))
#+lispworks
- `(fli:define-c-union ,name ,@(process-struct-fields name fields))
+ `(fli:define-c-union ,name ,@(process-aggregate-fields name fields
+ :aggregate-type :union))
#+(or cmu scl)
- `(alien:def-alien-type ,name (alien:union ,name ,@(process-struct-fields name fields)))
+ `(alien:def-alien-type ,name (alien:union ,name ,@(process-aggregate-fields name fields
+ :aggregate-type :union)))
#+sbcl
- `(sb-alien:define-alien-type ,name (sb-alien:union ,name ,@(process-struct-fields name fields)))
+ `(sb-alien:define-alien-type ,name (sb-alien:union ,name ,@(process-aggregate-fields name fields
+ :aggregate-type :union)))
#+digitool
- `(ccl:defrecord ,name (:variant ,@(process-struct-fields name fields t)))
+ `(ccl:defrecord ,name (:variant ,@(process-aggregate-fields name fields
+ :variant t
+ :aggregate-type :union)))
#+openmcl
`(ccl::def-foreign-type nil
- (:union ,name ,@(process-struct-fields name fields)))
-)
+ (:union ,name ,@(process-aggregate-fields name fields
+ :aggregate-type :union)))
+ )
#-(or sbcl cmu)