0.pre7.92:
[sbcl.git] / src / code / debug.lisp
index d95d1da..5e6dd5a 100644 (file)
   "Should the debugger display beginner-oriented help messages?")
 
 (defun debug-prompt (stream)
-
-  ;; old behavior, will probably go away in sbcl-0.7.x
-  (format stream "~%~D" (sb!di:frame-number *current-frame*))
-  (dotimes (i *debug-command-level*)
-    (write-char #\] stream))
-  (write-char #\space stream)
-
-  ;; planned new behavior, delayed since it will break ILISP
-  #+nil 
   (format stream
-         "~%~D~:[~;[~D~]] "
+         "~%~W~:[~;[~W~]] "
          (sb!di:frame-number *current-frame*)
          (> *debug-command-level* 1)
          *debug-command-level*))
@@ -255,10 +246,9 @@ Function and macro commands:
 ;;; info about a made breakpoint
 (defstruct (breakpoint-info (:copier nil))
   ;; where we are going to stop
-  (place (required-argument)
-        :type (or sb!di:code-location sb!di:debug-fun))
+  (place (missing-arg)  :type (or sb!di:code-location sb!di:debug-fun))
   ;; the breakpoint returned by sb!di:make-breakpoint
-  (breakpoint (required-argument) :type sb!di:breakpoint)
+  (breakpoint (missing-arg) :type sb!di:breakpoint)
   ;; the function returned from SB!DI:PREPROCESS-FOR-EVAL. If result is
   ;; non-NIL, drop into the debugger.
   (break #'identity :type function)
@@ -271,10 +261,10 @@ Function and macro commands:
   (print nil :type list)
   ;; the number used when listing the possible breakpoints within a
   ;; function. Could also be a symbol such as start or end.
-  (code-location-number (required-argument) :type (or symbol integer))
+  (code-location-number (missing-arg) :type (or symbol integer))
   ;; the number used when listing the breakpoints active and to delete
   ;; breakpoints
-  (breakpoint-number (required-argument) :type integer))
+  (breakpoint-number (missing-arg) :type integer))
 
 ;;; Return a new BREAKPOINT-INFO structure with the info passed.
 (defun create-breakpoint-info (place breakpoint code-location-number
@@ -693,28 +683,32 @@ reset to ~S."
         (internal-debug))))))
 
 (defun show-restarts (restarts s)
-  (when restarts
-    (format s "~&restarts:~%")
-    (let ((count 0)
-         (names-used '(nil))
-         (max-name-len 0))
-      (dolist (restart restarts)
-       (let ((name (restart-name restart)))
-         (when name
-           (let ((len (length (princ-to-string name))))
-             (when (> len max-name-len)
-               (setf max-name-len len))))))
-      (unless (zerop max-name-len)
-       (incf max-name-len 3))
-      (dolist (restart restarts)
-       (let ((name (restart-name restart)))
-         (cond ((member name names-used)
-                (format s "~& ~2D: ~@VT~A~%" count max-name-len restart))
-               (t
-                (format s "~& ~2D: [~VA] ~A~%"
-                        count (- max-name-len 3) name restart)
-                (push name names-used))))
-       (incf count)))))
+  (cond ((null restarts)
+        (format s
+                "~&(no restarts: If you didn't do this on purpose, ~
+                  please report it as a bug.)~%"))
+       (t
+        (format s "~&restarts:~%")
+        (let ((count 0)
+              (names-used '(nil))
+              (max-name-len 0))
+          (dolist (restart restarts)
+            (let ((name (restart-name restart)))
+              (when name
+                (let ((len (length (princ-to-string name))))
+                  (when (> len max-name-len)
+                    (setf max-name-len len))))))
+          (unless (zerop max-name-len)
+            (incf max-name-len 3))
+          (dolist (restart restarts)
+            (let ((name (restart-name restart)))
+              (cond ((member name names-used)
+                     (format s "~& ~2D: ~@VT~A~%" count max-name-len restart))
+                    (t
+                     (format s "~& ~2D: [~VA] ~A~%"
+                             count (- max-name-len 3) name restart)
+                     (push name names-used))))
+            (incf count))))))
 
 ;;; This calls DEBUG-LOOP, performing some simple initializations
 ;;; before doing so. INVOKE-DEBUGGER calls this to actually get into
@@ -745,9 +739,11 @@ reset to ~S."
         (*stack-top* (or *stack-top-hint* *real-stack-top*))
         (*stack-top-hint* nil)
         (*current-frame* *stack-top*))
-    (handler-bind ((sb!di:debug-condition (lambda (condition)
-                                           (princ condition *debug-io*)
-                                           (throw 'debug-loop-catcher nil))))
+    (handler-bind ((sb!di:debug-condition
+                   (lambda (condition)
+                     (princ condition *debug-io*)
+                     (/show0 "handling d-c by THROWing DEBUG-LOOP-CATCHER")
+                     (throw 'debug-loop-catcher nil))))
       (fresh-line)
       (print-frame-call *current-frame* :verbosity 2)
       (loop
@@ -762,13 +758,14 @@ reset to ~S."
                                              "~&error flushed (because ~
                                               ~S is set)"
                                              '*flush-debug-errors*)
+                                     (/show0 "throwing DEBUG-LOOP-CATCHER")
                                      (throw 'debug-loop-catcher nil)))))
            ;; We have to bind level for the restart function created by
            ;; WITH-SIMPLE-RESTART.
            (let ((level *debug-command-level*)
                  (restart-commands (make-restart-commands)))
              (with-simple-restart (abort
-                                  "Reduce debugger level (to debug level ~D)."
+                                  "Reduce debugger level (to debug level ~W)."
                                    level)
                (debug-prompt *debug-io*)
                (force-output *debug-io*)
@@ -897,7 +894,7 @@ reset to ~S."
                (let ((v (find id vars :key #'sb!di:debug-var-id)))
                  (unless v
                    (error
-                    "invalid variable ID, ~D: should have been one of ~S"
+                    "invalid variable ID, ~W: should have been one of ~S"
                     id
                     (mapcar #'sb!di:debug-var-id vars)))
                  ,(ecase ref-or-set
@@ -1023,7 +1020,7 @@ argument")
       (let* ((name
              (if (symbolp form)
                  (symbol-name form)
-                 (format nil "~D" form)))
+                 (format nil "~W" form)))
             (len (length name))
             (res nil))
        (declare (simple-string name)
@@ -1055,7 +1052,7 @@ argument")
                 (setf (car cmds) (caar cmds))))))))
 
 ;;; Return a list of debug commands (in the same format as
-;;; *debug-commands*) that invoke each active restart.
+;;; *DEBUG-COMMANDS*) that invoke each active restart.
 ;;;
 ;;; Two commands are made for each restart: one for the number, and
 ;;; one for the restart name (unless it's been shadowed by an earlier
@@ -1066,8 +1063,10 @@ argument")
     (dolist (restart restarts)
       (let ((name (string (restart-name restart))))
         (let ((restart-fun
-                #'(lambda () (invoke-restart-interactively restart))))
-          (push (cons (format nil "~d" num) restart-fun) commands)
+                #'(lambda ()
+                   (/show0 "in restart-command closure, about to i-r-i")
+                   (invoke-restart-interactively restart))))
+          (push (cons (prin1-to-string num) restart-fun) commands)
           (unless (or (null (restart-name restart)) 
                       (find name commands :key #'car :test #'string=))
             (push (cons name restart-fun) commands))))
@@ -1144,7 +1143,7 @@ argument")
 ;;; and "terminate the Lisp system" as the SB-EXT:QUIT function.)
 ;;;
 ;;;(!def-debug-command "QUIT" ()
-;;;  (throw 'sb!impl::top-level-catcher nil))
+;;;  (throw 'sb!impl::toplevel-catcher nil))
 
 ;;; CMU CL supported this GO debug command, but SBCL doesn't -- in
 ;;; SBCL you just type the CONTINUE restart name instead (or "RESTART
@@ -1155,6 +1154,7 @@ argument")
 ;;;  (error "There is no restart named CONTINUE."))
 
 (!def-debug-command "RESTART" ()
+  (/show0 "doing RESTART debug-command")
   (let ((num (read-if-available :prompt)))
     (when (eq num :prompt)
       (show-restarts *debug-restarts* *debug-io*)
@@ -1172,6 +1172,7 @@ argument")
                     (t
                      (format t "~S is invalid as a restart name.~%" num)
                      (return-from restart-debug-command nil)))))
+      (/show0 "got RESTART")
       (if restart
          (invoke-restart-interactively restart)
          ;; FIXME: Even if this isn't handled by WARN, it probably
@@ -1221,7 +1222,7 @@ argument")
            (setf any-p t)
            (when (eq (sb!di:debug-var-validity v location) :valid)
              (setf any-valid-p t)
-             (format t "~S~:[#~D~;~*~]  =  ~S~%"
+             (format t "~S~:[#~W~;~*~]  =  ~S~%"
                      (sb!di:debug-var-symbol v)
                      (zerop (sb!di:debug-var-id v))
                      (sb!di:debug-var-id v)
@@ -1272,39 +1273,39 @@ argument")
                 *cached-readtable* nil))
         *before-save-initializations*)
 
-;;; We also cache the last top-level form that we printed a source for
+;;; We also cache the last toplevel form that we printed a source for
 ;;; so that we don't have to do repeated reads and calls to
 ;;; FORM-NUMBER-TRANSLATIONS.
-(defvar *cached-top-level-form-offset* nil)
-(declaim (type (or index null) *cached-top-level-form-offset*))
-(defvar *cached-top-level-form*)
+(defvar *cached-toplevel-form-offset* nil)
+(declaim (type (or index null) *cached-toplevel-form-offset*))
+(defvar *cached-toplevel-form*)
 (defvar *cached-form-number-translations*)
 
 ;;; Given a code location, return the associated form-number
-;;; translations and the actual top-level form. We check our cache ---
+;;; translations and the actual top level form. We check our cache ---
 ;;; if there is a miss, we dispatch on the kind of the debug source.
-(defun get-top-level-form (location)
+(defun get-toplevel-form (location)
   (let ((d-source (sb!di:code-location-debug-source location)))
     (if (and (eq d-source *cached-debug-source*)
-            (eql (sb!di:code-location-top-level-form-offset location)
-                 *cached-top-level-form-offset*))
-       (values *cached-form-number-translations* *cached-top-level-form*)
-       (let* ((offset (sb!di:code-location-top-level-form-offset location))
+            (eql (sb!di:code-location-toplevel-form-offset location)
+                 *cached-toplevel-form-offset*))
+       (values *cached-form-number-translations* *cached-toplevel-form*)
+       (let* ((offset (sb!di:code-location-toplevel-form-offset location))
               (res
                (ecase (sb!di:debug-source-from d-source)
-                 (:file (get-file-top-level-form location))
+                 (:file (get-file-toplevel-form location))
                  (:lisp (svref (sb!di:debug-source-name d-source) offset)))))
-         (setq *cached-top-level-form-offset* offset)
+         (setq *cached-toplevel-form-offset* offset)
          (values (setq *cached-form-number-translations*
                        (sb!di:form-number-translations res offset))
-                 (setq *cached-top-level-form* res))))))
+                 (setq *cached-toplevel-form* res))))))
 
-;;; Locate the source file (if it still exists) and grab the top-level
-;;; form. If the file is modified, we use the top-level-form offset
+;;; Locate the source file (if it still exists) and grab the top level
+;;; form. If the file is modified, we use the top level form offset
 ;;; instead of the recorded character offset.
-(defun get-file-top-level-form (location)
+(defun get-file-toplevel-form (location)
   (let* ((d-source (sb!di:code-location-debug-source location))
-        (tlf-offset (sb!di:code-location-top-level-form-offset location))
+        (tlf-offset (sb!di:code-location-toplevel-form-offset location))
         (local-tlf-offset (- tlf-offset
                              (sb!di:debug-source-root-number d-source)))
         (char-offset
@@ -1354,7 +1355,7 @@ argument")
 (defun print-code-location-source-form (location context)
   (let* ((location (maybe-block-start-location location))
         (form-num (sb!di:code-location-form-number location)))
-    (multiple-value-bind (translations form) (get-top-level-form location)
+    (multiple-value-bind (translations form) (get-toplevel-form location)
       (unless (< form-num (length translations))
        (error "The source path no longer exists."))
       (prin1 (sb!di:source-path-context form
@@ -1402,8 +1403,8 @@ argument")
               (when prev-location
                 (let ((this-num (1- this-num)))
                   (if (= prev-num this-num)
-                      (format t "~&~D: " prev-num)
-                      (format t "~&~D-~D: " prev-num this-num)))
+                      (format t "~&~W: " prev-num)
+                      (format t "~&~W-~W: " prev-num this-num)))
                 (print-code-location-source-form prev-location 0)
                 (when *print-location-kind*
                   (format t "~S " (sb!di:code-location-kind prev-location)))
@@ -1419,9 +1420,9 @@ argument")
                    (not prev-location)
                    (not (eq (sb!di:code-location-debug-source code-location)
                             (sb!di:code-location-debug-source prev-location)))
-                   (not (eq (sb!di:code-location-top-level-form-offset
+                   (not (eq (sb!di:code-location-toplevel-form-offset
                              code-location)
-                            (sb!di:code-location-top-level-form-offset
+                            (sb!di:code-location-toplevel-form-offset
                              prev-location)))
                    (not (eq (sb!di:code-location-form-number code-location)
                             (sb!di:code-location-form-number prev-location))))