Simplified WITH-MEMORY
authorespen <espen>
Tue, 29 Apr 2008 22:11:35 +0000 (22:11 +0000)
committerespen <espen>
Tue, 29 Apr 2008 22:11:35 +0000 (22:11 +0000)
gffi/memory.lisp

index c73efbf..7c8f458 100644 (file)
@@ -20,7 +20,7 @@
 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-;; $Id: memory.lisp,v 1.7 2007-12-11 12:01:34 espen Exp $
+;; $Id: memory.lisp,v 1.8 2008-04-29 22:11:35 espen Exp $
 
 
 (in-package "GFFI")
    value))
 
 
-(defparameter *memory-allocator* nil)
-(defparameter *memory-deallocator* nil)
+(defvar *memory-allocator* nil)
+(defvar *memory-deallocator* nil)
 
 (defun allocate-memory (size)
   (if *memory-allocator*
   t)
 
 (defmacro with-memory ((var size) &body body)
-  #-clisp
-  (if (and #+(or cmu sbcl)t (constantp size))
-      (let ((memory (make-symbol "MEMORY"))
-           (size (eval size)))
-       `(with-alien ((,memory (array #+sbcl(sb-alien:unsigned 8) #+cmu(alien:unsigned 8) ,size)))
-          (let ((,var (alien-sap ,memory)))
-            (clear-memory ,var ,size)
-            ,@body)))
-    `(let ((,var (allocate-memory ,size)))
-       (unwind-protect
-          (progn ,@body)
-        (deallocate-memory ,var))))
-  #+clisp
-  (let ((memory (make-symbol "MEMORY")))          
-    `(ffi:with-foreign-object (,memory `(ffi:c-array ffi:uint8 ,,size))
-       (let ((,var (ffi:foreign-address ,memory)))
-        ,@body))))
+  (cond
+    #+(or cmu sbcl)
+    ((constantp size)
+     (let ((memory (make-symbol "MEMORY"))
+          (size (eval size)))
+       `(with-alien ((,memory (array #+sbcl(sb-alien:unsigned 8) #+cmu(alien:unsigned 8) ,size)))
+         (let ((,var (alien-sap ,memory)))
+           (clear-memory ,var ,size)
+           ,@body))))
+    (t
+     #-clisp
+     `(let ((,var (allocate-memory ,size)))
+       (unwind-protect
+            (progn ,@body)
+         (deallocate-memory ,var)))
+     #+clisp
+     (let ((memory (make-symbol "MEMORY")))       
+       `(ffi:with-foreign-object (,memory `(ffi:c-array ffi:uint8 ,,size))
+         (let ((,var (ffi:foreign-address ,memory)))
+           ,@body))))))
 
 (defmacro with-pointer ((var &optional (pointer '(make-pointer 0))) &body body)
   "Binds POINTER to VAR in a way which makes it possible to pass the location of VAR to in foreign function call."
           ((#-big-endian :big #+big-endian :little)
            (,set-swapped location offset value)
            value))))))
+
+#+cmu
+(defmacro with-pinned-objects (objects &body body)
+  (declare (ignore objects))
+  `(without-gcing ,@body))
+