From d8bc833d61d0d4eaa56fa8caeb7607e464427142 Mon Sep 17 00:00:00 2001
From: Francois-Rene Rideau <tunes@google.com>
Date: Mon, 7 Apr 2014 12:38:07 -0400
Subject: [PATCH] Better optimization-setting support, especially for clisp.
 Better tests. Thanks to Robert Brown.

---
 test/test-utilities.script | 14 ++++++++------
 uiop/lisp-build.lisp       |  9 ++++++++-
 2 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/test/test-utilities.script b/test/test-utilities.script
index f7689b86d..4656a430a 100644
--- a/test/test-utilities.script
+++ b/test/test-utilities.script
@@ -315,9 +315,11 @@
 
 (DBG :optimization-settings)
 #-(or allegro ecl-bytecmp gcl mkcl)
-(loop :for i :from 0 :to 3 :do
-  (with-optimization-settings (`((speed ,i) (space ,i) (safety ,i) (debug ,i)))
-    (let ((s (get-optimization-settings)))
-      (loop :for q :in '(speed space safety debug) :do
-        #+mkcl (DBG :os i q s (assoc q s))
-        (assert-equal i (second (assoc q s)))))))
+(loop :with settings = (get-optimization-settings)
+      :for i :from 0 :to 3 :do
+        (with-optimization-settings (`((speed ,i) (space ,i) (safety ,i) (debug ,i)))
+          (let ((s (get-optimization-settings)))
+            (loop :for q :in '(speed space safety debug) :do
+                  #+mkcl (DBG :os i q s (assoc q s))
+                         (assert-equal i (second (assoc q s))))))
+        (assert-equal (get-optimization-settings) settings))
diff --git a/uiop/lisp-build.lisp b/uiop/lisp-build.lisp
index 013b760b5..d32adef21 100644
--- a/uiop/lisp-build.lisp
+++ b/uiop/lisp-build.lisp
@@ -82,7 +82,7 @@ This can help you produce more deterministic output for FASLs."))
     (let ((settings '(speed space safety debug compilation-speed #+(or cmu scl) c::brevity)))
       #.`(loop :for x :in settings
                ,@(or #+(or abcl ecl gcl mkcl xcl) '(:for v :in +optimization-variables+))
-               :for y = (or #+clisp (gethash x system::*optimize*)
+               :for y = (or #+clisp (gethash x system::*optimize* 0)
                             #+(or abcl ecl mkcl xcl) (symbol-value v)
                             #+(or cmu scl) (slot-value c::*default-cookie*
                                                        (case x (compilation-speed 'c::cspeed)
@@ -97,6 +97,13 @@ This can help you produce more deterministic output for FASLs."))
       (unless (equal *previous-optimization-settings* settings)
         (setf *previous-optimization-settings* settings))))
   (defmacro with-optimization-settings ((&optional (settings *optimization-settings*)) &body body)
+    #+clisp
+    (let ((previous-settings (gensym "PREVIOUS-SETTINGS")))
+      `(let ((,previous-settings (get-optimization-settings)))
+         ,@(when settings `((proclaim `(optimize ,@,settings))))
+         (unwind-protect (progn ,@body)
+           (proclaim `(optimize ,@,previous-settings)))))
+    #-clisp
     `(let ,(loop :for v :in +optimization-variables+ :collect `(,v ,v))
        ,@(when settings `((proclaim `(optimize ,@,settings))))
        ,@body)))
-- 
GitLab