on platforms supporting dynamic-extent allocation.
* enhancement: saving cores with foreign code loaded is now supported
on MIPS/Linux in addition to the previously supported platforms.
- * bug fix: COMPUTE-RESTARTS returns all active restarts, including those
- with :TEST, when called without a condition. (reported by Helmut Eller for
- CMUCL)
+ * bug fix: FIND-RESTART now tests for activity, not applicability when given
+ a restart object as identifier. (reported by Helmut Eller for CMUCL)
* bug fix: division by zero in sb-sprof when no samples were collected
* bug fix: a race when a slow to arrive sigprof signal killed sbcl
* bug fix: asdf-install uses CRLF as required by the HTTP spec.
(defun compute-restarts (&optional condition)
#!+sb-doc
- "Return a list of all the currently active restarts ordered from most
- recently established to less recently established. If CONDITION is
- specified, then only restarts associated with CONDITION (or with no
- condition) will be returned."
+ "Return a list of all the currently active restarts ordered from most recently
+established to less recently established. If CONDITION is specified, then only
+restarts associated with CONDITION (or with no condition) will be returned."
(let ((associated ())
(other ()))
(dolist (alist *condition-restarts*)
(when (and (or (not condition)
(member restart associated)
(not (member restart other)))
- (or (not condition)
- (funcall (restart-test-function restart)
- condition)))
+ (funcall (restart-test-function restart) condition))
(res restart))))
(res))))
(format stream "~S" restart)))))
stream))
-(defun find-restart (name &optional condition)
+(defun find-restart (identifier &optional condition)
#!+sb-doc
- "Return the first restart named NAME. If NAME names a restart, the restart
- is returned if it is currently active. If no such restart is found, NIL is
- returned. It is an error to supply NIL as a name. If CONDITION is specified
- and not NIL, then only restarts associated with that condition (or with no
- condition) will be returned."
- (let ((restarts (compute-restarts condition)))
- (declare (type list restarts))
- (find-if (lambda (x)
- (or (eq x name)
- (eq (restart-name x) name)))
- restarts)))
+ "Return the first restart identified by IDENTIFIER. If IDENTIFIER is a symbol,
+then the innermost applicable restart with that name is returned. If IDENTIFIER
+is a restart, it is returned if it is currently active. Otherwise NIL is
+returned. If CONDITION is specified and not NIL, then only restarts associated
+with that condition (or with no condition) will be returned."
+ ;; see comment above
+ (if (typep identifier 'restart)
+ (and (find-if (lambda (cluster) (find identifier cluster)) *restart-clusters*)
+ identifier)
+ (find identifier (compute-restarts condition) :key #'restart-name)))
;;; helper for the various functions which are ANSI-spec'ed to do
;;; something with a restart or signal CONTROL-ERROR if there is none