chiark / gitweb /
Modified WITH-ALLOCATED-MEMORY to use stack allocation when possible
authorespen <espen>
Wed, 15 Feb 2006 09:53:42 +0000 (09:53 +0000)
committerespen <espen>
Wed, 15 Feb 2006 09:53:42 +0000 (09:53 +0000)
glib/glib.lisp

index ebc3b30f1ff3e7127fe156467486253883d9397e..be287eb24f4062d412b9413d8e0aaa0a5e484258 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: glib.lisp,v 1.33 2006/02/09 22:24:31 espen Exp $
+;; $Id: glib.lisp,v 1.34 2006/02/15 09:53:42 espen Exp $
 
 
 (in-package "GLIB")
@@ -48,10 +48,15 @@ (defun copy-memory (from length &optional (to (allocate-memory length)))
   to)
 
 (defmacro with-allocated-memory ((var size) &body body)
-  `(let ((,var (allocate-memory ,size)))
-     (unwind-protect
-        (progn ,@body)
-       (deallocate-memory ,var))))
+  (if (constantp size)
+      (let ((alien (make-symbol "ALIEN")))
+       `(with-alien ((,alien (array #+sbcl(sb-alien:unsigned 8) #+cmu(alien:unsigned 8) ,(eval size))))
+          (let ((,var (alien-sap ,alien)))
+            ,@body)))
+    `(let ((,var (allocate-memory ,size)))
+       (unwind-protect
+          (progn ,@body)
+        (deallocate-memory ,var)))))
 
 
 ;;;; User data mechanism