Add 2012 to FSF copyright years for Emacs files
[bpt/emacs.git] / lisp / emacs-lisp / elp.el
index a39b154..0839032 100644 (file)
@@ -1,7 +1,7 @@
 ;;; elp.el --- Emacs Lisp Profiler
 
-;; Copyright (C) 1994, 1995, 1997, 1998, 2001, 2002, 2003, 2004,
-;;   2005, 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 1994-1995, 1997-1998, 2001-2012
+;;   Free Software Foundation, Inc.
 
 ;; Author: Barry A. Warsaw
 ;; Maintainer: FSF
 
 ;; This file is part of GNU Emacs.
 
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
 ;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
 
 ;; GNU Emacs is distributed in the hope that it will be useful,
 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -21,9 +21,7 @@
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.
 
 ;;; Commentary:
 ;;
   :group 'lisp)
 
 (defcustom elp-function-list nil
-  "*List of functions to profile.
+  "List of functions to profile.
 Used by the command `elp-instrument-list'."
   :type '(repeat function)
   :group 'elp)
 
 (defcustom elp-reset-after-results t
-  "*Non-nil means reset all profiling info after results are displayed.
+  "Non-nil means reset all profiling info after results are displayed.
 Results are displayed with the `elp-results' command."
   :type 'boolean
   :group 'elp)
 
 (defcustom elp-sort-by-function 'elp-sort-by-total-time
-  "*Non-nil specifies ELP results sorting function.
+  "Non-nil specifies ELP results sorting function.
 These functions are currently available:
 
   elp-sort-by-call-count   -- sort by the highest call count
@@ -164,7 +162,7 @@ the symbol's name string."
   :group 'elp)
 
 (defcustom elp-report-limit 1
-  "*Prevent some functions from being displayed in the results buffer.
+  "Prevent some functions from being displayed in the results buffer.
 If a number, no function that has been called fewer than that number
 of times will be displayed in the output buffer.  If nil, all
 functions will be displayed."
@@ -173,12 +171,12 @@ functions will be displayed."
   :group 'elp)
 
 (defcustom elp-use-standard-output nil
-  "*If non-nil, output to `standard-output' instead of a buffer."
+  "If non-nil, output to `standard-output' instead of a buffer."
   :type 'boolean
   :group 'elp)
 
 (defcustom elp-recycle-buffers-p t
-  "*If nil, don't recycle the `elp-results-buffer'.
+  "If nil, don't recycle the `elp-results-buffer'.
 In other words, a new unique buffer is create every time you run
 \\[elp-results]."
   :type 'boolean
@@ -212,7 +210,10 @@ This variable is set by the master function.")
     ;; (delq nil (mapcar (lambda (x) (and (symbolp x) (fboundp x) x))
     ;;                   (aref (symbol-function 'elp-wrapper) 2)))
     ;; to help me find this list.
-    error call-interactively apply current-time)
+    error call-interactively apply current-time
+    ;; Andreas Politz reports problems profiling these (Bug#4233):
+    + byte-code-function-p functionp byte-code subrp
+    indirect-function fboundp)
   "List of functions that cannot be profiled.
 Those functions are used internally by the profiling code and profiling
 them would thus lead to infinite recursion.")
@@ -268,7 +269,7 @@ FUNSYM must be a symbol of a defined function."
     (setq newguts (append newguts `((elp-wrapper
                                     (quote ,funsym)
                                     ,(when (commandp funsym)
-                                       '(called-interactively-p))
+                                       '(called-interactively-p 'any))
                                     args))))
     ;; to record profiling times, we set the symbol's function
     ;; definition so that it runs the elp-wrapper function with the
@@ -281,7 +282,7 @@ FUNSYM must be a symbol of a defined function."
     ;; the function so that non-local exists are still recorded. TBD:
     ;; I haven't tested non-local exits at all, so no guarantees.
     ;;
-    ;; The 1st element is the total amount of time in usecs that have
+    ;; The 1st element is the total amount of time in seconds that has
     ;; been spent inside this function.  This number is added to on
     ;; function exit.
     ;;
@@ -342,9 +343,12 @@ Argument FUNSYM is the symbol of a defined function."
 
 ;;;###autoload
 (defun elp-instrument-list (&optional list)
-  "Instrument for profiling, all functions in `elp-function-list'.
-Use optional LIST if provided instead."
+  "Instrument, for profiling, all functions in `elp-function-list'.
+Use optional LIST if provided instead.
+If called interactively, read LIST using the minibuffer."
   (interactive "PList of functions to instrument: ")
+  (unless (listp list)
+    (signal 'wrong-type-argument (list 'listp list)))
   (let ((list (or list elp-function-list)))
     (mapcar 'elp-instrument-function list)))
 
@@ -420,9 +424,7 @@ Use optional LIST if provided instead."
 
 \f
 (defsubst elp-elapsed-time (start end)
-  (+ (* (- (car end) (car start)) 65536.0)
-     (- (car (cdr end)) (car (cdr start)))
-     (/ (- (car (cdr (cdr end))) (car (cdr (cdr start)))) 1000000.0)))
+  (float-time (time-subtract end start)))
 
 (defun elp-wrapper (funsym interactive-p args)
   "This function has been instrumented for profiling by the ELP.
@@ -536,6 +538,7 @@ original definition, use \\[elp-restore-function] or \\[elp-restore-all]."
 (defvar elp-results-symname-map
   (let ((map (make-sparse-keymap)))
     (define-key map [mouse-2] 'elp-results-jump-to-definition)
+    (define-key map [follow-link] 'mouse-face)
     (define-key map "\C-m" 'elp-results-jump-to-definition)
     map)
   "Keymap used on the function name column." )
@@ -552,6 +555,7 @@ original definition, use \\[elp-restore-function] or \\[elp-restore-all]."
                      'elp-symname (intern symname)
                      'keymap elp-results-symname-map
                      'mouse-face 'highlight
+                     'face 'link
                      'help-echo "mouse-2 or RET jumps to definition")))
 
 ;;;###autoload
@@ -624,7 +628,7 @@ displayed."
                                    'display (list 'space :align-to column)
                                    'face 'fixed-pitch)
                        title)
-                    (setq column (+ column 1
+                    (setq column (+ column 2
                                     (if (= column 0)
                                         elp-field-len
                                       (length title))))))
@@ -654,5 +658,4 @@ displayed."
 \f
 (provide 'elp)
 
-;; arch-tag: c4eef311-9b3e-4bb2-8a54-3485d41b4eb1
 ;;; elp.el ends here