0.9.15.23: finding defintions of profiled functions
authorNikodemus Siivola <nikodemus@random-state.net>
Thu, 10 Aug 2006 11:17:27 +0000 (11:17 +0000)
committerNikodemus Siivola <nikodemus@random-state.net>
Thu, 10 Aug 2006 11:17:27 +0000 (11:17 +0000)
 * Patch by Troels Henriksen.
 * Test-case missing from 0.9.15.22.

NEWS
contrib/sb-introspect/sb-introspect.lisp
contrib/sb-introspect/test-driver.lisp
tests/print.impure.lisp
version.lisp-expr

diff --git a/NEWS b/NEWS
index 06c3a5c..4fca016 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,8 @@ changes in sbcl-0.9.16 relative to sbcl-0.9.15:
     (thanks to Lutz Euler)
   * optimization: hashing of general arrays and vectors has been
     improved. (reported by Any Fingerhut)
+  * enhancement: SB-INTROSPECT is now able to find definitions of
+    profiled functions. (thanks to Troels Henriksen)
   * fixed bug #337: use of MAKE-METHOD in method combination now works
     even in the presence of user-defined method classes.  (reported by
     Bruno Haible and Pascal Costanza)
index a5ff21f..debda19 100644 (file)
@@ -143,7 +143,14 @@ If an unsupported TYPE is requested, the function will return NIL.
                (list x)))
          (get-class (name)
            (and (symbolp name)
-                (find-class name nil))))
+                (find-class name nil)))
+         (real-fdefinition (name)
+           ;; for getting the real function object, even if the
+           ;; function is being profiled
+           (let ((profile-info (gethash name sb-profile::*profiled-fun-name->info*)))
+             (if profile-info
+                 (sb-profile::profile-info-encapsulated-fun profile-info)
+                 (fdefinition name)))))
     (listify
      (case type
        ((:variable)
@@ -169,7 +176,7 @@ If an unsupported TYPE is requested, the function will return NIL.
         (when (and (fboundp name)
                    (or (not (symbolp name))
                        (not (macro-function name))))
-          (let ((fun (fdefinition name)))
+          (let ((fun (real-fdefinition name)))
             (when (eq (not (typep fun 'generic-function))
                       (not (eq type :generic-function)))
               (find-definition-source fun)))))
@@ -178,12 +185,13 @@ If an unsupported TYPE is requested, the function will return NIL.
           (when expander-fun
             (find-definition-source expander-fun))))
        ((:method)
-        (when (and (fboundp name)
-                   (typep (fdefinition name) 'generic-function))
-          (loop for method in (sb-mop::generic-function-methods
-                               (fdefinition name))
+        (when (fboundp name)
+          (let ((fun (real-fdefinition name)))
+           (when (typep fun 'generic-function)
+             (loop for method in (sb-mop::generic-function-methods
+                                  fun)
                 for source = (find-definition-source method)
-                when source collect source)))
+                when source collect source)))))
        ((:setf-expander)
         (when (and (consp name)
                    (eq (car name) 'setf))
index f647fab..6abd985 100644 (file)
@@ -68,6 +68,9 @@
 (assert (matchp-name :method-combination 'cl-user::r 26))
 (assert (matchp-name :setf-expander 'cl-user::s 27))
 
+(sb-profile:profile cl-user::one)
+(assert (matchp-name :function 'cl-user::one 2))
+(sb-profile:unprofile cl-user::one)
 
 ;;; Unix success convention for exit codes
 (sb-ext:quit :unix-status 0)
index 6a18d72..6d8072f 100644 (file)
 
 (assert (string= (eval '(format nil "~:C" #\a)) "a"))
 (assert (string= (format nil (formatter "~:C") #\a) "a"))
+
+;;; This used to trigger an AVER instead.
+(assert (raises-error? (format t "~>") sb-format:format-error))
+
 ;;; success
index 6640afe..75973b1 100644 (file)
@@ -17,4 +17,4 @@
 ;;; checkins which aren't released. (And occasionally for internal
 ;;; versions, especially for internal versions off the main CVS
 ;;; branch, it gets hairier, e.g. "0.pre7.14.flaky4.13".)
-"0.9.15.22"
+"0.9.15.23"