minor optimization to restart-case
authorChristophe Rhodes <c.rhodes@gold.ac.uk>
Fri, 13 Sep 2013 13:30:13 +0000 (14:30 +0100)
committerChristophe Rhodes <c.rhodes@gold.ac.uk>
Fri, 13 Sep 2013 13:47:40 +0000 (14:47 +0100)
The generated non-local transfer functions go to a tag which will
always be in scope whenever the restart can be invoked, so wrap the
GO in a scary (safety 0) optimization declaration.  This fixes
lp#1023721 (but not the issue raised in comment #1, which would be
solved naturally if lp#383078 is addressed).

Include a test which deliberately breaks the normal dynamic-extent
lifetime for restarts; restarts generated by RESTART-CASE and friends
in fact have indefinite extent, even though once they're out of the
dynamic-extent of their creating/binding operator you can't really do
anything with them (INVOKE-RESTART signals a control-error if the
restart given is not active, and there's no way to reactivate a
restart).  However, the temptation to make the restart function
have dynamic-extent allocation must be resisted, because of the
indefinite lifetime of the restart object itself.

NEWS
src/code/defboot.lisp
tests/compiler.pure.lisp

diff --git a/NEWS b/NEWS
index ba2e242..e2bbefa 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -30,7 +30,9 @@ changes relative to sbcl-1.1.11:
   * bug fix: class definitions with CPLs inconsistent with their metaclasses
     are less likely to destroy the object system's integrity.  (lp#309076)
   * bug fix: restart clause parsing in RESTART-CASE is more in line with the
-    standard.  (lp#1203595, thanks to Jan Moringen)
+    standard.  (lp#1203585, thanks to Jan Moringen)
+  * bug fix: silence a note from RESTART-CASE under high-SPEED optimization
+    settings.  (lp#1023721)
   
 changes in sbcl-1.1.11 relative to sbcl-1.1.10:
   * enhancement: support building the manual under texinfo version 5.
index 046006b..33b2650 100644 (file)
@@ -530,7 +530,8 @@ evaluated as a PROGN."
                  (declare (ignore rest))
                  `(,name #'(lambda (&rest temp)
                              (setq ,temp-var temp)
-                             (go ,tag))
+                             (locally (declare (optimize (safety 0)))
+                               (go ,tag)))
                          ,@keywords)))
              (make-apply-and-return (clause-data)
                (destructuring-bind (name tag keywords lambda-list body) clause-data
index 2898bcd..40f4bef 100644 (file)
 
 ;; win32 is very specific about the order in which catch blocks
 ;; must be allocated on the stack
-(with-test (:name :bug-121581169)
+(with-test (:name :bug-1072739)
   (let ((f (compile nil
                     `(lambda ()
                        (STRING=
                                y))))
               (list (string 'list))
               (list "lisT")))))
+
+(with-test (:name (restart-case optimize speed compiler-note))
+  (handler-bind ((compiler-note #'error))
+    (compile nil '(lambda ()
+                   (declare (optimize speed))
+                   (restart-case () (c ()))))
+    (compile nil '(lambda ()
+                   (declare (optimize speed))
+                   (let (x)
+                     (restart-case (setf x (car (compute-restarts)))
+                       (c ()))
+                     x)))))
+