0.8.19.15:
[sbcl.git] / contrib / sb-aclrepl / inspect.lisp
index 96eea04..8611d9d 100644 (file)
 (cl:in-package #:sb-aclrepl)
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
-  (defconstant +default-inspect-length+ 10))
+  (defconstant +default-inspect-length+ 20))
 
-(defstruct inspect
+(defstruct (%inspect (:constructor make-inspect)
+                    (:conc-name inspect-))
   ;; stack of parents of inspected object
   object-stack 
   ;;  a stack of indices of parent object components
@@ -25,8 +26,6 @@
   "Raw mode for object display.")
 (defparameter *inspect-length* +default-inspect-length+
   "maximum number of components to print") 
-(defparameter *inspect-skip* 0
-  "number of initial components to skip when displaying an object") 
 (defparameter *skip-address-display* nil
   "Skip displaying addresses of objects.")
 
@@ -39,6 +38,7 @@ The commands are:
 :i ?           display this help
 :i *           inspect the current * value
 :i + <form>    inspect the (eval form)
+:i slot <name> inspect component of object, even if name is an istep cmd
 :i <index>     inspect the numbered component of object
 :i <name>      inspect the named component of object
 :i <form>      evaluation and inspect form
@@ -47,7 +47,6 @@ The commands are:
 :i <           inspect previous parent component
 :i >           inspect next parent component
 :i set <index> <form> set indexed component to evalated form
-i set <name> <form>  set named component to evalated form
 :i print <max> set the maximum number of components to print
 :i skip <n>    skip a number of components when printing
 :i tree        print inspect stack
@@ -59,278 +58,266 @@ i set <name> <form>  set named component to evalated form
   (defvar *inspect-unbound-object-marker* (gensym "INSPECT-UNBOUND-OBJECT-")))
 
 
