r9012: add make-pointer and pointer-address
[uffi.git] / src / objects.lisp
index dc382f52627ff41022aa43ce34a15bcfd030dd44..82a9d0e8270960c5041310aa0bc1d59c0ef81527 100644 (file)
@@ -92,6 +92,22 @@ an array of TYPE with size SIZE. The TYPE parameter is evaluated."
   #+mcl `(ccl:%null-ptr)
   )
 
+(defmacro make-pointer (addr type)
+  #+(or allegro mcl) (declare (ignore type))
+  #+(or cmu scl) `(alien:sap-alien (system:int-sap ,addr) (* ,(convert-from-uffi-type (eval type) :type)))
+  #+sbcl `(sb-alien:sap-alien (sb-sys:int-sap ,addr) (* ,(convert-from-uffi-type (eval type) :type)))
+  #+lispworks `(fli:make-pointer :address ,addr :type (quote ,(convert-from-uffi-type (eval type) :type)))
+  #+allegro addr
+  #+mcl `(ccl:%int-to-ptr addr)
+  )
+
+(defmacro pointer-address (ptr)
+  #+allegro ptr
+  #+(or cmu scl) `(system:sap-int (alien:alien-sap ,ptr))
+  #+sbcl `(sb-sys:sap-int (sb-alien:alien-sap ,ptr))
+  #+lispworks `(fli:pointer-address ,ptr)
+  #+mcl `(ccl:%ptr-to-int ,ptr))
+
 (defmacro char-array-to-pointer (obj)
   #+(or cmu scl) `(alien:cast ,obj (* (alien:unsigned 8)))
   #+sbcl `(sb-alien:cast ,obj (* (sb-alien:unsigned 8)))