(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))
(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
(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
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)))))))
+