Handle compiler-error in LOAD when it's not run from inside EVAL.
[sbcl.git] / src / code / step.lisp
index 314d10c..43a4801 100644 (file)
       (setf *step-out* nil))
     (step-out ()
       :report "Resume stepping after returning from this function"
-      (disable-stepping)
-      (setf *step-out* t)
+      (ecase *step-out*
+        ((nil)
+         (error "Can't STEP-OUT: No STEP-IN on the call-stack"))
+        ((t :maybe)
+         (disable-stepping)
+         (setf *step-out* t)))
       nil)
     (step-next ()
       :report "Step over call"
       t)))
 
 (defun step-values (form &rest values)
-  (declare (dynamic-extent values))
+  (declare (truly-dynamic-extent values))
   (signal 'step-values-condition :form form :result values)
   (values-list values))
 
-(defvar *step-help* "The following commands are available at the single
-stepper's prompt:
-
- S: Step into the current expression.
- N: Evaluate the current expression without stepping.
- C: Evaluate to finish without stepping.
- Q: Abort evaluation.
- B: Backtrace.
- ?: Display this message.
-")
+(defun step-finished ()
+  (restart-case
+      (signal 'step-finished-condition)
+    (continue ())))
 
 (defgeneric single-step (condition))
 
@@ -76,6 +74,10 @@ stepper's prompt:
     (let ((*stack-top-hint* (sb-di::find-stepped-frame)))
       (invoke-debugger condition))))
 
+;;; In the TTY debugger we're not interested in STEP returning
+(defmethod single-step ((condition step-finished-condition))
+  (values))
+
 (defvar *stepper-hook* 'single-step
   #+sb-doc "Customization hook for alternative single-steppers.
 *STEPPER-HOOK* is bound to NIL prior to calling the bound function
@@ -84,9 +86,10 @@ with the STEP-CONDITION as argument.")
 (defun invoke-stepper (condition)
   (when (and (stepping-enabled-p)
              *stepper-hook*)
-    (let ((hook *stepper-hook*)
-          (*stepper-hook* nil))
-      (funcall hook condition))))
+    (with-stepping-disabled
+      (let ((hook *stepper-hook*)
+            (*stepper-hook* nil))
+        (funcall hook condition)))))
 
 (defmacro step (form)
   #+sb-doc
@@ -95,9 +98,13 @@ outside the lexical scope of the form can be stepped into only if the
 functions in question have been compiled with sufficient DEBUG policy
 to be at least partially steppable."
   `(locally
-       (declare (optimize (sb-c:insert-step-conditions 0)))
-     (format t "Single stepping. Type ? for help.~%")
+    (declare (optimize debug (sb-c:insert-step-conditions 0)))
+     ;; Allow stepping out of the STEP form.
      (let ((*step-out* :maybe))
-       (with-stepping-enabled
-         (locally (declare (optimize (sb-c:insert-step-conditions 3)))
-           ,form)))))
+       (unwind-protect
+            (with-stepping-enabled
+              (multiple-value-prog1
+                  (locally (declare (optimize (sb-c:insert-step-conditions 3)))
+                    ,form)
+                (step-finished)))))))
+