annotate lisp/find-gc.el @ 983:eb19dfaec9c4

* window.c (window_loop): This used to keep track of the first window processed and wait until we came back around to it. Sadly, this doesn't work if that window gets deleted. So instead, use Fprevious_window to find the last window to process, and loop until we've done that one. * window.c [not MULTI_FRAME] (init_window_once): Don't forget to set the `mini_p' flag on the new minibuffer window to t. * window.c (Fwindow_at): Don't check the type of the frame argument. * window.c [not MULTI_FRAME] (window_loop): Set frame to zero, instead of trying to decode it. * window.c (init_window_once): Initialize minibuf_window before FRAME_ROOT_WINDOW, so the latter actually points to something.
author Jim Blandy <jimb@redhat.com>
date Fri, 14 Aug 1992 02:27:26 +0000
parents 213978acbc1e
children 6314334d7c2b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
1 ;;; find-gc.el --- detect functions that call the garbage collector
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
2
845
213978acbc1e entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 807
diff changeset
3 ;; Copyright (C) 1992 Free Software Foundation, Inc.
213978acbc1e entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 807
diff changeset
4
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
5 ;; Maintainer: FSF
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
6
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
7 ;; This file is part of GNU Emacs.
123
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
8
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
9 ;; GNU Emacs is free software; you can redistribute it and/or modify
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
10 ;; it under the terms of the GNU General Public License as published by
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
11 ;; the Free Software Foundation; either version 2, or (at your option)
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
12 ;; any later version.
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
13
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
14 ;; GNU Emacs is distributed in the hope that it will be useful,
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
17 ;; GNU General Public License for more details.
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
18
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
19 ;; You should have received a copy of the GNU General Public License
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
20 ;; along with GNU Emacs; see the file COPYING. If not, write to
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
21 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
123
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
23 ;; Code:
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
24
123
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
25 ;;; Produce in unsafe-list the set of all functions that may invoke GC.
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26 ;;; This expects the Emacs sources to live in emacs-source-directory.
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
27 ;;; It creates a temporary working directory /tmp/esrc.
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
28
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
29 (defun find-gc-unsafe ()
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
30 (trace-call-tree nil)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31 (trace-use-tree)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32 (find-unsafe-funcs 'Fgarbage_collect)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
33 (setq unsafe-list (sort unsafe-list
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
34 (function (lambda (x y)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
35 (string-lessp (car x) (car y))))))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
36 )
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
37
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38 (setq emacs-source-directory "/usr/gnu/src/dist/src")
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
39
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
40
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41 ;;; This does a depth-first search to find all functions that can
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42 ;;; ultimately call the function "target". The result is an a-list
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
43 ;;; in unsafe-list; the cars are the unsafe functions, and the cdrs
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
44 ;;; are (one of) the unsafe functions that these functions directly
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
45 ;;; call.
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
46
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
47 (defun find-unsafe-funcs (target)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
48 (setq unsafe-list (list (list target)))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
49 (trace-unsafe target)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
50 )
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
51
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
52 (defun trace-unsafe (func)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
53 (let ((used (assq func subrs-used)))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
54 (or used
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
55 (error "No subrs-used for %s" (car unsafe-list)))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
56 (while (setq used (cdr used))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
57 (or (assq (car used) unsafe-list)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
58 (memq (car used) noreturn-list)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
59 (progn
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
60 (setq unsafe-list (cons (cons (car used) func) unsafe-list))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
61 (trace-unsafe (car used))))))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
62 )
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
63
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
64
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
65 ;;; Functions on this list are safe, even if they appear to be able
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
66 ;;; to call the target.
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
67
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
68 (setq noreturn-list '( Fsignal Fthrow wrong_type_argument ))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
70
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
71 ;;; This produces an a-list of functions in subrs-called. The cdr of
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
72 ;;; each entry is a list of functions which the function in car calls.
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
73
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
74 (defun trace-call-tree (&optional already-setup)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
75 (message "Setting up directories...")
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76 (or already-setup
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 (progn
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
78 ;; Gee, wouldn't a built-in "system" function be handy here.
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
79 (call-process "csh" nil nil nil "-c" "rm -rf /tmp/esrc")
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
80 (call-process "csh" nil nil nil "-c" "mkdir /tmp/esrc")
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
81 (call-process "csh" nil nil nil "-c"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
82 (format "ln -s %s/*.[ch] /tmp/esrc"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
83 emacs-source-directory))))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84 (save-excursion
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
85 (set-buffer (get-buffer-create "*Trace Call Tree*"))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
86 (setq subrs-called nil)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
87 (let ((case-fold-search nil)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
88 (files source-files)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89 name entry)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
90 (while files
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
91 (message "Compiling %s..." (car files))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
92 (call-process "csh" nil nil nil "-c"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
93 (format "gcc -dr -c /tmp/esrc/%s -o /dev/null"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
94 (car files)))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
95 (erase-buffer)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
96 (insert-file-contents (concat "/tmp/esrc/" (car files) ".rtl"))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
97 (while (re-search-forward ";; Function \\|(call_insn " nil t)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
98 (if (= (char-after (- (point) 3)) ?o)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
99 (progn
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
100 (looking-at "[a-zA-Z0-9_]+")
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
101 (setq name (intern (buffer-substring (match-beginning 0)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
102 (match-end 0))))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
103 (message "%s : %s" (car files) name)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
104 (setq entry (list name)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
105 subrs-called (cons entry subrs-called)))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
106 (if (looking-at ".*\n?.*\"\\([A-Za-z0-9_]+\\)\"")
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
107 (progn
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
108 (setq name (intern (buffer-substring (match-beginning 1)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
109 (match-end 1))))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
110 (or (memq name (cdr entry))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
111 (setcdr entry (cons name (cdr entry))))))))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
112 (delete-file (concat "/tmp/esrc/" (car files) ".rtl"))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
113 (setq files (cdr files)))))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
114 )
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
115
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
116
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
117 ;;; This was originally generated directory-files, but there were
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
118 ;;; too many files there that were not actually compiled. The
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
119 ;;; list below was created for a HP-UX 7.0 system.
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
120
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
121 (setq source-files '("dispnew.c" "scroll.c" "xdisp.c" "window.c"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
122 "term.c" "cm.c" "emacs.c" "keyboard.c" "macros.c"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
123 "keymap.c" "sysdep.c" "buffer.c" "filelock.c"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
124 "insdel.c" "marker.c" "minibuf.c" "fileio.c"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125 "dired.c" "filemode.c" "cmds.c" "casefiddle.c"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
126 "indent.c" "search.c" "regex.c" "undo.c"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
127 "alloc.c" "data.c" "doc.c" "editfns.c"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
128 "callint.c" "eval.c" "fns.c" "print.c" "lread.c"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
129 "abbrev.c" "syntax.c" "unexec.c" "mocklisp.c"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
130 "bytecode.c" "process.c" "callproc.c" "doprnt.c"
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
131 "x11term.c" "x11fns.c"))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
132
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
133
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
134 ;;; This produces an inverted a-list in subrs-used. The cdr of each
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
135 ;;; entry is a list of functions that call the function in car.
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
136
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137 (defun trace-use-tree ()
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
138 (setq subrs-used (mapcar 'list (mapcar 'car subrs-called)))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
139 (let ((ptr subrs-called)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140 p2 found)
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
141 (while ptr
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
142 (setq p2 (car ptr))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
143 (while (setq p2 (cdr p2))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
144 (if (setq found (assq (car p2) subrs-used))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
145 (setcdr found (cons (car (car ptr)) (cdr found)))))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
146 (setq ptr (cdr ptr))))
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
147 )
1af8a4d8f39f Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
148
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 123
diff changeset
149 ;;; find-gc.el ends here