uffi/src objects.lisp,1.16,1.17 package.lisp,1.5,1.6 primitives.lisp,1.9,1.10
"Kevin M. Rosenberg" <[email protected]> Thu, 14 Aug 2003 21:40:15 +0000
| Newsgroups | gmane.lisp.uffi.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /pubcvs/uffi/src
In directory boa.b9.com:/tmp/cvs-serv19046/src
Modified Files:
objects.lisp package.lisp primitives.lisp
Log Message:
def-foreign-var support
Index: objects.lisp
===================================================================
RCS file: /pubcvs/uffi/src/objects.lisp,v
retrieving revision 1.16
retrieving revision 1.17
diff -C2 -d -r1.16 -r1.17
*** objects.lisp 14 Aug 2003 19:35:05 -0000 1.16
--- objects.lisp 14 Aug 2003 21:40:13 -0000 1.17
***************
*** 229,230 ****
--- 229,251 ----
(lisp-implementation-type)))
+ (defmacro def-foreign-var (names type module)
+ #-lispworks (declare (ignore module))
+ (let ((foreign-name (if (atom names) names (first names)))
+ (lisp-name (if (atom names) (uffi::make-lisp-name names) (second names)))
+ (var-type (uffi::convert-from-uffi-type type :foreign-var)))
+ #+(or cmu scl)
+ `(alien:def-alien-variable (,foreign-name ,lisp-name) ,var-type)
+ #+sbcl
+ `(sb-alien:define-alien-variable (,foreign-name ,lisp-name) ,var-type)
+ #+allegro
+ `(ff:def-foreign-variable (,lisp-name ,foreign-name) :convention :c
+ :type ,var-type)
+ #+lispworks
+ (let ((temp-name (gensym)))
+ `(progn
+ (fli:define-foreign-variable (,temp-name ,foreign-name) :type ,var-type :module ,module)
+ (define-symbol-macro ,lisp-name (,temp-name))))
+ #-(or allegro cmu scl sbcl lispworks)
+ `(define-symbol-macro ,lisp-name
+ '(error "DEF-FOREIGN-VAR not (yet) defined for ~A"
+ (lisp-implementation-type)))))
Index: primitives.lisp
===================================================================
RCS file: /pubcvs/uffi/src/primitives.lisp,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** primitives.lisp 6 Jun 2003 21:59:18 -0000 1.9
--- primitives.lisp 14 Aug 2003 21:40:13 -0000 1.10
***************
*** 83,95 ****
(eval-when (:compile-toplevel :load-toplevel :execute)
! (defvar +type-conversion-hash+ (make-hash-table :size 20))
! #+(or cmu sbcl scl) (defvar *cmu-def-type-hash* (make-hash-table :size 20))
)
#+(or cmu sbcl scl)
! (defparameter *cmu-sbcl-def-type-list* nil)
#+(or cmu scl)
! (defparameter *cmu-sbcl-def-type-list*
'((:char . (alien:signed 8))
(:unsigned-char . (alien:unsigned 8))
--- 83,98 ----
(eval-when (:compile-toplevel :load-toplevel :execute)
! (defvar +type-conversion-hash+ (make-hash-table :size 20 :test #'eq))
! #+(or cmu sbcl scl) (defvar *cmu-def-type-hash*
! (make-hash-table :size 20 :test #'eq))
! #+allegro (defvar *allegro-foreign-type-hash*
! (make-hash-table :size 20 :test #'eq))
)
#+(or cmu sbcl scl)
! (defvar *cmu-sbcl-def-type-list* nil)
#+(or cmu scl)
! (defvar *cmu-sbcl-def-type-list*
'((:char . (alien:signed 8))
(:unsigned-char . (alien:unsigned 8))
***************
*** 107,111 ****
"Conversions in CMUCL for def-foreign-type are different than in def-function")
#+sbcl
! (defparameter *cmu-sbcl-def-type-list*
'((:char . (sb-alien:signed 8))
(:unsigned-char . (sb-alien:unsigned 8))
--- 110,114 ----
"Conversions in CMUCL for def-foreign-type are different than in def-function")
#+sbcl
! (defvar *cmu-sbcl-def-type-list*
'((:char . (sb-alien:signed 8))
(:unsigned-char . (sb-alien:unsigned 8))
***************
*** 123,127 ****
"Conversions in SBCL for def-foreign-type are different than in def-function")
! (defparameter *type-conversion-list* nil)
#+(or cmu scl)
--- 126,130 ----
"Conversions in SBCL for def-foreign-type are different than in def-function")
! (defvar *type-conversion-list* nil)
#+(or cmu scl)
***************
*** 223,226 ****
--- 226,246 ----
(:array . :array)))
+ #+allegro
+ (defvar *allegro-foreign-type-list*
+ '((:char . :signed-byte)
+ (:unsigned-char . :unsigned-byte)
+ (:byte . :signed-byte)
+ (:unsigned-byte . :unsigned-byte)
+ (:short . :signed-word)
+ (:unsigned-short . :unsigned-word)
+ (:int . :signed-long)
+ (:unsigned-int . :unsigned-long32)
+ (:long . :signed-long)
+ (:unsigned-long . :unsigned-long)
+ (:float . :single-float)
+ (:double . :double-float)
+ )
+ "Conversion for Allegro's system:memref function")
+
(dolist (type *type-conversion-list*)
(setf (gethash (car type) +type-conversion-hash+) (cdr type)))
***************
*** 230,233 ****
--- 250,261 ----
(setf (gethash (car type) *cmu-def-type-hash*) (cdr type)))
+ #+allegro
+ (dolist (type *allegro-foreign-type-list*)
+ (setf (gethash (car type) *allegro-foreign-type-hash*) (cdr type)))
+
+ (defun foreign-var-type-convert (type)
+ #+allegro (gethash type *allegro-foreign-type-hash*))
+
+
(defun basic-convert-from-uffi-type (type)
(let ((found-type (gethash type +type-conversion-hash+)))
***************
*** 257,260 ****
--- 285,291 ----
#+(and mcl (not openmcl))
((and (eq type :void) (eq context :return)) nil)
+ #+allegro
+ ((eq context :foreign-var)
+ (foreign-var-type-convert type))
(t
(basic-convert-from-uffi-type type)))
Index: package.lisp
===================================================================
RCS file: /pubcvs/uffi/src/package.lisp,v
retrieving revision 1.5
retrieving revision 1.6
diff -C2 -d -r1.5 -r1.6
*** package.lisp 14 Aug 2003 19:35:05 -0000 1.5
--- package.lisp 14 Aug 2003 21:40:13 -0000 1.6
***************
*** 51,54 ****
--- 51,55 ----
#:char-array-to-pointer
#:with-cast-pointer
+ #:def-foreign-var
;; string functions