0.9.18.24:
[sbcl.git] / contrib / sb-introspect / sb-introspect.lisp
index d0bcbac..777ab6d 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))
@@ -284,8 +292,8 @@ If an unsupported TYPE is requested, the function will return NIL.
               (sb-kernel::layout-source-location layout)))))))
     (method-combination
      (car
-      (find-definition-sources-by-name (sb-pcl::method-combination-type object)
-                                       :method-combination)))
+      (find-definition-sources-by-name
+       (sb-pcl::method-combination-type-name object) :method-combination)))
     (package
      (translate-source-location (sb-impl::package-source-location object)))
     (class
@@ -310,6 +318,11 @@ If an unsupported TYPE is requested, the function will return NIL.
                        (sb-pcl::unparse-specializers
                         (sb-mop:method-specializers object)))))
        source))
+    #+sb-eval
+    (sb-eval:interpreted-function
+     (let ((source (translate-source-location
+                    (sb-eval:interpreted-function-source-location object))))
+       source))
     (function
      (cond ((struct-accessor-p object)
             (find-definition-source
@@ -380,14 +393,19 @@ If an unsupported TYPE is requested, the function will return NIL.
 
 ;;; FIXME: maybe this should be renamed as FUNCTION-LAMBDA-LIST?
 (defun function-arglist (function)
-  "Describe the lambda list for the function designator FUNCTION.
-Works for special-operators, macros, simple functions and generic
-functions.  Signals error if not found"
+  "Describe the lambda list for the extended function designator FUNCTION.
+Works for special-operators, macros, simple functions,
+interpreted functions, and generic functions.  Signals error if
+not found"
   (cond ((valid-function-name-p function)
-         (function-arglist
-          (or (macro-function function) (fdefinition function))))
+         (function-arglist (or (and (symbolp function)
+                                    (macro-function function))
+                               (fdefinition function))))
         ((typep function 'generic-function)
          (sb-pcl::generic-function-pretty-arglist function))
+        #+sb-eval
+        ((typep function 'sb-eval:interpreted-function)
+         (sb-eval:interpreted-function-lambda-list function))
         (t (sb-impl::%simple-fun-arglist
             (sb-impl::%closure-fun function)))))