-;; Setup binding for multithreading
-(let ((*current-inspect* nil)
-      (*inspect-raw* nil)
-      (*inspect-length* +default-inspect-length+)
-      (*inspect-skip* 0)
-      (*skip-address-display* nil))
-  
-  (defun inspector (object input-stream output-stream)
-    (declare (ignore input-stream))
-    (setq object (eval object))
+(defun inspector-fun (object input-stream output-stream)
+  (let ((*current-inspect* nil)
+       (*inspect-raw* nil)
+       (*inspect-length* *inspect-length*)
+       (*skip-address-display* nil))
     (setq *current-inspect* (make-inspect))
-    (new-break :inspect *current-inspect*)
-    (reset-stack)
-    (setf (inspect-object-stack *current-inspect*) (list object))
-    (setf (inspect-select-stack *current-inspect*)
-         (list (format nil "(inspect ...)")))
-    (redisplay output-stream))
-
-  (setq sb-impl::*inspect-fun* #'inspector)
-  
-  (defun istep (args stream)
-    (unless *current-inspect*
-      (setq *current-inspect* (make-inspect)))
-    (istep-dispatch args
-                    (first args)
-                    (when (first args) (read-from-string (first args)))
-                    stream))
-
-  (defun istep-dispatch (args option-string option stream)
-    (cond
-      ((or (string= "=" option-string) (zerop (length args)))
-       (istep-cmd-redisplay stream))
-      ((or (string= "-" option-string) (string= "^" option-string))
-       (istep-cmd-parent stream))
-      ((string= "*" option-string)
-       (istep-cmd-inspect-* stream))
-      ((string= "+" option-string)
-       (istep-cmd-inspect-new-form (read-from-string (second args)) stream))
-      ((or (string= "<" option-string)
-          (string= ">" option-string))
-       (istep-cmd-select-parent-component option-string stream))
-      ((string-equal "set" option-string)
-       (istep-cmd-set (second args) (third args) stream))
-      ((string-equal "raw" option-string)
-       (istep-cmd-set-raw (second args) stream))
-      ((string-equal "q" option-string)
-       (istep-cmd-reset))
-      ((string-equal "?" option-string)
-       (istep-cmd-help stream))
-      ((string-equal "skip" option-string)
-       (istep-cmd-skip (second args) stream))
-      ((string-equal "tree" option-string)
-       (istep-cmd-tree stream)) 
-      ((string-equal "print" option-string)
-       (istep-cmd-print (second args) stream))
-      ((or (symbolp option)
-          (integerp option))
-       (istep-cmd-select-component option stream))
-      (t
-       (istep-cmd-set-stack option stream))))
+    (reset-stack object "(inspect ...)")
+    (redisplay output-stream)
+    (let ((*input* input-stream)
+         (*output* output-stream))
+      (repl :inspect t)))
+  (values))
+
+(setq sb-impl::*inspect-fun* #'inspector-fun)
+
+(defun istep (args stream)
+  (unless *current-inspect*
+    (setq *current-inspect* (make-inspect)))
+  (istep-dispatch args
+                 (first args)
+                 (when (first args) (read-from-string (first args)))
+                 stream))
+
+(defun istep-dispatch (args option-string option stream)
+  (cond
+    ((or (string= "=" option-string) (zerop (length args)))
+     (istep-cmd-redisplay stream))
+    ((or (string= "-" option-string) (string= "^" option-string))
+     (istep-cmd-parent stream))
+    ((string= "*" option-string)
+     (istep-cmd-inspect-* stream))
+    ((string= "+" option-string)
+     (istep-cmd-inspect-new-form (read-from-string (second args)) stream))
+    ((or (string= "<" option-string)
+        (string= ">" option-string))
+     (istep-cmd-select-parent-component option-string stream))
+    ((string-equal "set" option-string)
+     (istep-cmd-set (second args) (third args) stream))
+    ((string-equal "raw" option-string)
+     (istep-cmd-set-raw (second args) stream))
+    ((string-equal "q" option-string)
+     (istep-cmd-reset))
+    ((string-equal "?" option-string)
+     (istep-cmd-help stream))
+    ((string-equal "skip" option-string)
+     (istep-cmd-skip (second args) stream))
+    ((string-equal "tree" option-string)
+     (istep-cmd-tree stream)) 
+    ((string-equal "print" option-string)
+     (istep-cmd-print (second args) stream))
+    ((string-equal "slot" option-string)
+     (istep-cmd-select-component (read-from-string (second args)) stream))
+    ((or (symbolp option)
+        (integerp option))
+     (istep-cmd-select-component option stream))
+    (t
+     (istep-cmd-set-stack option stream))))
 
-  (defun set-current-inspect (inspect)
-    (setq *current-inspect* inspect))
+(defun set-current-inspect (inspect)
+  (setq *current-inspect* inspect))
 
-  (defun reset-stack ()
-    (setf (inspect-object-stack *current-inspect*) nil)
-    (setf (inspect-select-stack *current-inspect*) nil))
+(defun reset-stack (&optional object label)
+  (cond
+    ((null label)
+     (setf (inspect-object-stack *current-inspect*) nil)
+     (setf (inspect-select-stack *current-inspect*) nil))
+    (t
+     (setf (inspect-object-stack *current-inspect*) (list object))
+     (setf (inspect-select-stack *current-inspect*) (list label)))))
 
-  (defun output-inspect-note (stream note &rest args)
-    (apply #'format stream note args)
-    (princ #\Newline stream))
+(defun output-inspect-note (stream note &rest args)
+  (apply #'format stream note args)
+  (princ #\Newline stream))
 
-  (defun stack ()
-     (inspect-object-stack *current-inspect*))
+(defun stack ()
+  (inspect-object-stack *current-inspect*))
 
-  (defun redisplay (stream)
-    (display-current stream))
+(defun redisplay (stream &optional (skip 0))
+  (display-current stream *inspect-length* skip))
 
-  ;;;
-  ;;; istep command processing
-  ;;;
-  
-  (defun istep-cmd-redisplay (stream)
-    (redisplay stream))
+;;;
+;;; istep command processing
+;;;
 
-  (defun istep-cmd-parent (stream)
-    (cond
-      ((> (length (inspect-object-stack *current-inspect*)) 1)
-       (setf (inspect-object-stack *current-inspect*)
-            (cdr (inspect-object-stack *current-inspect*)))
-       (setf (inspect-select-stack *current-inspect*)
-            (cdr (inspect-select-stack *current-inspect*)))
-       (redisplay stream))
-      ((stack)
+(defun istep-cmd-redisplay (stream)
+  (redisplay stream))
+
+(defun istep-cmd-parent (stream)
+  (cond
+    ((> (length (inspect-object-stack *current-inspect*)) 1)
+     (setf (inspect-object-stack *current-inspect*)
+          (cdr (inspect-object-stack *current-inspect*)))
+     (setf (inspect-select-stack *current-inspect*)
+          (cdr (inspect-select-stack *current-inspect*)))
+     (redisplay stream))
+    ((stack)
        (output-inspect-note stream "Object has no parent"))
-      (t
-       (no-object-msg stream))))
-  
-  (defun istep-cmd-inspect-* (stream)
-    (reset-stack) 
-    (setf (inspect-object-stack *current-inspect*) (list *))
-    (setf (inspect-select-stack *current-inspect*) (list "(inspect *)"))
-    (set-break-inspect *current-inspect*)
-    (redisplay stream))
-
-  (defun istep-cmd-inspect-new-form (form stream)
-    (inspector (eval form) nil stream))
-
-  (defun istep-cmd-select-parent-component (option stream)
-    (if (stack)
-       (if (eql (length (stack)) 1)
-           (output-inspect-note stream "Object does not have a parent")
-           (let ((parent (second (stack)))
-                 (id (car (inspect-select-stack *current-inspect*))))
-             (multiple-value-bind (position parts)
-                 (find-part-id parent id)
-               (let ((new-position (if (string= ">" option)
-                                       (1+ position)
-                                       (1- position))))
-                 (if (< -1 new-position (parts-count parts))
-                     (let* ((value (component-at parts new-position)))
-                       (setf (car (inspect-object-stack *current-inspect*))
-                             value)
-                       (setf (car (inspect-select-stack *current-inspect*))
-                             (id-at parts new-position))
-                       (redisplay stream))
-                     (output-inspect-note stream
-                                          "Parent has no selectable component indexed by ~d"
-                                          new-position))))))
-       (no-object-msg stream)))
-
-  (defun istep-cmd-set-raw (option-string stream)
-    (when (inspect-object-stack *current-inspect*)
-      (cond
-       ((null option-string)
-        (setq *inspect-raw* t))
-       ((eq (read-from-string option-string) t)
-        (setq *inspect-raw* t))
-       ((eq (read-from-string option-string) nil)
-        (setq *inspect-raw* nil)))
-      (redisplay stream)))
-
-  (defun istep-cmd-reset ()
-    (reset-stack)
-    (set-break-inspect *current-inspect*))
-
-  (defun istep-cmd-help (stream)
-    (format stream *inspect-help*))
-
-  (defun istep-cmd-skip (option-string stream)
-    (if option-string
-       (let ((len (read-from-string option-string)))
-         (if (and (integerp len) (>= len 0))
-             (let ((*inspect-skip* len)) 
-               (redisplay stream))
-             (output-inspect-note stream "Skip length invalid")))
-       (output-inspect-note stream "Skip length missing")))
-
-  (defun istep-cmd-print (option-string stream)
-    (if option-string
-       (let ((len (read-from-string option-string)))
-         (if (and (integerp len) (plusp len))
-             (setq *inspect-length* len)
-             (output-inspect-note stream "Cannot set print limit to ~A~%" len)))
-       (output-inspect-note stream "Print length missing")))
-
-  (defun select-description (select)
-    (typecase select
-      (integer
-       (format nil "which is componenent number ~d of" select))
-      (symbol
-       (format nil "which is the ~a component of" select))
-      (string
-       (format nil "which was selected by ~A" select))
-      (t
-       (write-to-string select))))
-  
-  (defun istep-cmd-tree (stream)
-    (let ((stack (inspect-object-stack *current-inspect*)))
-      (if stack
-         (progn
-           (output-inspect-note stream "The current object is:")
-           (dotimes (i (length stack))
-             (output-inspect-note
+    (t
+     (no-object-msg stream))))
+
+(defun istep-cmd-inspect-* (stream)
+  (reset-stack * "(inspect *)")
+  (redisplay stream))
+
+(defun istep-cmd-inspect-new-form (form stream)
+  (inspector-fun (eval form) nil stream))
+
+(defun istep-cmd-select-parent-component (option stream)
+  (if (stack)
+      (if (eql (length (stack)) 1)
+         (output-inspect-note stream "Object does not have a parent")
+         (let ((parent (second (stack)))
+               (id (car (inspect-select-stack *current-inspect*))))
+           (multiple-value-bind (position parts)
+               (find-part-id parent id)
+             (let ((new-position (if (string= ">" option)
+                                     (1+ position)
+                                     (1- position))))
+               (if (< -1 new-position (parts-count parts))
+                   (let* ((value (component-at parts new-position)))
+                     (setf (car (inspect-object-stack *current-inspect*))
+                           value)
+                     (setf (car (inspect-select-stack *current-inspect*))
+                           (id-at parts new-position))
+                     (redisplay stream))
+                   (output-inspect-note stream
+                                        "Parent has no selectable component indexed by ~d"
+                                        new-position))))))
+      (no-object-msg stream)))
+
+(defun istep-cmd-set-raw (option-string stream)
+  (when (inspect-object-stack *current-inspect*)
+    (cond
+      ((null option-string)
+       (setq *inspect-raw* t))
+      ((eq (read-from-string option-string) t)
+       (setq *inspect-raw* t))
+      ((eq (read-from-string option-string) nil)
+       (setq *inspect-raw* nil)))
+    (redisplay stream)))
+
+(defun istep-cmd-reset ()
+  (reset-stack)
+  (throw 'repl-catcher (values :inspect nil)))
+
+(defun istep-cmd-help (stream)
+  (format stream *inspect-help*))
+
+(defun istep-cmd-skip (option-string stream)
+  (if option-string
+      (let ((len (read-from-string option-string)))
+       (if (and (integerp len) (>= len 0))
+           (redisplay stream len)
+           (output-inspect-note stream "Skip length invalid")))
+      (output-inspect-note stream "Skip length missing")))
+
+(defun istep-cmd-print (option-string stream)
+  (if option-string
+      (let ((len (read-from-string option-string)))
+       (if (and (integerp len) (plusp len))
+           (setq *inspect-length* len)
+           (output-inspect-note stream "Cannot set print limit to ~A~%" len)))
+      (output-inspect-note stream "Print length missing")))
+
+(defun select-description (select)
+  (typecase select
+    (integer
+     (format nil "which is componenent number ~d of" select))
+    (symbol
+     (format nil "which is the ~a component of" select))
+    (string
+     (format nil "which was selected by ~A" select))
+    (t
+     (write-to-string select))))
+
+(defun istep-cmd-tree (stream)
+  (let ((stack (inspect-object-stack *current-inspect*)))
+    (if stack
+       (progn
+         (output-inspect-note stream "The current object is:")
+         (dotimes (i (length stack))
+           (output-inspect-note
               stream "~A, ~A"
               (inspected-description (nth i stack))
               (select-description
                (nth i (inspect-select-stack *current-inspect*))))))
-         (no-object-msg stream))))
-
-  (defun istep-cmd-set (id-string value-string stream)
-    (if (stack)
-       (let ((id (when id-string (read-from-string id-string))))
-         (multiple-value-bind (position parts)
-             (find-part-id (car (stack)) id)
-           (if parts
-               (if position
-                   (when value-string
-                     (let ((new-value (eval (read-from-string value-string))))
-                       (let ((result (set-component-value (car (stack))
-                                                          id
-                                                          new-value
-                                                          (component-at
-                                                           parts position))))
-                         (typecase result
-                           (string
-                            (output-inspect-note stream result))
-                           (t
-                            (redisplay stream))))))
-                   (output-inspect-note
-                    stream
-                    "Object has no selectable component named by ~A" id))
-               (output-inspect-note stream
-                                    "Object has no selectable components"))))
-       (no-object-msg stream)))
-
-  (defun istep-cmd-select-component (id stream)
-    (if (stack)
+       (no-object-msg stream))))
+
+(defun istep-cmd-set (id-string value-string stream)
+  (if (stack)
+      (let ((id (when id-string (read-from-string id-string))))
        (multiple-value-bind (position parts)
            (find-part-id (car (stack)) id)
-         (cond
-           ((integerp position)
-            (let* ((value (component-at parts position)))
-              (cond ((eq value *inspect-unbound-object-marker*)
-                     (output-inspect-note stream "That slot is unbound"))
-                    (t
-                     (push value (inspect-object-stack *current-inspect*))
-                     (push id (inspect-select-stack *current-inspect*))
-                     (redisplay stream)))))
-           ((null parts)
-            (output-inspect-note stream "Object does not contain any subobjects"))
-           (t
-            (typecase id
-              (symbol
-               (output-inspect-note
-                stream "Object has no selectable component named ~A"
-                id))
-              (integer
-               (output-inspect-note
-                stream "Object has no selectable component indexed by ~d"
-                id)
-               (output-inspect-note
-                stream "Enter a valid index (~:[0-~W~;0~])"
-                (= (parts-count parts) 1)
-                (1- (parts-count parts))))))))
-       (no-object-msg stream)))
-
-  (defun istep-cmd-set-stack (form stream)
-    (reset-stack)
-    (let ((object (eval form)))
-      (setf (inspect-object-stack *current-inspect*) (list object))
-      (setf (inspect-select-stack *current-inspect*)
-           (list (format nil ":i ..."))))
-    (set-break-inspect *current-inspect*)
-    (redisplay stream))
-
-  ;;;
-  ;;; aclrepl-specific inspection display
-  ;;;
-
-  (defun no-object-msg (s)
-    (output-inspect-note s "No object is being inspected"))
-  
-  (defun display-current (s)
-    (if (stack)
-       (let ((inspected (car (stack))))
-         (setq cl:* inspected)
-         (display-inspect inspected s *inspect-length* *inspect-skip*))
-       (no-object-msg)))
-  
-  ) ;; end binding for multithreading
+         (if parts
+             (if position
+                 (when value-string
+                   (let ((new-value (eval (read-from-string value-string))))
+                     (let ((result (set-component-value (car (stack))
+                                                        id
+                                                        new-value
+                                                        (component-at
+                                                         parts position))))
+                       (typecase result
+                         (string
+                          (output-inspect-note stream result))
+                         (t
+                          (redisplay stream))))))
+                 (output-inspect-note
+                  stream
+                  "Object has no selectable component named by ~A" id))
+             (output-inspect-note stream
+                                  "Object has no selectable components"))))
+      (no-object-msg stream)))
+
+(defun istep-cmd-select-component (id stream)
+  (if (stack)
+      (multiple-value-bind (position parts)
+         (find-part-id (car (stack)) id)
+       (cond
+         ((integerp position)
+          (let* ((value (component-at parts position)))
+            (cond ((eq value *inspect-unbound-object-marker*)
+                   (output-inspect-note stream "That slot is unbound"))
+                  (t
+                   (push value (inspect-object-stack *current-inspect*))
+                   (push id (inspect-select-stack *current-inspect*))
+                   (redisplay stream)))))
+         ((null parts)
+          (output-inspect-note stream "Object does not contain any subobjects"))
+         (t
+          (typecase id
+            (symbol
+             (output-inspect-note
+              stream "Object has no selectable component named ~A"
+              id))
+            (integer
+             (output-inspect-note
+              stream "Object has no selectable component indexed by ~d"
+              id))))))
+      (no-object-msg stream)))
+
+(defun istep-cmd-set-stack (form stream)
+  (reset-stack (eval form) ":i ...")
+  (redisplay stream))
+
 
+(defun no-object-msg (s)
+  (output-inspect-note s "No object is being inspected"))
+
+(defun display-current (s length skip)
+  (if (stack)
+      (let ((inspected (car (stack))))
+       (setq cl:* inspected)
+       (display-inspect inspected s length skip))
+      (no-object-msg s)))
+
+
+;;;
+;;; aclrepl-specific inspection display
+;;;
 
 (defun display-inspect (object stream &optional length (skip 0))
   (multiple-value-bind (elements labels count)
@@ -338,17 +325,31 @@ i set <name> <form>  set named component to evalated form
     (fresh-line stream)
     (format stream "~A" (inspected-description object))
     (unless (or *skip-address-display*
+               (eq object *inspect-unbound-object-marker*)
                (characterp object) (typep object 'fixnum))
-      (format stream " at #x~X" (sb-kernel:get-lisp-obj-address object)))
+      (write-string " at #x" stream)
+      (format stream (n-word-bits-hex-format)
+             (logand (sb-kernel:get-lisp-obj-address object)
+                     (lognot sb-vm:lowtag-mask))))
     (dotimes (i count)
       (fresh-line stream)
       (display-labeled-element (elt elements i) (elt labels i) stream))))
   
 (defun array-label-p (label)
-  (and (stringp (cdr label)) (char= (char (cdr label) 0) #\[)))
+  (and (consp label)
+       (stringp (cdr label))
+       (char= (char (cdr label) 0) #\[)))
 
 (defun named-or-array-label-p (label)
-  (consp label))
+  (and (consp label) (not (hex-label-p label))))
+
+(defun hex-label-p (label &optional width)
+  (and (consp label)
+       (case width
+            (32 (eq (cdr label) :hex32))
+            (64 (eq (cdr label) :hex64))
+            (t (or (eq (cdr label) :hex32)
+                   (eq (cdr label) :hex64))))))
 
 (defun display-labeled-element (element label stream)
   (cond
@@ -364,6 +365,10 @@ i set <name> <form>  set named component to evalated form
             (car label)
             (format nil "~A " (cdr label))
             (inspected-description element)))
+    ((hex-label-p label 32)
+     (format stream "~4,' D-> #x~8,'0X" (car label) element))
+    ((hex-label-p label 64)
+     (format stream "~4,' D-> #x~16,'0X" (car label) element))
     (t
      (format stream "~4,' D-> ~A" label (inspected-description element)))))
 
@@ -398,15 +403,19 @@ POSITION is NIL if the id is invalid or not found."
   (let* ((parts (inspected-parts object))
         (name (if (symbolp id) (symbol-name id) id)))
     (values
-     (if (numberp id)
-        (when (< -1 id (parts-count parts)) id)
-        (case (parts-seq-type parts)
-          (:named
-           (position name (the list (parts-components parts))
-                     :key #'car :test #'string-equal))
-          ((:dotted-list :cyclic-list)
-           (when (string-equal name "tail")
-             (1- (parts-count parts))))))
+     (cond
+       ((and (numberp id)
+            (< -1 id (parts-count parts))
+            (not (eq (parts-seq-type parts) :bignum)))
+       id)
+       (t
+       (case (parts-seq-type parts)
+         (:named
+          (position name (the list (parts-components parts))
+                    :key #'car :test #'string-equal))
+         ((:dotted-list :cyclic-list)
+          (when (string-equal name "tail")
+            (1- (parts-count parts)))))))
      parts)))
 
 (defun component-at (parts position)
@@ -426,6 +435,8 @@ POSITION is NIL if the id is invalid or not found."
         (cdr (elt components position)))
        (:array
         (aref (the array components) position))
+       (:bignum
+        (bignum-component-at components position))
        (t
         (elt components position))))))
 
@@ -448,7 +459,7 @@ POSITION is NIL if the id is invalid or not found."
   "Returns elements of an object that have been trimmed and labeled based on
 length and skip. Returns (VALUES ELEMENTS LABELS ELEMENT-COUNT)
 where ELEMENTS and LABELS are vectors containing ELEMENT-COUNT items.
-LABELS may be a string, number, cons pair, :tail, or :ellipses.
+LABELS elements may be a string, number, cons pair, :tail, or :ellipses.
 This function may return an ELEMENT-COUNT of up to (+ 3 length) which would
 include an :ellipses at the beginning, :ellipses at the end,
 and the last element."
@@ -513,9 +524,15 @@ and the last element."
   "Helper function for inspected-elements. Conses the
 position with the label if the label is a string."
   (let ((id (id-at parts position)))
-    (if (stringp id)
-       (cons position id)
-       id)))
+    (cond
+      ((stringp id)
+       (cons position id))
+      ((eq (parts-seq-type parts) :bignum)
+       (cons position (case sb-vm::n-word-bits 
+                           (32 :hex32)
+                           (64 :hex64))))
+      (t
+       id))))
 
 (defun array-index-string (index parts)
   "Formats an array index in row major format."
@@ -590,7 +607,7 @@ position with the label if the label is a string."
 cons cells and LIST-TYPE is :normal, :dotted, or :cyclic"
     (do ((length 1 (1+ length))
         (lst (cdr object) (cdr lst)))
-       ((or (not(consp lst))
+       ((or (not (consp lst))
             (eq object lst))
         (cond
           ((null lst)
@@ -606,22 +623,50 @@ cons cells and LIST-TYPE is :normal, :dotted, or :cyclic"
   (multiple-value-bind (length list-type) (cons-safe-length object)
     (format nil "a ~A list with ~D element~:*~P~A"
            (string-downcase (symbol-name list-type)) length
-           (case list-type
+           (ecase list-type
              ((:dotted :cyclic) "+tail")
-             (t "")))))
-
+             (:normal "")))))
+
+(defun n-word-bits-hex-format ()
+  (case sb-vm::n-word-bits
+    (64 "~16,'0X")
+    (32 "~8,'0X")
+    (t  "~X")))
+
+(defun ref32-hexstr (obj &optional (offset 0))
+  (format nil "~8,'0X" (ref32 obj offset)))
+
+(defun ref32 (obj &optional (offset 0))
+  (sb-sys::without-gcing
+   (sb-sys:sap-ref-32
+    (sb-sys:int-sap
+     (logand (sb-kernel:get-lisp-obj-address obj) (lognot sb-vm:lowtag-mask)))
+    offset)))
+
+(defun description-maybe-internals (fmt objects internal-fmt &rest args)
+  (let ((base (apply #'format nil fmt objects)))
+    (if *skip-address-display*
+       base
+       (concatenate 'string
+                    base " " (apply #'format nil internal-fmt args)))))
+             
 (defmethod inspected-description ((object double-float))
-  (format nil "double-float ~W" object))
+  (let ((start (round (* 2 sb-vm::n-word-bits) 8)))
+    (description-maybe-internals "double-float ~W" (list object)
+                                "[#~A ~A]"
+                                (ref32-hexstr object (+ start 4))
+                                (ref32-hexstr object start))))
 
 (defmethod inspected-description ((object single-float))
-  (format nil "single-float ~W" object))
+  (description-maybe-internals "single-float ~W" (list object)
+                              "[#x~A]"
+                              (ref32-hexstr object (round sb-vm::n-word-bits 8))))
 
 (defmethod inspected-description ((object fixnum))
-  (format nil "fixnum ~W~A" object
-         (if *skip-address-display*
-             ""
-             (format nil " [#x~8,'0X]" object
-                     (sb-kernel:get-lisp-obj-address object)))))
+  (description-maybe-internals
+   "fixnum ~W" (list object)
+   (concatenate 'string "[#x" (n-word-bits-hex-format) "]")
+   (ash object (1- sb-vm:n-lowtag-bits))))
 
 (defmethod inspected-description ((object complex))
   (format nil "complex number ~W" object))
@@ -629,18 +674,38 @@ cons cells and LIST-TYPE is :normal, :dotted, or :cyclic"
 (defmethod inspected-description ((object simple-string))
   (format nil "a simple-string (~W) ~W" (length object) object))
 
+(defun bignum-words (bignum)
+  "Return the number of words in a bignum"
+  (ash
+   (logand (ref32 bignum) (lognot sb-vm:widetag-mask))
+   (- sb-vm:n-widetag-bits))) 
+
+(defun bignum-component-at (bignum offset)
+  "Return the word at offset"
+  (case sb-vm::n-word-bits
+       (32
+        (ref32 bignum (* 4 (1+ offset))))
+       (64
+        (let ((start (* 8 (1+ offset))))
+          (+ (ref32 bignum start)
+             (ash (ref32 bignum (+ 4 start)) 32))))))
+
 (defmethod inspected-description ((object bignum))
-  (format nil "bignum ~W" object))
+  (format nil  "bignum ~W with ~D ~A-bit word~P" object
+         (bignum-words object) sb-vm::n-word-bits (bignum-words object)))
 
 (defmethod inspected-description ((object ratio))
   (format nil "ratio ~W" object))
 
 (defmethod inspected-description ((object character))
-  (format nil "character ~W char-code~A" object (char-code object)
-         (if *skip-address-display*
-             ""
-             (format nil " [#x~8,'0X]" object
-                     (sb-kernel:get-lisp-obj-address object)))))
+  ;; FIXME: This will need to change as and when we get more characters
+  ;; than just the 256 we have today.
+  (description-maybe-internals
+   "character ~W char-code #x~2,'0X"
+   (list object (char-code object))
+   "[#x~8,'0X]"
+   (logior sb-vm:character-widetag (ash (char-code object)
+                                       sb-vm:n-widetag-bits))))
 
 (defmethod inspected-description ((object t))
   (format nil "a generic object ~W" object))
@@ -670,6 +735,8 @@ cons cells and LIST-TYPE is :normal, :dotted, or :cyclic"
 ;;;      If SEQ-TYPE is :vector, then each element is a value of an vector
 ;;;      If SEQ-TYPE is :array, then each element is a value of an array
 ;;;        with rank >= 2. The 
+;;;      If SEQ-TYPE is :bignum, then object is just a bignum and not a
+;;;        a sequence 
 ;;;
 ;;;   COUNT is the total number of components in the OBJECT
 ;;;
@@ -713,7 +780,7 @@ cons cells and LIST-TYPE is :normal, :dotted, or :cyclic"
        (info (sb-kernel:layout-info (sb-kernel:layout-of object))))
     (when (sb-kernel::defstruct-description-p info)
       (dolist (dd-slot (sb-kernel:dd-slots info) (nreverse components-list))
-       (push (cons (sb-kernel:dsd-%name dd-slot)
+       (push (cons (string (sb-kernel:dsd-name dd-slot))
                    (funcall (sb-kernel:dsd-accessor-name dd-slot) object))
              components-list)))))
 
@@ -724,7 +791,7 @@ cons cells and LIST-TYPE is :normal, :dotted, or :cyclic"
 (defun inspected-standard-object-parts (object)
   (let ((components nil)
        (class-slots (sb-pcl::class-slots (class-of object))))
-    (dolist (class-slot class-slots components)
+    (dolist (class-slot class-slots (nreverse components))
       (let* ((slot-name (slot-value class-slot 'sb-pcl::name))
             (slot-value (if (slot-boundp object slot-name)
                             (slot-value object slot-name)
@@ -737,7 +804,11 @@ cons cells and LIST-TYPE is :normal, :dotted, or :cyclic"
     (list components (length components) :named nil)))
 
 (defmethod inspected-parts ((object sb-kernel:funcallable-instance))
-  (let ((components (inspected-structure-parts object)))
+  (let ((components (inspected-standard-object-parts object)))
+    (list components (length components) :named nil)))
+
+(defmethod inspected-parts ((object condition))
+  (let ((components (inspected-standard-object-parts object)))
     (list components (length components) :named nil)))
 
 (defmethod inspected-parts ((object function))
@@ -790,6 +861,9 @@ cons cells and LIST-TYPE is :normal, :dotted, or :cyclic"
                        (cons "denominator" (denominator object)))))
     (list components (length components) :named nil)))
 
+(defmethod inspected-parts ((object bignum))
+    (list object (bignum-words object) :bignum nil))
+
 (defmethod inspected-parts ((object t))
   (list nil 0 nil nil))