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