X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/90e8bbf63d6ab5647f284af1cbab30ae37c5ae1c..c470da880479bee6a13115ccb70d62cdcf6f532c:/gffi/memory.lisp diff --git a/gffi/memory.lisp b/gffi/memory.lisp index 997a632..3712048 100644 --- a/gffi/memory.lisp +++ b/gffi/memory.lisp @@ -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.2 2006-06-08 13:24:25 espen Exp $ +;; $Id: memory.lisp,v 1.4 2007-06-02 07:26:23 espen Exp $ (in-package "GFFI") @@ -71,14 +71,61 @@ (defun (setf ref-byte) (byte location &optional (offset 0)) #+clisp(ffi:memory-as location 'ffi:uchar offset) byte)) +(defun ref-int-32 (location &optional (offset 0)) + #+(or cmu sbcl)(signed-sap-ref-32 location offset) + #+clisp(ffi:memory-as location 'ffi:sint32 offset)) + +(defun (setf ref-int-32) (value location &optional (offset 0)) + (setf + #+(or cmu sbcl)(signed-sap-ref-32 location offset) + #+clisp(ffi:memory-as location 'ffi:sint32 offset) + value)) + +(defun ref-uint-32 (location &optional (offset 0)) + #+(or cmu sbcl)(sap-ref-32 location offset) + #+clisp(ffi:memory-as location 'ffi:uint32 offset)) + +(defun (setf ref-uint-32) (value location &optional (offset 0)) + (setf + #+(or cmu sbcl)(sap-ref-32 location offset) + #+clisp(ffi:memory-as location 'ffi:uint32 offset) + value)) + +(defun ref-single-float (location &optional (offset 0)) + #+(or cmu sbcl)(sap-ref-single location offset) + #+clisp(ffi:memory-as location 'single-float offset)) + +(defun (setf ref-single-float) (value location &optional (offset 0)) + (setf + #+(or cmu sbcl)(sap-ref-single location offset) + #+clisp(ffi:memory-as location 'single-float offset) + value)) + +(defun ref-double-float (location &optional (offset 0)) + #+(or cmu sbcl)(sap-ref-double location offset) + #+clisp(ffi:memory-as location 'double-float offset)) + +(defun (setf ref-double-float) (value location &optional (offset 0)) + (setf + #+(or cmu sbcl)(sap-ref-double location offset) + #+clisp(ffi:memory-as location 'double-float offset) + value)) + + + +(defparameter *memory-allocator* nil) +(defparameter *memory-deallocator* nil) + (defun allocate-memory (size) - (declare (ignore size)) - (error "Memory allocator not set")) + (if *memory-allocator* + (funcall *memory-allocator* size) + (error "Memory allocator not set"))) (declaim (ftype (function (integer) system-area-pointer) allocate-memory)) (defun deallocate-memory (location) - (declare (ignore location)) - (warn "Memory deallocator not set")) + (if *memory-deallocator* + (funcall *memory-deallocator* location) + (warn "Memory deallocator not set"))) (defun copy-memory (from length &optional (to (allocate-memory length))) #+cmu(system-area-copy from 0 to 0 (* 8 length))