X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Ftarget-error.lisp;h=a1929f0120aef834198cac2181b19a48cabbc782;hb=2db3b6b4cb740d5b6512459c223859f747807b09;hp=747b54f10ade4c0a5c6843e71d68e3dda9fcd940;hpb=6e64d0c249f53f4d41fd7a75f80dfd10a1c89f06;p=sbcl.git diff --git a/src/code/target-error.lisp b/src/code/target-error.lisp index 747b54f..a1929f0 100644 --- a/src/code/target-error.lisp +++ b/src/code/target-error.lisp @@ -23,10 +23,10 @@ (defstruct (restart (:copier nil) (:predicate nil)) (name (missing-arg) :type symbol :read-only t) - function - report-function - interactive-function - (test-fun (lambda (cond) (declare (ignore cond)) t))) + (function (missing-arg) :type function) + (report-function nil :type (or null function)) + (interactive-function nil :type (or null function)) + (test-function (lambda (cond) (declare (ignore cond)) t) :type function)) (def!method print-object ((restart restart) stream) (if *print-escape* (print-unreadable-object (restart stream :type t :identity t) @@ -51,7 +51,8 @@ (when (and (or (not condition) (member restart associated) (not (member restart other))) - (funcall (restart-test-fun restart) condition)) + (funcall (restart-test-function restart) + condition)) (res restart)))) (res)))) @@ -112,10 +113,20 @@ 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." - (find-if (lambda (x) - (or (eq x name) - (eq (restart-name x) name))) - (compute-restarts condition))) + (let ((restarts (compute-restarts condition))) + (declare (type list restarts)) + (find-if (lambda (x) + (or (eq x name) + (eq (restart-name x) name))) + restarts))) + +(defun find-restart-or-lose (restart-designator) + (let ((real-restart (find-restart restart-designator))) + (unless real-restart + (error 'simple-control-error + :format-control "Restart ~S is not active." + :format-arguments (list restart-designator))) + real-restart)) (defun invoke-restart (restart &rest values) #!+sb-doc @@ -123,33 +134,23 @@ arguments. If the argument restart is not a restart or a currently active non-nil restart name, then a control-error is signalled." (/show "entering INVOKE-RESTART" restart) - (let ((real-restart (find-restart restart))) - (unless real-restart - (error 'simple-control-error - :format-control "Restart ~S is not active." - :format-arguments (list restart))) - (/show (restart-name real-restart)) + (let ((real-restart (find-restart-or-lose restart))) (apply (restart-function real-restart) values))) +(defun interactive-restart-arguments (real-restart) + (let ((interactive-function (restart-interactive-function real-restart))) + (if interactive-function + (funcall interactive-function) + '()))) + (defun invoke-restart-interactively (restart) #!+sb-doc "Calls the function associated with the given restart, prompting for any necessary arguments. If the argument restart is not a restart or a currently active non-nil restart name, then a control-error is signalled." - (/show "entering INVOKE-RESTART-INTERACTIVELY" restart) - (let ((real-restart (find-restart restart))) - (unless real-restart - (error 'simple-control-error - :format-control "Restart ~S is not active." - :format-arguments (list restart))) - (/show (restart-name real-restart)) - (/show0 "falling through to APPLY of RESTART-FUNCTION") - (apply (restart-function real-restart) - (let ((interactive-function - (restart-interactive-function real-restart))) - (if interactive-function - (funcall interactive-function) - '()))))) + (let* ((real-restart (find-restart-or-lose restart)) + (args (interactive-restart-arguments real-restart))) + (apply (restart-function real-restart) args))) (eval-when (:compile-toplevel :load-toplevel :execute) ;;; Wrap the RESTART-CASE expression in a WITH-CONDITION-RESTARTS if @@ -206,7 +207,7 @@ :interactive-function result))) (when test - (setq result (list* `#',test :test-fun result))) + (setq result (list* `#',test :test-function result))) (nreverse result))) (parse-keyword-pairs (list keys) (do ((l list (cddr l))