Mercurial > emacs
annotate lisp/emacs-lisp/bytecomp.el @ 38136:278f2295cde6
New node Program Misc; text about word and paragraph and selective
display features moved there.
Major rewrite of Programming Modes node.
Mention font lock and compilation commands in initial list of
capabilities.
Rewrite explanation of C-M- convention.
In Basic Indent, add intro text.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Wed, 20 Jun 2001 10:57:04 +0000 |
parents | 3d650ae7e609 |
children | 253f761ad37b |
rev | line source |
---|---|
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
1 ;;; bytecomp.el --- compilation of Lisp code into byte code. |
757 | 2 |
27824 | 3 ;; Copyright (C) 1985, 1986, 1987, 1992, 1994, 1998, 2000 |
4 ;; Free Software Foundation, Inc. | |
846
20674ae6bf52
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
819
diff
changeset
|
5 |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
6 ;; Author: Jamie Zawinski <jwz@lucid.com> |
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
7 ;; Hallvard Furuseth <hbf@ulrik.uio.no> |
20818
732ffd28a863
(byte-compile-from-buffer): Bind edebug-all-defs and edebug-all-forms to nil.
Richard M. Stallman <rms@gnu.org>
parents:
20779
diff
changeset
|
8 ;; Maintainer: FSF |
20779 | 9 ;; Keywords: lisp |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
10 |
28402 | 11 ;;; This version incorporates changes up to version 2.10 of the |
958 | 12 ;;; Zawinski-Furuseth compiler. |
37909
3d650ae7e609
(byte-compile-file-form-autoload): Use the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35145
diff
changeset
|
13 (defconst byte-compile-version "$Revision: 2.82 $") |
757 | 14 |
15 ;; This file is part of GNU Emacs. | |
16 | |
17 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
18 ;; it under the terms of the GNU General Public License as published by | |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
19 ;; the Free Software Foundation; either version 2, or (at your option) |
757 | 20 ;; any later version. |
21 | |
22 ;; GNU Emacs is distributed in the hope that it will be useful, | |
23 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
24 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
25 ;; GNU General Public License for more details. | |
26 | |
27 ;; You should have received a copy of the GNU General Public License | |
14169 | 28 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
29 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
30 ;; Boston, MA 02111-1307, USA. | |
757 | 31 |
2307
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2299
diff
changeset
|
32 ;;; Commentary: |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2299
diff
changeset
|
33 |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2299
diff
changeset
|
34 ;; The Emacs Lisp byte compiler. This crunches lisp source into a sort |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
35 ;; of p-code (`lapcode') which takes up less space and can be interpreted |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
36 ;; faster. [`LAP' == `Lisp Assembly Program'.] |
2307
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2299
diff
changeset
|
37 ;; The user entry points are byte-compile-file and byte-recompile-directory. |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2299
diff
changeset
|
38 |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
39 ;;; Code: |
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
40 |
14169 | 41 ;; ======================================================================== |
42 ;; Entry points: | |
43 ;; byte-recompile-directory, byte-compile-file, | |
44 ;; batch-byte-compile, batch-byte-recompile-directory, | |
45 ;; byte-compile, compile-defun, | |
46 ;; display-call-tree | |
47 ;; (byte-compile-buffer and byte-compile-and-load-file were turned off | |
48 ;; because they are not terribly useful and get in the way of completion.) | |
757 | 49 |
14169 | 50 ;; This version of the byte compiler has the following improvements: |
51 ;; + optimization of compiled code: | |
52 ;; - removal of unreachable code; | |
53 ;; - removal of calls to side-effectless functions whose return-value | |
54 ;; is unused; | |
55 ;; - compile-time evaluation of safe constant forms, such as (consp nil) | |
56 ;; and (ash 1 6); | |
57 ;; - open-coding of literal lambdas; | |
58 ;; - peephole optimization of emitted code; | |
59 ;; - trivial functions are left uncompiled for speed. | |
60 ;; + support for inline functions; | |
61 ;; + compile-time evaluation of arbitrary expressions; | |
62 ;; + compile-time warning messages for: | |
63 ;; - functions being redefined with incompatible arglists; | |
64 ;; - functions being redefined as macros, or vice-versa; | |
65 ;; - functions or macros defined multiple times in the same file; | |
66 ;; - functions being called with the incorrect number of arguments; | |
28402 | 67 ;; - functions being called which are not defined globally, in the |
14169 | 68 ;; file, or as autoloads; |
69 ;; - assignment and reference of undeclared free variables; | |
70 ;; - various syntax errors; | |
71 ;; + correct compilation of nested defuns, defmacros, defvars and defsubsts; | |
72 ;; + correct compilation of top-level uses of macros; | |
73 ;; + the ability to generate a histogram of functions called. | |
757 | 74 |
14169 | 75 ;; User customization variables: |
76 ;; | |
77 ;; byte-compile-verbose Whether to report the function currently being | |
78 ;; compiled in the minibuffer; | |
28402 | 79 ;; byte-optimize Whether to do optimizations; this may be |
14169 | 80 ;; t, nil, 'source, or 'byte; |
28402 | 81 ;; byte-optimize-log Whether to report (in excruciating detail) |
14169 | 82 ;; exactly which optimizations have been made. |
83 ;; This may be t, nil, 'source, or 'byte; | |
84 ;; byte-compile-error-on-warn Whether to stop compilation when a warning is | |
85 ;; produced; | |
86 ;; byte-compile-delete-errors Whether the optimizer may delete calls or | |
87 ;; variable references that are side-effect-free | |
88 ;; except that they may return an error. | |
89 ;; byte-compile-generate-call-tree Whether to generate a histogram of | |
28402 | 90 ;; function calls. This can be useful for |
14169 | 91 ;; finding unused functions, as well as simple |
92 ;; performance metering. | |
93 ;; byte-compile-warnings List of warnings to issue, or t. May contain | |
94 ;; 'free-vars (references to variables not in the | |
95 ;; current lexical scope) | |
96 ;; 'unresolved (calls to unknown functions) | |
97 ;; 'callargs (lambda calls with args that don't | |
98 ;; match the lambda's definition) | |
99 ;; 'redefine (function cell redefined from | |
100 ;; a macro to a lambda or vice versa, | |
101 ;; or redefined to take other args) | |
102 ;; 'obsolete (obsolete variables and functions) | |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
103 ;; 'noruntime (calls to functions only defined |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
104 ;; within `eval-when-compile') |
14169 | 105 ;; byte-compile-compatibility Whether the compiler should |
106 ;; generate .elc files which can be loaded into | |
107 ;; generic emacs 18. | |
108 ;; emacs-lisp-file-regexp Regexp for the extension of source-files; | |
109 ;; see also the function byte-compile-dest-file. | |
757 | 110 |
14169 | 111 ;; New Features: |
112 ;; | |
113 ;; o The form `defsubst' is just like `defun', except that the function | |
114 ;; generated will be open-coded in compiled code which uses it. This | |
115 ;; means that no function call will be generated, it will simply be | |
116 ;; spliced in. Lisp functions calls are very slow, so this can be a | |
117 ;; big win. | |
118 ;; | |
119 ;; You can generally accomplish the same thing with `defmacro', but in | |
120 ;; that case, the defined procedure can't be used as an argument to | |
121 ;; mapcar, etc. | |
122 ;; | |
123 ;; o You can also open-code one particular call to a function without | |
124 ;; open-coding all calls. Use the 'inline' form to do this, like so: | |
125 ;; | |
126 ;; (inline (foo 1 2 3)) ;; `foo' will be open-coded | |
127 ;; or... | |
28402 | 128 ;; (inline ;; `foo' and `baz' will be |
14169 | 129 ;; (foo 1 2 3 (bar 5)) ;; open-coded, but `bar' will not. |
130 ;; (baz 0)) | |
131 ;; | |
132 ;; o It is possible to open-code a function in the same file it is defined | |
133 ;; in without having to load that file before compiling it. the | |
134 ;; byte-compiler has been modified to remember function definitions in | |
135 ;; the compilation environment in the same way that it remembers macro | |
136 ;; definitions. | |
137 ;; | |
138 ;; o Forms like ((lambda ...) ...) are open-coded. | |
139 ;; | |
140 ;; o The form `eval-when-compile' is like progn, except that the body | |
141 ;; is evaluated at compile-time. When it appears at top-level, this | |
142 ;; is analogous to the Common Lisp idiom (eval-when (compile) ...). | |
143 ;; When it does not appear at top-level, it is similar to the | |
144 ;; Common Lisp #. reader macro (but not in interpreted code). | |
145 ;; | |
146 ;; o The form `eval-and-compile' is similar to eval-when-compile, but | |
147 ;; the whole form is evalled both at compile-time and at run-time. | |
148 ;; | |
149 ;; o The command compile-defun is analogous to eval-defun. | |
150 ;; | |
28402 | 151 ;; o If you run byte-compile-file on a filename which is visited in a |
14169 | 152 ;; buffer, and that buffer is modified, you are asked whether you want |
153 ;; to save the buffer before compiling. | |
154 ;; | |
155 ;; o byte-compiled files now start with the string `;ELC'. | |
156 ;; Some versions of `file' can be customized to recognize that. | |
757 | 157 |
1604
25173c1db5a6
* bytecomp.el: Declare unread-command-char an obsolete variable.
Jim Blandy <jimb@redhat.com>
parents:
1532
diff
changeset
|
158 (require 'backquote) |
25173c1db5a6
* bytecomp.el: Declare unread-command-char an obsolete variable.
Jim Blandy <jimb@redhat.com>
parents:
1532
diff
changeset
|
159 |
757 | 160 (or (fboundp 'defsubst) |
161 ;; This really ought to be loaded already! | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
162 (load-library "byte-run")) |
757 | 163 |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
164 ;;; The feature of compiling in a specific target Emacs version |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
165 ;;; has been turned off because compile time options are a bad idea. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
166 (defmacro byte-compile-single-version () nil) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
167 (defmacro byte-compile-version-cond (cond) cond) |
757 | 168 |
169 ;;; The crud you see scattered through this file of the form | |
170 ;;; (or (and (boundp 'epoch::version) epoch::version) | |
171 ;;; (string-lessp emacs-version "19")) | |
172 ;;; is because the Epoch folks couldn't be bothered to follow the | |
173 ;;; normal emacs version numbering convention. | |
174 | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
175 ;; (if (byte-compile-version-cond |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
176 ;; (or (and (boundp 'epoch::version) epoch::version) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
177 ;; (string-lessp emacs-version "19"))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
178 ;; (progn |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
179 ;; ;; emacs-18 compatibility. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
180 ;; (defvar baud-rate (baud-rate)) ;Define baud-rate if it's undefined |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
181 ;; |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
182 ;; (if (byte-compile-single-version) |
1819
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
183 ;; (defmacro byte-code-function-p (x) "Emacs 18 doesn't have these." nil) |
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
184 ;; (defun byte-code-function-p (x) "Emacs 18 doesn't have these." nil)) |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
185 ;; |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
186 ;; (or (and (fboundp 'member) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
187 ;; ;; avoid using someone else's possibly bogus definition of this. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
188 ;; (subrp (symbol-function 'member))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
189 ;; (defun member (elt list) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
190 ;; "like memq, but uses equal instead of eq. In v19, this is a subr." |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
191 ;; (while (and list (not (equal elt (car list)))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
192 ;; (setq list (cdr list))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
193 ;; list)))) |
757 | 194 |
195 | |
20779 | 196 (defgroup bytecomp nil |
197 "Emacs Lisp byte-compiler" | |
198 :group 'lisp) | |
199 | |
200 (defcustom emacs-lisp-file-regexp (if (eq system-type 'vax-vms) | |
201 "\\.EL\\(;[0-9]+\\)?$" | |
202 "\\.el$") | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
203 "*Regexp which matches Emacs Lisp source files. |
20779 | 204 You may want to redefine the function `byte-compile-dest-file' |
205 if you change this variable." | |
206 :group 'bytecomp | |
207 :type 'regexp) | |
757 | 208 |
12928
5c76c36717cb
(byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12823
diff
changeset
|
209 ;; This enables file name handlers such as jka-compr |
5c76c36717cb
(byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12823
diff
changeset
|
210 ;; to remove parts of the file name that should not be copied |
5c76c36717cb
(byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12823
diff
changeset
|
211 ;; through to the output file name. |
5c76c36717cb
(byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12823
diff
changeset
|
212 (defun byte-compiler-base-file-name (filename) |
5c76c36717cb
(byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12823
diff
changeset
|
213 (let ((handler (find-file-name-handler filename |
5c76c36717cb
(byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12823
diff
changeset
|
214 'byte-compiler-base-file-name))) |
5c76c36717cb
(byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12823
diff
changeset
|
215 (if handler |
5c76c36717cb
(byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12823
diff
changeset
|
216 (funcall handler 'byte-compiler-base-file-name filename) |
5c76c36717cb
(byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12823
diff
changeset
|
217 filename))) |
5c76c36717cb
(byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12823
diff
changeset
|
218 |
757 | 219 (or (fboundp 'byte-compile-dest-file) |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
220 ;; The user may want to redefine this along with emacs-lisp-file-regexp, |
757 | 221 ;; so only define it if it is undefined. |
222 (defun byte-compile-dest-file (filename) | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
223 "Convert an Emacs Lisp source file name to a compiled file name." |
12928
5c76c36717cb
(byte-compiler-base-file-name): New function.
Richard M. Stallman <rms@gnu.org>
parents:
12823
diff
changeset
|
224 (setq filename (byte-compiler-base-file-name filename)) |
757 | 225 (setq filename (file-name-sans-versions filename)) |
226 (cond ((eq system-type 'vax-vms) | |
23054 | 227 (concat (substring filename 0 (string-match ";" filename)) "c")) |
228 ((string-match emacs-lisp-file-regexp filename) | |
229 (concat (substring filename 0 (match-beginning 0)) ".elc")) | |
230 (t (concat filename ".elc"))))) | |
757 | 231 |
232 ;; This can be the 'byte-compile property of any symbol. | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
233 (autoload 'byte-compile-inline-expand "byte-opt") |
757 | 234 |
235 ;; This is the entrypoint to the lapcode optimizer pass1. | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
236 (autoload 'byte-optimize-form "byte-opt") |
757 | 237 ;; This is the entrypoint to the lapcode optimizer pass2. |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
238 (autoload 'byte-optimize-lapcode "byte-opt") |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
239 (autoload 'byte-compile-unfold-lambda "byte-opt") |
757 | 240 |
1819
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
241 ;; This is the entry point to the decompiler, which is used by the |
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
242 ;; disassembler. The disassembler just requires 'byte-compile, but |
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
243 ;; that doesn't define this function, so this seems to be a reasonable |
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
244 ;; thing to do. |
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
245 (autoload 'byte-decompile-bytecode "byte-opt") |
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
246 |
20779 | 247 (defcustom byte-compile-verbose |
757 | 248 (and (not noninteractive) (> baud-rate search-slow-speed)) |
20779 | 249 "*Non-nil means print messages describing progress of byte-compiler." |
250 :group 'bytecomp | |
251 :type 'boolean) | |
757 | 252 |
20779 | 253 (defcustom byte-compile-compatibility nil |
254 "*Non-nil means generate output that can run in Emacs 18." | |
255 :group 'bytecomp | |
256 :type 'boolean) | |
757 | 257 |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
258 ;; (defvar byte-compile-generate-emacs19-bytecodes |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
259 ;; (not (or (and (boundp 'epoch::version) epoch::version) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
260 ;; (string-lessp emacs-version "19"))) |
28402 | 261 ;; "*If this is true, then the byte-compiler will generate bytecode which |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
262 ;; makes use of byte-ops which are present only in Emacs 19. Code generated |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
263 ;; this way can never be run in Emacs 18, and may even cause it to crash.") |
757 | 264 |
20779 | 265 (defcustom byte-optimize t |
1129 | 266 "*Enables optimization in the byte compiler. |
267 nil means don't do any optimization. | |
268 t means do all optimizations. | |
269 `source' means do source-level optimizations only. | |
20779 | 270 `byte' means do code-level optimizations only." |
271 :group 'bytecomp | |
272 :type '(choice (const :tag "none" nil) | |
273 (const :tag "all" t) | |
274 (const :tag "source-level" source) | |
275 (const :tag "byte-level" byte))) | |
757 | 276 |
20779 | 277 (defcustom byte-compile-delete-errors t |
1129 | 278 "*If non-nil, the optimizer may delete forms that may signal an error. |
20779 | 279 This includes variable references and calls to functions such as `car'." |
280 :group 'bytecomp | |
281 :type 'boolean) | |
757 | 282 |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
283 (defvar byte-compile-dynamic nil |
20779 | 284 "If non-nil, compile function bodies so they load lazily. |
23342
8cc9aa86ee9d
(byte-compile-dynamic): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
23135
diff
changeset
|
285 They are hidden in comments in the compiled file, |
8cc9aa86ee9d
(byte-compile-dynamic): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
23135
diff
changeset
|
286 and each one is brought into core when the |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
287 function is called. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
288 |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
289 To enable this option, make it a file-local variable |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
290 in the source file you want it to apply to. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
291 For example, add -*-byte-compile-dynamic: t;-*- on the first line. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
292 |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
293 When this option is true, if you load the compiled file and then move it, |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
294 the functions you loaded will not be able to run.") |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
295 |
20779 | 296 (defcustom byte-compile-dynamic-docstrings t |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
297 "*If non-nil, compile doc strings for lazy access. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
298 We bury the doc strings of functions and variables |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
299 inside comments in the file, and bring them into core only when they |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
300 are actually needed. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
301 |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
302 When this option is true, if you load the compiled file and then move it, |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
303 you won't be able to find the documentation of anything in that file. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
304 |
11848
1a50b9d542ce
(byte-compile-dynamic-docstrings): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
11819
diff
changeset
|
305 To disable this option for a certain file, make it a file-local variable |
1a50b9d542ce
(byte-compile-dynamic-docstrings): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
11819
diff
changeset
|
306 in the source file. For example, add this to the first line: |
1a50b9d542ce
(byte-compile-dynamic-docstrings): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
11819
diff
changeset
|
307 -*-byte-compile-dynamic-docstrings:nil;-*- |
1a50b9d542ce
(byte-compile-dynamic-docstrings): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
11819
diff
changeset
|
308 You can also set the variable globally. |
1a50b9d542ce
(byte-compile-dynamic-docstrings): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents:
11819
diff
changeset
|
309 |
20779 | 310 This option is enabled by default because it reduces Emacs memory usage." |
311 :group 'bytecomp | |
312 :type 'boolean) | |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
313 |
20779 | 314 (defcustom byte-optimize-log nil |
757 | 315 "*If true, the byte-compiler will log its optimizations into *Compile-Log*. |
316 If this is 'source, then only source-level optimizations will be logged. | |
20779 | 317 If it is 'byte, then only byte-level optimizations will be logged." |
318 :group 'bytecomp | |
319 :type '(choice (const :tag "none" nil) | |
320 (const :tag "all" t) | |
321 (const :tag "source-level" source) | |
322 (const :tag "byte-level" byte))) | |
757 | 323 |
20779 | 324 (defcustom byte-compile-error-on-warn nil |
325 "*If true, the byte-compiler reports warnings with `error'." | |
326 :group 'bytecomp | |
327 :type 'boolean) | |
757 | 328 |
10256
83d56dd99a40
(byte-compile-warning-types): Add obsolete.
Richard M. Stallman <rms@gnu.org>
parents:
10235
diff
changeset
|
329 (defconst byte-compile-warning-types |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
330 '(redefine callargs free-vars unresolved obsolete noruntime)) |
20779 | 331 (defcustom byte-compile-warnings t |
757 | 332 "*List of warnings that the byte-compiler should issue (t for all). |
958 | 333 Elements of the list may be be: |
334 | |
335 free-vars references to variables not in the current lexical scope. | |
336 unresolved calls to unknown functions. | |
337 callargs lambda calls with args that don't match the definition. | |
338 redefine function cell redefined from a macro to a lambda or vice | |
339 versa, or redefined to take a different number of arguments. | |
24025 | 340 obsolete obsolete variables and functions." |
20779 | 341 :group 'bytecomp |
21510
daf7dfe93205
(byte-compile-warnings): Fix customize
Andreas Schwab <schwab@suse.de>
parents:
20847
diff
changeset
|
342 :type '(choice (const :tag "All" t) |
daf7dfe93205
(byte-compile-warnings): Fix customize
Andreas Schwab <schwab@suse.de>
parents:
20847
diff
changeset
|
343 (set :menu-tag "Some" |
daf7dfe93205
(byte-compile-warnings): Fix customize
Andreas Schwab <schwab@suse.de>
parents:
20847
diff
changeset
|
344 (const free-vars) (const unresolved) |
daf7dfe93205
(byte-compile-warnings): Fix customize
Andreas Schwab <schwab@suse.de>
parents:
20847
diff
changeset
|
345 (const callargs) (const redefined) |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
346 (const obsolete) (const noruntime)))) |
757 | 347 |
20779 | 348 (defcustom byte-compile-generate-call-tree nil |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
349 "*Non-nil means collect call-graph information when compiling. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
350 This records functions were called and from where. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
351 If the value is t, compilation displays the call graph when it finishes. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
352 If the value is neither t nor nil, compilation asks you whether to display |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
353 the graph. |
757 | 354 |
355 The call tree only lists functions called, not macros used. Those functions | |
356 which the byte-code interpreter knows about directly (eq, cons, etc.) are | |
357 not reported. | |
358 | |
359 The call tree also lists those functions which are not known to be called | |
10372 | 360 \(that is, to which no calls have been compiled). Functions which can be |
20779 | 361 invoked interactively are excluded from this list." |
362 :group 'bytecomp | |
363 :type '(choice (const :tag "Yes" t) (const :tag "No" nil) | |
22578
f330ab785b83
(byte-compile-generate-call-tree):
Andreas Schwab <schwab@suse.de>
parents:
22350
diff
changeset
|
364 (other :tag "Ask" lambda))) |
757 | 365 |
366 (defconst byte-compile-call-tree nil "Alist of functions and their call tree. | |
367 Each element looks like | |
368 | |
369 \(FUNCTION CALLERS CALLS\) | |
370 | |
371 where CALLERS is a list of functions that call FUNCTION, and CALLS | |
372 is a list of functions for which calls were generated while compiling | |
373 FUNCTION.") | |
374 | |
20779 | 375 (defcustom byte-compile-call-tree-sort 'name |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
376 "*If non-nil, sort the call tree. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
377 The values `name', `callers', `calls', `calls+callers' |
20779 | 378 specify different fields to sort on." |
379 :group 'bytecomp | |
380 :type '(choice (const name) (const callers) (const calls) | |
381 (const calls+callers) (const nil))) | |
757 | 382 |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
383 ;; (defvar byte-compile-overwrite-file t |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
384 ;; "If nil, old .elc files are deleted before the new is saved, and .elc |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
385 ;; files will have the same modes as the corresponding .el file. Otherwise, |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
386 ;; existing .elc files will simply be overwritten, and the existing modes |
28402 | 387 ;; will not be changed. If this variable is nil, then an .elc file which |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
388 ;; is a symbolic link will be turned into a normal file, instead of the file |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
389 ;; which the link points to being overwritten.") |
757 | 390 |
391 (defvar byte-compile-constants nil | |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
392 "List of all constants encountered during compilation of this form.") |
757 | 393 (defvar byte-compile-variables nil |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
394 "List of all variables encountered during compilation of this form.") |
757 | 395 (defvar byte-compile-bound-variables nil |
26922
6fdf1f6c23a0
(byte-compile-bound-variables): Doc fix.
Dave Love <fx@gnu.org>
parents:
25636
diff
changeset
|
396 "List of variables bound in the context of the current form. |
6fdf1f6c23a0
(byte-compile-bound-variables): Doc fix.
Dave Love <fx@gnu.org>
parents:
25636
diff
changeset
|
397 This list lives partly on the stack.") |
757 | 398 (defvar byte-compile-free-references) |
399 (defvar byte-compile-free-assignments) | |
400 | |
1129 | 401 (defvar byte-compiler-error-flag) |
402 | |
757 | 403 (defconst byte-compile-initial-macro-environment |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
404 '( |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
405 ;; (byte-compiler-options . (lambda (&rest forms) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
406 ;; (apply 'byte-compiler-options-handler forms))) |
757 | 407 (eval-when-compile . (lambda (&rest body) |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
408 (list 'quote |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
409 (byte-compile-eval (byte-compile-top-level |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
410 (cons 'progn body)))))) |
757 | 411 (eval-and-compile . (lambda (&rest body) |
412 (eval (cons 'progn body)) | |
413 (cons 'progn body)))) | |
414 "The default macro-environment passed to macroexpand by the compiler. | |
415 Placing a macro here will cause a macro to have different semantics when | |
416 expanded by the compiler as when expanded by the interpreter.") | |
417 | |
418 (defvar byte-compile-macro-environment byte-compile-initial-macro-environment | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
419 "Alist of macros defined in the file being compiled. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
420 Each element looks like (MACRONAME . DEFINITION). It is |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
421 \(MACRONAME . nil) when a macro is redefined as a function.") |
757 | 422 |
423 (defvar byte-compile-function-environment nil | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
424 "Alist of functions defined in the file being compiled. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
425 This is so we can inline them when necessary. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
426 Each element looks like (FUNCTIONNAME . DEFINITION). It is |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
427 \(FUNCTIONNAME . nil) when a function is redefined as a macro.") |
757 | 428 |
429 (defvar byte-compile-unresolved-functions nil | |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
430 "Alist of undefined functions to which calls have been compiled. |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
431 Used for warnings when the function is not known to be defined or is later |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
432 defined with incorrect args.") |
757 | 433 |
434 (defvar byte-compile-tag-number 0) | |
435 (defvar byte-compile-output nil | |
436 "Alist describing contents to put in byte code string. | |
437 Each element is (INDEX . VALUE)") | |
438 (defvar byte-compile-depth 0 "Current depth of execution stack.") | |
439 (defvar byte-compile-maxdepth 0 "Maximum depth of execution stack.") | |
440 | |
441 | |
442 ;;; The byte codes; this information is duplicated in bytecomp.c | |
443 | |
444 (defconst byte-code-vector nil | |
445 "An array containing byte-code names indexed by byte-code values.") | |
446 | |
447 (defconst byte-stack+-info nil | |
448 "An array with the stack adjustment for each byte-code.") | |
449 | |
450 (defmacro byte-defop (opcode stack-adjust opname &optional docstring) | |
451 ;; This is a speed-hack for building the byte-code-vector at compile-time. | |
452 ;; We fill in the vector at macroexpand-time, and then after the last call | |
453 ;; to byte-defop, we write the vector out as a constant instead of writing | |
454 ;; out a bunch of calls to aset. | |
455 ;; Actually, we don't fill in the vector itself, because that could make | |
456 ;; it problematic to compile big changes to this compiler; we store the | |
457 ;; values on its plist, and remove them later in -extrude. | |
458 (let ((v1 (or (get 'byte-code-vector 'tmp-compile-time-value) | |
459 (put 'byte-code-vector 'tmp-compile-time-value | |
460 (make-vector 256 nil)))) | |
461 (v2 (or (get 'byte-stack+-info 'tmp-compile-time-value) | |
462 (put 'byte-stack+-info 'tmp-compile-time-value | |
463 (make-vector 256 nil))))) | |
464 (aset v1 opcode opname) | |
465 (aset v2 opcode stack-adjust)) | |
466 (if docstring | |
467 (list 'defconst opname opcode (concat "Byte code opcode " docstring ".")) | |
468 (list 'defconst opname opcode))) | |
469 | |
470 (defmacro byte-extrude-byte-code-vectors () | |
471 (prog1 (list 'setq 'byte-code-vector | |
472 (get 'byte-code-vector 'tmp-compile-time-value) | |
473 'byte-stack+-info | |
474 (get 'byte-stack+-info 'tmp-compile-time-value)) | |
27230
6eba74503556
(byte-extrude-byte-code-vectors): Use remprop.
Dave Love <fx@gnu.org>
parents:
26936
diff
changeset
|
475 (put 'byte-code-vector 'tmp-compile-time-value nil) |
6eba74503556
(byte-extrude-byte-code-vectors): Use remprop.
Dave Love <fx@gnu.org>
parents:
26936
diff
changeset
|
476 (put 'byte-stack+-info 'tmp-compile-time-value nil))) |
757 | 477 |
478 | |
479 ;; unused: 0-7 | |
480 | |
481 ;; These opcodes are special in that they pack their argument into the | |
482 ;; opcode word. | |
483 ;; | |
484 (byte-defop 8 1 byte-varref "for variable reference") | |
485 (byte-defop 16 -1 byte-varset "for setting a variable") | |
486 (byte-defop 24 -1 byte-varbind "for binding a variable") | |
487 (byte-defop 32 0 byte-call "for calling a function") | |
488 (byte-defop 40 0 byte-unbind "for unbinding special bindings") | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3455
diff
changeset
|
489 ;; codes 8-47 are consumed by the preceding opcodes |
757 | 490 |
491 ;; unused: 48-55 | |
492 | |
493 (byte-defop 56 -1 byte-nth) | |
494 (byte-defop 57 0 byte-symbolp) | |
495 (byte-defop 58 0 byte-consp) | |
496 (byte-defop 59 0 byte-stringp) | |
497 (byte-defop 60 0 byte-listp) | |
498 (byte-defop 61 -1 byte-eq) | |
499 (byte-defop 62 -1 byte-memq) | |
500 (byte-defop 63 0 byte-not) | |
501 (byte-defop 64 0 byte-car) | |
502 (byte-defop 65 0 byte-cdr) | |
503 (byte-defop 66 -1 byte-cons) | |
504 (byte-defop 67 0 byte-list1) | |
505 (byte-defop 68 -1 byte-list2) | |
506 (byte-defop 69 -2 byte-list3) | |
507 (byte-defop 70 -3 byte-list4) | |
508 (byte-defop 71 0 byte-length) | |
509 (byte-defop 72 -1 byte-aref) | |
510 (byte-defop 73 -2 byte-aset) | |
511 (byte-defop 74 0 byte-symbol-value) | |
512 (byte-defop 75 0 byte-symbol-function) ; this was commented out | |
513 (byte-defop 76 -1 byte-set) | |
514 (byte-defop 77 -1 byte-fset) ; this was commented out | |
515 (byte-defop 78 -1 byte-get) | |
516 (byte-defop 79 -2 byte-substring) | |
517 (byte-defop 80 -1 byte-concat2) | |
518 (byte-defop 81 -2 byte-concat3) | |
519 (byte-defop 82 -3 byte-concat4) | |
520 (byte-defop 83 0 byte-sub1) | |
521 (byte-defop 84 0 byte-add1) | |
522 (byte-defop 85 -1 byte-eqlsign) | |
523 (byte-defop 86 -1 byte-gtr) | |
524 (byte-defop 87 -1 byte-lss) | |
525 (byte-defop 88 -1 byte-leq) | |
526 (byte-defop 89 -1 byte-geq) | |
527 (byte-defop 90 -1 byte-diff) | |
528 (byte-defop 91 0 byte-negate) | |
529 (byte-defop 92 -1 byte-plus) | |
530 (byte-defop 93 -1 byte-max) | |
531 (byte-defop 94 -1 byte-min) | |
532 (byte-defop 95 -1 byte-mult) ; v19 only | |
533 (byte-defop 96 1 byte-point) | |
534 (byte-defop 98 0 byte-goto-char) | |
535 (byte-defop 99 0 byte-insert) | |
536 (byte-defop 100 1 byte-point-max) | |
537 (byte-defop 101 1 byte-point-min) | |
538 (byte-defop 102 0 byte-char-after) | |
539 (byte-defop 103 1 byte-following-char) | |
540 (byte-defop 104 1 byte-preceding-char) | |
541 (byte-defop 105 1 byte-current-column) | |
542 (byte-defop 106 0 byte-indent-to) | |
543 (byte-defop 107 0 byte-scan-buffer-OBSOLETE) ; no longer generated as of v18 | |
544 (byte-defop 108 1 byte-eolp) | |
545 (byte-defop 109 1 byte-eobp) | |
546 (byte-defop 110 1 byte-bolp) | |
547 (byte-defop 111 1 byte-bobp) | |
548 (byte-defop 112 1 byte-current-buffer) | |
549 (byte-defop 113 0 byte-set-buffer) | |
18266
fd7bd1ad0763
(byte-save-current-buffer): Change to code 114 (0162).
Richard M. Stallman <rms@gnu.org>
parents:
17704
diff
changeset
|
550 (byte-defop 114 0 byte-save-current-buffer |
fd7bd1ad0763
(byte-save-current-buffer): Change to code 114 (0162).
Richard M. Stallman <rms@gnu.org>
parents:
17704
diff
changeset
|
551 "To make a binding to record the current buffer") |
757 | 552 (byte-defop 115 0 byte-set-mark-OBSOLETE) |
553 (byte-defop 116 1 byte-interactive-p) | |
554 | |
555 ;; These ops are new to v19 | |
556 (byte-defop 117 0 byte-forward-char) | |
557 (byte-defop 118 0 byte-forward-word) | |
558 (byte-defop 119 -1 byte-skip-chars-forward) | |
559 (byte-defop 120 -1 byte-skip-chars-backward) | |
560 (byte-defop 121 0 byte-forward-line) | |
561 (byte-defop 122 0 byte-char-syntax) | |
562 (byte-defop 123 -1 byte-buffer-substring) | |
563 (byte-defop 124 -1 byte-delete-region) | |
564 (byte-defop 125 -1 byte-narrow-to-region) | |
565 (byte-defop 126 1 byte-widen) | |
566 (byte-defop 127 0 byte-end-of-line) | |
567 | |
568 ;; unused: 128 | |
569 | |
570 ;; These store their argument in the next two bytes | |
571 (byte-defop 129 1 byte-constant2 | |
572 "for reference to a constant with vector index >= byte-constant-limit") | |
573 (byte-defop 130 0 byte-goto "for unconditional jump") | |
574 (byte-defop 131 -1 byte-goto-if-nil "to pop value and jump if it's nil") | |
575 (byte-defop 132 -1 byte-goto-if-not-nil "to pop value and jump if it's not nil") | |
576 (byte-defop 133 -1 byte-goto-if-nil-else-pop | |
28402 | 577 "to examine top-of-stack, jump and don't pop it if it's nil, |
757 | 578 otherwise pop it") |
579 (byte-defop 134 -1 byte-goto-if-not-nil-else-pop | |
28402 | 580 "to examine top-of-stack, jump and don't pop it if it's non nil, |
757 | 581 otherwise pop it") |
582 | |
583 (byte-defop 135 -1 byte-return "to pop a value and return it from `byte-code'") | |
584 (byte-defop 136 -1 byte-discard "to discard one value from stack") | |
585 (byte-defop 137 1 byte-dup "to duplicate the top of the stack") | |
586 | |
587 (byte-defop 138 0 byte-save-excursion | |
588 "to make a binding to record the buffer, point and mark") | |
589 (byte-defop 139 0 byte-save-window-excursion | |
590 "to make a binding to record entire window configuration") | |
591 (byte-defop 140 0 byte-save-restriction | |
592 "to make a binding to record the current buffer clipping restrictions") | |
593 (byte-defop 141 -1 byte-catch | |
594 "for catch. Takes, on stack, the tag and an expression for the body") | |
595 (byte-defop 142 -1 byte-unwind-protect | |
596 "for unwind-protect. Takes, on stack, an expression for the unwind-action") | |
597 | |
28402 | 598 ;; For condition-case. Takes, on stack, the variable to bind, |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
599 ;; an expression for the body, and a list of clauses. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
600 (byte-defop 143 -2 byte-condition-case) |
757 | 601 |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
602 ;; For entry to with-output-to-temp-buffer. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
603 ;; Takes, on stack, the buffer name. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
604 ;; Binds standard-output and does some other things. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
605 ;; Returns with temp buffer on the stack in place of buffer name. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
606 (byte-defop 144 0 byte-temp-output-buffer-setup) |
757 | 607 |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
608 ;; For exit from with-output-to-temp-buffer. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
609 ;; Expects the temp buffer on the stack underneath value to return. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
610 ;; Pops them both, then pushes the value back on. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
611 ;; Unbinds standard-output and makes the temp buffer visible. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
612 (byte-defop 145 -1 byte-temp-output-buffer-show) |
757 | 613 |
614 ;; these ops are new to v19 | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
615 |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
616 ;; To unbind back to the beginning of this frame. |
11117
34477ac36e6e
(byte-compile-out-toplevel): Compile lambda forms even if trivial.
Karl Heuer <kwzh@gnu.org>
parents:
10836
diff
changeset
|
617 ;; Not used yet, but will be needed for tail-recursion elimination. |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
618 (byte-defop 146 0 byte-unbind-all) |
757 | 619 |
620 ;; these ops are new to v19 | |
621 (byte-defop 147 -2 byte-set-marker) | |
622 (byte-defop 148 0 byte-match-beginning) | |
623 (byte-defop 149 0 byte-match-end) | |
624 (byte-defop 150 0 byte-upcase) | |
625 (byte-defop 151 0 byte-downcase) | |
626 (byte-defop 152 -1 byte-string=) | |
627 (byte-defop 153 -1 byte-string<) | |
628 (byte-defop 154 -1 byte-equal) | |
629 (byte-defop 155 -1 byte-nthcdr) | |
630 (byte-defop 156 -1 byte-elt) | |
631 (byte-defop 157 -1 byte-member) | |
632 (byte-defop 158 -1 byte-assq) | |
633 (byte-defop 159 0 byte-nreverse) | |
634 (byte-defop 160 -1 byte-setcar) | |
635 (byte-defop 161 -1 byte-setcdr) | |
636 (byte-defop 162 0 byte-car-safe) | |
637 (byte-defop 163 0 byte-cdr-safe) | |
638 (byte-defop 164 -1 byte-nconc) | |
639 (byte-defop 165 -1 byte-quo) | |
640 (byte-defop 166 -1 byte-rem) | |
641 (byte-defop 167 0 byte-numberp) | |
642 (byte-defop 168 0 byte-integerp) | |
643 | |
848 | 644 ;; unused: 169-174 |
757 | 645 (byte-defop 175 nil byte-listN) |
646 (byte-defop 176 nil byte-concatN) | |
647 (byte-defop 177 nil byte-insertN) | |
648 | |
649 ;; unused: 178-191 | |
650 | |
651 (byte-defop 192 1 byte-constant "for reference to a constant") | |
652 ;; codes 193-255 are consumed by byte-constant. | |
653 (defconst byte-constant-limit 64 | |
654 "Exclusive maximum index usable in the `byte-constant' opcode.") | |
655 | |
656 (defconst byte-goto-ops '(byte-goto byte-goto-if-nil byte-goto-if-not-nil | |
657 byte-goto-if-nil-else-pop | |
658 byte-goto-if-not-nil-else-pop) | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
659 "List of byte-codes whose offset is a pc.") |
757 | 660 |
661 (defconst byte-goto-always-pop-ops '(byte-goto-if-nil byte-goto-if-not-nil)) | |
662 | |
663 (byte-extrude-byte-code-vectors) | |
664 | |
665 ;;; lapcode generator | |
666 ;;; | |
667 ;;; the byte-compiler now does source -> lapcode -> bytecode instead of | |
668 ;;; source -> bytecode, because it's a lot easier to make optimizations | |
669 ;;; on lapcode than on bytecode. | |
670 ;;; | |
671 ;;; Elements of the lapcode list are of the form (<instruction> . <parameter>) | |
672 ;;; where instruction is a symbol naming a byte-code instruction, | |
673 ;;; and parameter is an argument to that instruction, if any. | |
674 ;;; | |
28402 | 675 ;;; The instruction can be the pseudo-op TAG, which means that this position |
757 | 676 ;;; in the instruction stream is a target of a goto. (car PARAMETER) will be |
677 ;;; the PC for this location, and the whole instruction "(TAG pc)" will be the | |
678 ;;; parameter for some goto op. | |
679 ;;; | |
680 ;;; If the operation is varbind, varref, varset or push-constant, then the | |
681 ;;; parameter is (variable/constant . index_in_constant_vector). | |
682 ;;; | |
683 ;;; First, the source code is macroexpanded and optimized in various ways. | |
684 ;;; Then the resultant code is compiled into lapcode. Another set of | |
685 ;;; optimizations are then run over the lapcode. Then the variables and | |
686 ;;; constants referenced by the lapcode are collected and placed in the | |
687 ;;; constants-vector. (This happens now so that variables referenced by dead | |
688 ;;; code don't consume space.) And finally, the lapcode is transformed into | |
689 ;;; compacted byte-code. | |
690 ;;; | |
691 ;;; A distinction is made between variables and constants because the variable- | |
692 ;;; referencing instructions are more sensitive to the variables being near the | |
693 ;;; front of the constants-vector than the constant-referencing instructions. | |
694 ;;; Also, this lets us notice references to free variables. | |
695 | |
696 (defun byte-compile-lapcode (lap) | |
697 "Turns lapcode into bytecode. The lapcode is destroyed." | |
698 ;; Lapcode modifications: changes the ID of a tag to be the tag's PC. | |
699 (let ((pc 0) ; Program counter | |
700 op off ; Operation & offset | |
701 (bytes '()) ; Put the output bytes here | |
702 (patchlist nil) ; List of tags and goto's to patch | |
703 rest rel tmp) | |
704 (while lap | |
705 (setq op (car (car lap)) | |
706 off (cdr (car lap))) | |
707 (cond ((not (symbolp op)) | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
708 (error "Non-symbolic opcode `%s'" op)) |
757 | 709 ((eq op 'TAG) |
710 (setcar off pc) | |
711 (setq patchlist (cons off patchlist))) | |
712 ((memq op byte-goto-ops) | |
713 (setq pc (+ pc 3)) | |
714 (setq bytes (cons (cons pc (cdr off)) | |
715 (cons nil | |
716 (cons (symbol-value op) bytes)))) | |
717 (setq patchlist (cons bytes patchlist))) | |
718 (t | |
719 (setq bytes | |
720 (cond ((cond ((consp off) | |
721 ;; Variable or constant reference | |
722 (setq off (cdr off)) | |
723 (eq op 'byte-constant))) | |
724 (cond ((< off byte-constant-limit) | |
725 (setq pc (1+ pc)) | |
726 (cons (+ byte-constant off) bytes)) | |
727 (t | |
728 (setq pc (+ 3 pc)) | |
729 (cons (lsh off -8) | |
730 (cons (logand off 255) | |
731 (cons byte-constant2 bytes)))))) | |
732 ((<= byte-listN (symbol-value op)) | |
733 (setq pc (+ 2 pc)) | |
734 (cons off (cons (symbol-value op) bytes))) | |
735 ((< off 6) | |
736 (setq pc (1+ pc)) | |
737 (cons (+ (symbol-value op) off) bytes)) | |
738 ((< off 256) | |
739 (setq pc (+ 2 pc)) | |
740 (cons off (cons (+ (symbol-value op) 6) bytes))) | |
741 (t | |
742 (setq pc (+ 3 pc)) | |
743 (cons (lsh off -8) | |
744 (cons (logand off 255) | |
745 (cons (+ (symbol-value op) 7) | |
746 bytes)))))))) | |
747 (setq lap (cdr lap))) | |
748 ;;(if (not (= pc (length bytes))) | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
749 ;; (error "Compiler error: pc mismatch - %s %s" pc (length bytes))) |
757 | 750 ;; Patch PC into jumps |
751 (let (bytes) | |
752 (while patchlist | |
753 (setq bytes (car patchlist)) | |
754 (cond ((atom (car bytes))) ; Tag | |
755 (t ; Absolute jump | |
756 (setq pc (car (cdr (car bytes)))) ; Pick PC from tag | |
757 (setcar (cdr bytes) (logand pc 255)) | |
758 (setcar bytes (lsh pc -8)))) | |
759 (setq patchlist (cdr patchlist)))) | |
760 (concat (nreverse bytes)))) | |
761 | |
762 | |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
763 ;;; compile-time evaluation |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
764 |
28336
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
765 (defun byte-compile-eval (form) |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
766 "Eval FORM and mark the functions defined therein. |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
767 Each function's symbol gets marked with the `byte-compile-noruntime' property." |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
768 (let ((hist-orig load-history) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
769 (hist-nil-orig current-load-list)) |
28336
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
770 (prog1 (eval form) |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
771 (when (memq 'noruntime byte-compile-warnings) |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
772 (let ((hist-new load-history) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
773 (hist-nil-new current-load-list)) |
28336
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
774 ;; Go through load-history, look for newly loaded files |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
775 ;; and mark all the functions defined therein. |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
776 (while (and hist-new (not (eq hist-new hist-orig))) |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
777 (let ((xs (pop hist-new))) |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
778 ;; Make sure the file was not already loaded before. |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
779 (unless (assoc (car xs) hist-orig) |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
780 (dolist (s xs) |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
781 (cond |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
782 ((symbolp s) (put s 'byte-compile-noruntime t)) |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
783 ((and (consp s) (eq 'autoload (car s))) |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
784 (put (cdr s) 'byte-compile-noruntime t))))))) |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
785 ;; Go through current-load-list for the locally defined funs. |
49b7af1b8e1b
(byte-compile-eval): Fix and reenable the code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
28305
diff
changeset
|
786 (while (and hist-nil-new (not (eq hist-nil-new hist-nil-orig))) |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
787 (let ((s (pop hist-nil-new))) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
788 (when (symbolp s) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
789 (put s 'byte-compile-noruntime t))))))))) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
790 |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
791 |
757 | 792 ;;; byte compiler messages |
793 | |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
794 (defvar byte-compile-current-form nil) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
795 (defvar byte-compile-dest-file nil) |
33352
bd48e8729dbb
(byte-compiling-files-p): New function.
Gerd Moellmann <gerd@gnu.org>
parents:
33348
diff
changeset
|
796 (defvar byte-compile-current-file nil) |
33348
af3d766a1234
(byte-compile-current-file): Don't bind
Gerd Moellmann <gerd@gnu.org>
parents:
32765
diff
changeset
|
797 |
757 | 798 (defmacro byte-compile-log (format-string &rest args) |
799 (list 'and | |
800 'byte-optimize | |
801 '(memq byte-optimize-log '(t source)) | |
802 (list 'let '((print-escape-newlines t) | |
803 (print-level 4) | |
804 (print-length 4)) | |
805 (list 'byte-compile-log-1 | |
806 (cons 'format | |
807 (cons format-string | |
808 (mapcar | |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
809 (lambda (x) |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
810 (if (symbolp x) (list 'prin1-to-string x) x)) |
757 | 811 args))))))) |
812 | |
813 (defconst byte-compile-last-warned-form nil) | |
32763
5436a18ec371
[the following changes fix a bug where `define-minor-mode' didn't
Miles Bader <miles@gnu.org>
parents:
31882
diff
changeset
|
814 (defconst byte-compile-last-logged-file nil) |
757 | 815 |
11323
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
816 ;; Log a message STRING in *Compile-Log*. |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
817 ;; Also log the current function and file if not already done. |
958 | 818 (defun byte-compile-log-1 (string &optional fill) |
757 | 819 (cond (noninteractive |
32763
5436a18ec371
[the following changes fix a bug where `define-minor-mode' didn't
Miles Bader <miles@gnu.org>
parents:
31882
diff
changeset
|
820 (if (or (and byte-compile-current-file |
5436a18ec371
[the following changes fix a bug where `define-minor-mode' didn't
Miles Bader <miles@gnu.org>
parents:
31882
diff
changeset
|
821 (not (equal byte-compile-current-file |
5436a18ec371
[the following changes fix a bug where `define-minor-mode' didn't
Miles Bader <miles@gnu.org>
parents:
31882
diff
changeset
|
822 byte-compile-last-logged-file))) |
757 | 823 (and byte-compile-last-warned-form |
824 (not (eq byte-compile-current-form | |
825 byte-compile-last-warned-form)))) | |
14412
75222e07921e
(byte-compile-log-1): Delete format call inside message.
Karl Heuer <kwzh@gnu.org>
parents:
14169
diff
changeset
|
826 (message "While compiling %s%s:" |
75222e07921e
(byte-compile-log-1): Delete format call inside message.
Karl Heuer <kwzh@gnu.org>
parents:
14169
diff
changeset
|
827 (or byte-compile-current-form "toplevel forms") |
75222e07921e
(byte-compile-log-1): Delete format call inside message.
Karl Heuer <kwzh@gnu.org>
parents:
14169
diff
changeset
|
828 (if byte-compile-current-file |
75222e07921e
(byte-compile-log-1): Delete format call inside message.
Karl Heuer <kwzh@gnu.org>
parents:
14169
diff
changeset
|
829 (if (stringp byte-compile-current-file) |
75222e07921e
(byte-compile-log-1): Delete format call inside message.
Karl Heuer <kwzh@gnu.org>
parents:
14169
diff
changeset
|
830 (concat " in file " byte-compile-current-file) |
75222e07921e
(byte-compile-log-1): Delete format call inside message.
Karl Heuer <kwzh@gnu.org>
parents:
14169
diff
changeset
|
831 (concat " in buffer " |
75222e07921e
(byte-compile-log-1): Delete format call inside message.
Karl Heuer <kwzh@gnu.org>
parents:
14169
diff
changeset
|
832 (buffer-name byte-compile-current-file))) |
75222e07921e
(byte-compile-log-1): Delete format call inside message.
Karl Heuer <kwzh@gnu.org>
parents:
14169
diff
changeset
|
833 ""))) |
757 | 834 (message " %s" string)) |
835 (t | |
836 (save-excursion | |
837 (set-buffer (get-buffer-create "*Compile-Log*")) | |
838 (goto-char (point-max)) | |
32763
5436a18ec371
[the following changes fix a bug where `define-minor-mode' didn't
Miles Bader <miles@gnu.org>
parents:
31882
diff
changeset
|
839 (cond ((or (and byte-compile-current-file |
5436a18ec371
[the following changes fix a bug where `define-minor-mode' didn't
Miles Bader <miles@gnu.org>
parents:
31882
diff
changeset
|
840 (not (equal byte-compile-current-file |
5436a18ec371
[the following changes fix a bug where `define-minor-mode' didn't
Miles Bader <miles@gnu.org>
parents:
31882
diff
changeset
|
841 byte-compile-last-logged-file))) |
757 | 842 (and byte-compile-last-warned-form |
843 (not (eq byte-compile-current-form | |
844 byte-compile-last-warned-form)))) | |
35145
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
845 ;;; This is redundant, since it is given at the start of the file, |
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
846 ;;; and the extra clutter gets in the way -- rms. |
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
847 ;;; (if (and byte-compile-current-file |
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
848 ;;; (not (equal byte-compile-current-file |
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
849 ;;; byte-compile-last-logged-file))) |
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
850 ;;; (insert "\n\^L\n" (current-time-string) "\n")) |
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
851 (insert "\nWhile compiling " |
757 | 852 (if byte-compile-current-form |
853 (format "%s" byte-compile-current-form) | |
854 "toplevel forms")) | |
35145
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
855 ;;; This is redundant, since it is given at the start of the file, |
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
856 ;;; and the extra clutter gets in the way -- rms. |
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
857 ;;; (if byte-compile-current-file |
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
858 ;;; (if (stringp byte-compile-current-file) |
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
859 ;;; (insert " in file " byte-compile-current-file) |
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
860 ;;; (insert " in buffer " |
85b1d35e08bd
(byte-compile-log-1): In non-batch case, don't mention the file name
Richard M. Stallman <rms@gnu.org>
parents:
33352
diff
changeset
|
861 ;;; (buffer-name byte-compile-current-file)))) |
757 | 862 (insert ":\n"))) |
958 | 863 (insert " " string "\n") |
864 (if (and fill (not (string-match "\n" string))) | |
865 (let ((fill-prefix " ") | |
866 (fill-column 78)) | |
867 (fill-paragraph nil))) | |
868 ))) | |
32763
5436a18ec371
[the following changes fix a bug where `define-minor-mode' didn't
Miles Bader <miles@gnu.org>
parents:
31882
diff
changeset
|
869 (setq byte-compile-last-logged-file byte-compile-current-file |
757 | 870 byte-compile-last-warned-form byte-compile-current-form)) |
871 | |
11323
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
872 ;; Log the start of a file in *Compile-Log*, and mark it as done. |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
873 ;; But do nothing in batch mode. |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
874 (defun byte-compile-log-file () |
32763
5436a18ec371
[the following changes fix a bug where `define-minor-mode' didn't
Miles Bader <miles@gnu.org>
parents:
31882
diff
changeset
|
875 (and byte-compile-current-file |
5436a18ec371
[the following changes fix a bug where `define-minor-mode' didn't
Miles Bader <miles@gnu.org>
parents:
31882
diff
changeset
|
876 (not (equal byte-compile-current-file byte-compile-last-logged-file)) |
5436a18ec371
[the following changes fix a bug where `define-minor-mode' didn't
Miles Bader <miles@gnu.org>
parents:
31882
diff
changeset
|
877 (not noninteractive) |
11323
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
878 (save-excursion |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
879 (set-buffer (get-buffer-create "*Compile-Log*")) |
11432
f499628d7e5b
(byte-compile-log-file): Always insert at eob.
Richard M. Stallman <rms@gnu.org>
parents:
11323
diff
changeset
|
880 (goto-char (point-max)) |
11323
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
881 (insert "\n\^L\nCompiling " |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
882 (if (stringp byte-compile-current-file) |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
883 (concat "file " byte-compile-current-file) |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
884 (concat "buffer " (buffer-name byte-compile-current-file))) |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
885 " at " (current-time-string) "\n") |
32763
5436a18ec371
[the following changes fix a bug where `define-minor-mode' didn't
Miles Bader <miles@gnu.org>
parents:
31882
diff
changeset
|
886 (setq byte-compile-last-logged-file byte-compile-current-file)))) |
11323
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
887 |
757 | 888 (defun byte-compile-warn (format &rest args) |
889 (setq format (apply 'format format args)) | |
890 (if byte-compile-error-on-warn | |
891 (error "%s" format) ; byte-compile-file catches and logs it | |
958 | 892 (byte-compile-log-1 (concat "** " format) t) |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
893 ;;; It is useless to flash warnings too fast to be read. |
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
894 ;;; Besides, they will all be shown at the end. |
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
895 ;;; (or noninteractive ; already written on stdout. |
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
896 ;;; (message "Warning: %s" format)) |
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
897 )) |
757 | 898 |
922 | 899 ;;; This function should be used to report errors that have halted |
900 ;;; compilation of the current file. | |
901 (defun byte-compile-report-error (error-info) | |
1129 | 902 (setq byte-compiler-error-flag t) |
958 | 903 (byte-compile-log-1 |
904 (concat "!! " | |
905 (format (if (cdr error-info) "%s (%s)" "%s") | |
906 (get (car error-info) 'error-message) | |
907 (prin1-to-string (cdr error-info)))))) | |
922 | 908 |
757 | 909 ;;; Used by make-obsolete. |
910 (defun byte-compile-obsolete (form) | |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
911 (let* ((new (get (car form) 'byte-obsolete-info)) |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
912 (handler (nth 1 new)) |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
913 (when (nth 2 new))) |
12487
b657158dd5c9
(byte-compile-obsolete): Do the funcall to compile
Richard M. Stallman <rms@gnu.org>
parents:
11928
diff
changeset
|
914 (if (memq 'obsolete byte-compile-warnings) |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
915 (byte-compile-warn "%s is an obsolete function%s; %s" (car form) |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
916 (if when (concat " since " when) "") |
10256
83d56dd99a40
(byte-compile-warning-types): Add obsolete.
Richard M. Stallman <rms@gnu.org>
parents:
10235
diff
changeset
|
917 (if (stringp (car new)) |
83d56dd99a40
(byte-compile-warning-types): Add obsolete.
Richard M. Stallman <rms@gnu.org>
parents:
10235
diff
changeset
|
918 (car new) |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
919 (format "use %s instead." (car new))))) |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
920 (funcall (or handler 'byte-compile-normal-call) form))) |
757 | 921 |
922 ;; Compiler options | |
923 | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
924 ;; (defvar byte-compiler-valid-options |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
925 ;; '((optimize byte-optimize (t nil source byte) val) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
926 ;; (file-format byte-compile-compatibility (emacs18 emacs19) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
927 ;; (eq val 'emacs18)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
928 ;; ;; (new-bytecodes byte-compile-generate-emacs19-bytecodes (t nil) val) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
929 ;; (delete-errors byte-compile-delete-errors (t nil) val) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
930 ;; (verbose byte-compile-verbose (t nil) val) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
931 ;; (warnings byte-compile-warnings ((callargs redefine free-vars unresolved)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
932 ;; val))) |
757 | 933 |
934 ;; Inhibit v18/v19 selectors if the version is hardcoded. | |
28402 | 935 ;; #### This should print a warning if the user tries to change something |
757 | 936 ;; than can't be changed because the running compiler doesn't support it. |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
937 ;; (cond |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
938 ;; ((byte-compile-single-version) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
939 ;; (setcar (cdr (cdr (assq 'new-bytecodes byte-compiler-valid-options))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
940 ;; (list (byte-compile-version-cond |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
941 ;; byte-compile-generate-emacs19-bytecodes))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
942 ;; (setcar (cdr (cdr (assq 'file-format byte-compiler-valid-options))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
943 ;; (if (byte-compile-version-cond byte-compile-compatibility) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
944 ;; '(emacs18) '(emacs19))))) |
757 | 945 |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
946 ;; (defun byte-compiler-options-handler (&rest args) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
947 ;; (let (key val desc choices) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
948 ;; (while args |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
949 ;; (if (or (atom (car args)) (nthcdr 2 (car args)) (null (cdr (car args)))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
950 ;; (error "Malformed byte-compiler option `%s'" (car args))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
951 ;; (setq key (car (car args)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
952 ;; val (car (cdr (car args))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
953 ;; desc (assq key byte-compiler-valid-options)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
954 ;; (or desc |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
955 ;; (error "Unknown byte-compiler option `%s'" key)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
956 ;; (setq choices (nth 2 desc)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
957 ;; (if (consp (car choices)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
958 ;; (let (this |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
959 ;; (handler 'cons) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
960 ;; (ret (and (memq (car val) '(+ -)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
961 ;; (copy-sequence (if (eq t (symbol-value (nth 1 desc))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
962 ;; choices |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
963 ;; (symbol-value (nth 1 desc))))))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
964 ;; (setq choices (car choices)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
965 ;; (while val |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
966 ;; (setq this (car val)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
967 ;; (cond ((memq this choices) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
968 ;; (setq ret (funcall handler this ret))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
969 ;; ((eq this '+) (setq handler 'cons)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
970 ;; ((eq this '-) (setq handler 'delq)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
971 ;; ((error "`%s' only accepts %s" key choices))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
972 ;; (setq val (cdr val))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
973 ;; (set (nth 1 desc) ret)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
974 ;; (or (memq val choices) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
975 ;; (error "`%s' must be one of `%s'" key choices)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
976 ;; (set (nth 1 desc) (eval (nth 3 desc)))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
977 ;; (setq args (cdr args))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
978 ;; nil)) |
757 | 979 |
980 ;;; sanity-checking arglists | |
981 | |
982 (defun byte-compile-fdefinition (name macro-p) | |
983 (let* ((list (if macro-p | |
984 byte-compile-macro-environment | |
8086
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
985 byte-compile-function-environment)) |
757 | 986 (env (cdr (assq name list)))) |
987 (or env | |
988 (let ((fn name)) | |
989 (while (and (symbolp fn) | |
990 (fboundp fn) | |
991 (or (symbolp (symbol-function fn)) | |
992 (consp (symbol-function fn)) | |
993 (and (not macro-p) | |
1819
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
994 (byte-code-function-p (symbol-function fn))))) |
757 | 995 (setq fn (symbol-function fn))) |
1819
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
996 (if (and (not macro-p) (byte-code-function-p fn)) |
757 | 997 fn |
998 (and (consp fn) | |
999 (if (eq 'macro (car fn)) | |
1000 (cdr fn) | |
1001 (if macro-p | |
1002 nil | |
1003 (if (eq 'autoload (car fn)) | |
1004 nil | |
1005 fn))))))))) | |
1006 | |
1007 (defun byte-compile-arglist-signature (arglist) | |
1008 (let ((args 0) | |
1009 opts | |
1010 restp) | |
1011 (while arglist | |
1012 (cond ((eq (car arglist) '&optional) | |
1013 (or opts (setq opts 0))) | |
1014 ((eq (car arglist) '&rest) | |
1015 (if (cdr arglist) | |
1016 (setq restp t | |
1017 arglist nil))) | |
1018 (t | |
1019 (if opts | |
1020 (setq opts (1+ opts)) | |
1021 (setq args (1+ args))))) | |
1022 (setq arglist (cdr arglist))) | |
1023 (cons args (if restp nil (if opts (+ args opts) args))))) | |
1024 | |
1025 | |
1026 (defun byte-compile-arglist-signatures-congruent-p (old new) | |
1027 (not (or | |
1028 (> (car new) (car old)) ; requires more args now | |
14040 | 1029 (and (null (cdr old)) ; took rest-args, doesn't any more |
757 | 1030 (cdr new)) |
1031 (and (cdr new) (cdr old) ; can't take as many args now | |
1032 (< (cdr new) (cdr old))) | |
1033 ))) | |
1034 | |
1035 (defun byte-compile-arglist-signature-string (signature) | |
1036 (cond ((null (cdr signature)) | |
1037 (format "%d+" (car signature))) | |
1038 ((= (car signature) (cdr signature)) | |
1039 (format "%d" (car signature))) | |
1040 (t (format "%d-%d" (car signature) (cdr signature))))) | |
1041 | |
1042 | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1043 ;; Warn if the form is calling a function with the wrong number of arguments. |
757 | 1044 (defun byte-compile-callargs-warn (form) |
1045 (let* ((def (or (byte-compile-fdefinition (car form) nil) | |
1046 (byte-compile-fdefinition (car form) t))) | |
29239
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1047 (sig (if def |
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1048 (byte-compile-arglist-signature |
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1049 (if (eq 'lambda (car-safe def)) |
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1050 (nth 1 def) |
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1051 (if (byte-code-function-p def) |
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1052 (aref def 0) |
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1053 '(&rest def)))) |
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1054 (if (and (fboundp (car form)) |
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1055 (subrp (symbol-function (car form)))) |
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1056 (subr-arity (symbol-function (car form)))))) |
757 | 1057 (ncall (length (cdr form)))) |
29239
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1058 ;; Check many or unevalled from subr-arity. |
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1059 (if (and (cdr-safe sig) |
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1060 (not (numberp (cdr sig)))) |
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1061 (setcdr sig nil)) |
757 | 1062 (if sig |
1063 (if (or (< ncall (car sig)) | |
1064 (and (cdr sig) (> ncall (cdr sig)))) | |
1065 (byte-compile-warn | |
1066 "%s called with %d argument%s, but %s %s" | |
1067 (car form) ncall | |
1068 (if (= 1 ncall) "" "s") | |
1069 (if (< ncall (car sig)) | |
1070 "requires" | |
1071 "accepts only") | |
1072 (byte-compile-arglist-signature-string sig))) | |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1073 (or (and (fboundp (car form)) ; might be a subr or autoload. |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1074 (not (get (car form) 'byte-compile-noruntime))) |
26922
6fdf1f6c23a0
(byte-compile-bound-variables): Doc fix.
Dave Love <fx@gnu.org>
parents:
25636
diff
changeset
|
1075 (eq (car form) byte-compile-current-form) ; ## this doesn't work |
6fdf1f6c23a0
(byte-compile-bound-variables): Doc fix.
Dave Love <fx@gnu.org>
parents:
25636
diff
changeset
|
1076 ; with recursion. |
6fdf1f6c23a0
(byte-compile-bound-variables): Doc fix.
Dave Love <fx@gnu.org>
parents:
25636
diff
changeset
|
1077 ;; It's a currently-undefined function. |
6fdf1f6c23a0
(byte-compile-bound-variables): Doc fix.
Dave Love <fx@gnu.org>
parents:
25636
diff
changeset
|
1078 ;; Remember number of args in call. |
757 | 1079 (let ((cons (assq (car form) byte-compile-unresolved-functions)) |
1080 (n (length (cdr form)))) | |
1081 (if cons | |
1082 (or (memq n (cdr cons)) | |
1083 (setcdr cons (cons n (cdr cons)))) | |
1084 (setq byte-compile-unresolved-functions | |
1085 (cons (list (car form) n) | |
1086 byte-compile-unresolved-functions)))))))) | |
1087 | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1088 ;; Warn if the function or macro is being redefined with a different |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1089 ;; number of arguments. |
757 | 1090 (defun byte-compile-arglist-warn (form macrop) |
1091 (let ((old (byte-compile-fdefinition (nth 1 form) macrop))) | |
1092 (if old | |
1093 (let ((sig1 (byte-compile-arglist-signature | |
1094 (if (eq 'lambda (car-safe old)) | |
1095 (nth 1 old) | |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1096 (if (byte-code-function-p old) |
8086
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
1097 (aref old 0) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
1098 '(&rest def))))) |
757 | 1099 (sig2 (byte-compile-arglist-signature (nth 2 form)))) |
1100 (or (byte-compile-arglist-signatures-congruent-p sig1 sig2) | |
1101 (byte-compile-warn "%s %s used to take %s %s, now takes %s" | |
1102 (if (eq (car form) 'defun) "function" "macro") | |
1103 (nth 1 form) | |
1104 (byte-compile-arglist-signature-string sig1) | |
1105 (if (equal sig1 '(1 . 1)) "argument" "arguments") | |
1106 (byte-compile-arglist-signature-string sig2)))) | |
1107 ;; This is the first definition. See if previous calls are compatible. | |
1108 (let ((calls (assq (nth 1 form) byte-compile-unresolved-functions)) | |
1109 nums sig min max) | |
1110 (if calls | |
1111 (progn | |
1112 (setq sig (byte-compile-arglist-signature (nth 2 form)) | |
1113 nums (sort (copy-sequence (cdr calls)) (function <)) | |
1114 min (car nums) | |
1115 max (car (nreverse nums))) | |
1116 (if (or (< min (car sig)) | |
1117 (and (cdr sig) (> max (cdr sig)))) | |
1118 (byte-compile-warn | |
1119 "%s being defined to take %s%s, but was previously called with %s" | |
1120 (nth 1 form) | |
1121 (byte-compile-arglist-signature-string sig) | |
1122 (if (equal sig '(1 . 1)) " arg" " args") | |
1123 (byte-compile-arglist-signature-string (cons min max)))) | |
1124 | |
1125 (setq byte-compile-unresolved-functions | |
1126 (delq calls byte-compile-unresolved-functions))))) | |
1127 ))) | |
1128 | |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1129 (defun byte-compile-print-syms (str1 strn syms) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1130 (cond |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1131 ((cdr syms) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1132 (let* ((str strn) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1133 (L (length str)) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1134 s) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1135 (while syms |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1136 (setq s (symbol-name (pop syms)) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1137 L (+ L (length s) 2)) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1138 (if (< L (1- fill-column)) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1139 (setq str (concat str " " s (and syms ","))) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1140 (setq str (concat str "\n " s (and syms ",")) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1141 L (+ (length s) 4)))) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1142 (byte-compile-warn "%s" str))) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1143 (syms |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1144 (byte-compile-warn str1 (car syms))))) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1145 |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1146 ;; If we have compiled any calls to functions which are not known to be |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1147 ;; defined, issue a warning enumerating them. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1148 ;; `unresolved' in the list `byte-compile-warnings' disables this. |
757 | 1149 (defun byte-compile-warn-about-unresolved-functions () |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1150 (when (memq 'unresolved byte-compile-warnings) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1151 (let ((byte-compile-current-form "the end of the data") |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1152 (noruntime nil) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1153 (unresolved nil)) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1154 ;; Separate the functions that will not be available at runtime |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1155 ;; from the truly unresolved ones. |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1156 (dolist (f byte-compile-unresolved-functions) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1157 (setq f (car f)) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1158 (if (fboundp f) (push f noruntime) (push f unresolved))) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1159 ;; Complain about the no-run-time functions |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1160 (byte-compile-print-syms |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1161 "The function `%s' might not be defined at runtime." |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1162 "The following functions might not be defined at runtime:" |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1163 noruntime) |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1164 ;; Complain about the unresolved functions |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1165 (byte-compile-print-syms |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1166 "The function `%s' is not known to be defined." |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1167 "The following functions are not known to be defined:" |
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1168 unresolved))) |
757 | 1169 nil) |
1170 | |
1171 | |
27824 | 1172 (defsubst byte-compile-const-symbol-p (symbol) |
1173 (or (memq symbol '(nil t)) | |
1174 (keywordp symbol))) | |
1175 | |
757 | 1176 (defmacro byte-compile-constp (form) |
28402 | 1177 "Return non-nil if FORM is a constant." |
27824 | 1178 `(cond ((consp ,form) (eq (car ,form) 'quote)) |
1179 ((not (symbolp ,form))) | |
1180 ((byte-compile-const-symbol-p ,form)))) | |
757 | 1181 |
1182 (defmacro byte-compile-close-variables (&rest body) | |
1183 (cons 'let | |
1184 (cons '(;; | |
1185 ;; Close over these variables to encapsulate the | |
1186 ;; compilation state | |
1187 ;; | |
1188 (byte-compile-macro-environment | |
1189 ;; Copy it because the compiler may patch into the | |
1190 ;; macroenvironment. | |
1191 (copy-alist byte-compile-initial-macro-environment)) | |
1192 (byte-compile-function-environment nil) | |
1193 (byte-compile-bound-variables nil) | |
1194 (byte-compile-free-references nil) | |
1195 (byte-compile-free-assignments nil) | |
1196 ;; | |
1197 ;; Close over these variables so that `byte-compiler-options' | |
1198 ;; can change them on a per-file basis. | |
1199 ;; | |
1200 (byte-compile-verbose byte-compile-verbose) | |
1201 (byte-optimize byte-optimize) | |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1202 (byte-compile-compatibility byte-compile-compatibility) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1203 (byte-compile-dynamic byte-compile-dynamic) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1204 (byte-compile-dynamic-docstrings |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1205 byte-compile-dynamic-docstrings) |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1206 ;; (byte-compile-generate-emacs19-bytecodes |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1207 ;; byte-compile-generate-emacs19-bytecodes) |
757 | 1208 (byte-compile-warnings (if (eq byte-compile-warnings t) |
1209 byte-compile-warning-types | |
1210 byte-compile-warnings)) | |
1211 ) | |
1212 body))) | |
1213 | |
11323
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
1214 (defvar byte-compile-warnings-point-max nil) |
757 | 1215 (defmacro displaying-byte-compile-warnings (&rest body) |
1216 (list 'let | |
11323
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
1217 '((byte-compile-warnings-point-max byte-compile-warnings-point-max)) |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
1218 ;; Log the file name. |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
1219 '(byte-compile-log-file) |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
1220 ;; Record how much is logged now. |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
1221 ;; We will display the log buffer if anything more is logged |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
1222 ;; before the end of BODY. |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
1223 '(or byte-compile-warnings-point-max |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
1224 (save-excursion |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
1225 (set-buffer (get-buffer-create "*Compile-Log*")) |
5f75d3e225c1
(byte-compile-log-file): New function.
Richard M. Stallman <rms@gnu.org>
parents:
11253
diff
changeset
|
1226 (setq byte-compile-warnings-point-max (point-max)))) |
922 | 1227 (list 'unwind-protect |
1228 (list 'condition-case 'error-info | |
1229 (cons 'progn body) | |
1230 '(error | |
1231 (byte-compile-report-error error-info))) | |
757 | 1232 '(save-excursion |
1233 ;; If there were compilation warnings, display them. | |
1234 (set-buffer "*Compile-Log*") | |
1235 (if (= byte-compile-warnings-point-max (point-max)) | |
1236 nil | |
1237 (select-window | |
1238 (prog1 (selected-window) | |
1239 (select-window (display-buffer (current-buffer))) | |
1240 (goto-char byte-compile-warnings-point-max) | |
20779 | 1241 (beginning-of-line) |
1242 (forward-line -1) | |
19981
1d135b4edfcb
(displaying-byte-compile-warnings): Show
Karl Heuer <kwzh@gnu.org>
parents:
19637
diff
changeset
|
1243 (recenter 0)))))))) |
757 | 1244 |
1245 | |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
1246 ;;;###autoload |
13338
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1247 (defun byte-force-recompile (directory) |
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1248 "Recompile every `.el' file in DIRECTORY that already has a `.elc' file. |
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1249 Files in subdirectories of DIRECTORY are processed also." |
13474
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
1250 (interactive "DByte force recompile (directory): ") |
13338
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1251 (byte-recompile-directory directory nil t)) |
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1252 |
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1253 ;;;###autoload |
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1254 (defun byte-recompile-directory (directory &optional arg force) |
757 | 1255 "Recompile every `.el' file in DIRECTORY that needs recompilation. |
1256 This is if a `.elc' file exists but is older than the `.el' file. | |
4316
667b32d2c02c
(byte-recompile-directory): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
4129
diff
changeset
|
1257 Files in subdirectories of DIRECTORY are processed also. |
757 | 1258 |
1259 If the `.elc' file does not exist, normally the `.el' file is *not* compiled. | |
1260 But a prefix argument (optional second arg) means ask user, | |
958 | 1261 for each such `.el' file, whether to compile it. Prefix argument 0 means |
4316
667b32d2c02c
(byte-recompile-directory): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
4129
diff
changeset
|
1262 don't ask and compile the file anyway. |
667b32d2c02c
(byte-recompile-directory): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
4129
diff
changeset
|
1263 |
13338
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1264 A nonzero prefix argument also means ask about each subdirectory. |
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1265 |
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1266 If the third argument FORCE is non-nil, |
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1267 recompile every `.el' file that already has a `.elc' file." |
757 | 1268 (interactive "DByte recompile directory: \nP") |
2735
6489c9da34b9
(byte-recompile-directory): If ARG is non-nil, set it to its prefix
Roland McGrath <roland@gnu.org>
parents:
2626
diff
changeset
|
1269 (if arg |
6489c9da34b9
(byte-recompile-directory): If ARG is non-nil, set it to its prefix
Roland McGrath <roland@gnu.org>
parents:
2626
diff
changeset
|
1270 (setq arg (prefix-numeric-value arg))) |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
1271 (if noninteractive |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
1272 nil |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
1273 (save-some-buffers) |
11590
97a90e900ce7
(byte-recompile-directory): Use force-mode-line-update.
Karl Heuer <kwzh@gnu.org>
parents:
11432
diff
changeset
|
1274 (force-mode-line-update)) |
958 | 1275 (let ((directories (list (expand-file-name directory))) |
1276 (file-count 0) | |
1277 (dir-count 0) | |
1278 last-dir) | |
1279 (displaying-byte-compile-warnings | |
1280 (while directories | |
1281 (setq directory (car directories)) | |
23486
427877c8fe78
(byte-recompile-directory):
Richard M. Stallman <rms@gnu.org>
parents:
23342
diff
changeset
|
1282 (message "Checking %s..." directory) |
958 | 1283 (let ((files (directory-files directory)) |
1284 source dest) | |
1285 (while files | |
1286 (setq source (expand-file-name (car files) directory)) | |
1287 (if (and (not (member (car files) '("." ".." "RCS" "CVS"))) | |
5283
f48e54cb9b01
(byte-compile-dest-file): If FILENAME is not recognized, append .elc to it.
Richard M. Stallman <rms@gnu.org>
parents:
4556
diff
changeset
|
1288 (file-directory-p source) |
f48e54cb9b01
(byte-compile-dest-file): If FILENAME is not recognized, append .elc to it.
Richard M. Stallman <rms@gnu.org>
parents:
4556
diff
changeset
|
1289 (not (file-symlink-p source))) |
13338
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1290 ;; This file is a subdirectory. Handle them differently. |
23486
427877c8fe78
(byte-recompile-directory):
Richard M. Stallman <rms@gnu.org>
parents:
23342
diff
changeset
|
1291 (when (or (null arg) |
427877c8fe78
(byte-recompile-directory):
Richard M. Stallman <rms@gnu.org>
parents:
23342
diff
changeset
|
1292 (eq 0 arg) |
427877c8fe78
(byte-recompile-directory):
Richard M. Stallman <rms@gnu.org>
parents:
23342
diff
changeset
|
1293 (y-or-n-p (concat "Check " source "? "))) |
427877c8fe78
(byte-recompile-directory):
Richard M. Stallman <rms@gnu.org>
parents:
23342
diff
changeset
|
1294 (setq directories |
427877c8fe78
(byte-recompile-directory):
Richard M. Stallman <rms@gnu.org>
parents:
23342
diff
changeset
|
1295 (nconc directories (list source)))) |
13338
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1296 ;; It is an ordinary file. Decide whether to compile it. |
958 | 1297 (if (and (string-match emacs-lisp-file-regexp source) |
1298 (not (auto-save-file-name-p source)) | |
1299 (setq dest (byte-compile-dest-file source)) | |
1300 (if (file-exists-p dest) | |
13338
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1301 ;; File was already compiled. |
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1302 (or force (file-newer-than-file-p source dest)) |
0f082123d484
(byte-recompile-directory): New arg FORCE.
Richard M. Stallman <rms@gnu.org>
parents:
13138
diff
changeset
|
1303 ;; No compiled file exists yet. |
958 | 1304 (and arg |
2735
6489c9da34b9
(byte-recompile-directory): If ARG is non-nil, set it to its prefix
Roland McGrath <roland@gnu.org>
parents:
2626
diff
changeset
|
1305 (or (eq 0 arg) |
958 | 1306 (y-or-n-p (concat "Compile " source "? ")))))) |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
1307 (progn (if (and noninteractive (not byte-compile-verbose)) |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
1308 (message "Compiling %s..." source)) |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
1309 (byte-compile-file source) |
4411
cde0e3c3b642
(byte-recompile-directory): At end of compiling a file,
Richard M. Stallman <rms@gnu.org>
parents:
4316
diff
changeset
|
1310 (or noninteractive |
cde0e3c3b642
(byte-recompile-directory): At end of compiling a file,
Richard M. Stallman <rms@gnu.org>
parents:
4316
diff
changeset
|
1311 (message "Checking %s..." directory)) |
958 | 1312 (setq file-count (1+ file-count)) |
1313 (if (not (eq last-dir directory)) | |
1314 (setq last-dir directory | |
1315 dir-count (1+ dir-count))) | |
1316 ))) | |
1317 (setq files (cdr files)))) | |
1318 (setq directories (cdr directories)))) | |
1319 (message "Done (Total of %d file%s compiled%s)" | |
1320 file-count (if (= file-count 1) "" "s") | |
1321 (if (> dir-count 1) (format " in %d directories" dir-count) "")))) | |
757 | 1322 |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
1323 ;;;###autoload |
757 | 1324 (defun byte-compile-file (filename &optional load) |
1325 "Compile a file of Lisp code named FILENAME into a file of byte code. | |
1326 The output file's name is made by appending `c' to the end of FILENAME. | |
18391
1ff0bfd40508
(byte-compile-file): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
18266
diff
changeset
|
1327 With prefix arg (noninteractively: 2nd arg), load the file after compiling. |
1ff0bfd40508
(byte-compile-file): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
18266
diff
changeset
|
1328 The value is t if there were no errors, nil if errors." |
757 | 1329 ;; (interactive "fByte compile file: \nP") |
1330 (interactive | |
1331 (let ((file buffer-file-name) | |
1332 (file-name nil) | |
1333 (file-dir nil)) | |
1334 (and file | |
1335 (eq (cdr (assq 'major-mode (buffer-local-variables))) | |
1336 'emacs-lisp-mode) | |
1337 (setq file-name (file-name-nondirectory file) | |
1338 file-dir (file-name-directory file))) | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1339 (list (read-file-name (if current-prefix-arg |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1340 "Byte compile and load file: " |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1341 "Byte compile file: ") |
3718
37a8a7489fc5
(byte-compile-file): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
3653
diff
changeset
|
1342 file-dir file-name nil) |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
1343 current-prefix-arg))) |
757 | 1344 ;; Expand now so we get the current buffer's defaults |
1345 (setq filename (expand-file-name filename)) | |
1346 | |
1347 ;; If we're compiling a file that's in a buffer and is modified, offer | |
1348 ;; to save it first. | |
1349 (or noninteractive | |
1350 (let ((b (get-file-buffer (expand-file-name filename)))) | |
1351 (if (and b (buffer-modified-p b) | |
28295
8082575fec24
(byte-compile-warning-types, byte-compile-warnings): New warning `noruntime'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
27824
diff
changeset
|
1352 (y-or-n-p (format "Save buffer %s first? " (buffer-name b)))) |
757 | 1353 (save-excursion (set-buffer b) (save-buffer))))) |
1354 | |
1355 (if byte-compile-verbose | |
1356 (message "Compiling %s..." filename)) | |
6554
5f8effa94d20
(byte-compile-file): Use whole file name for errors.
Richard M. Stallman <rms@gnu.org>
parents:
6293
diff
changeset
|
1357 (let ((byte-compile-current-file filename) |
32765
f11890c9f7df
(byte-compile-file): Bind `byte-compile-last-logged-file' to nil.
Miles Bader <miles@gnu.org>
parents:
32763
diff
changeset
|
1358 (byte-compile-last-logged-file nil) |
22689
2d69ba7d76f4
(byte-compile-file): Bind set-auto-coding-for-load to t.
Richard M. Stallman <rms@gnu.org>
parents:
22578
diff
changeset
|
1359 (set-auto-coding-for-load t) |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1360 target-file input-buffer output-buffer |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1361 byte-compile-dest-file) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1362 (setq target-file (byte-compile-dest-file filename)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1363 (setq byte-compile-dest-file target-file) |
757 | 1364 (save-excursion |
1129 | 1365 (setq input-buffer (get-buffer-create " *Compiler Input*")) |
1366 (set-buffer input-buffer) | |
757 | 1367 (erase-buffer) |
24576
d11ae896247c
(byte-compile-file): Clear buffer-file-coding-system. If the coding
Richard M. Stallman <rms@gnu.org>
parents:
24025
diff
changeset
|
1368 (setq buffer-file-coding-system nil) |
21725
375190ad5062
(byte-compile-file): Always read the file in multibyte mode
Richard M. Stallman <rms@gnu.org>
parents:
21542
diff
changeset
|
1369 ;; Always compile an Emacs Lisp file as multibyte |
26922
6fdf1f6c23a0
(byte-compile-bound-variables): Doc fix.
Dave Love <fx@gnu.org>
parents:
25636
diff
changeset
|
1370 ;; unless the file itself forces unibyte with -*-coding: raw-text;-*- |
21725
375190ad5062
(byte-compile-file): Always read the file in multibyte mode
Richard M. Stallman <rms@gnu.org>
parents:
21542
diff
changeset
|
1371 (set-buffer-multibyte t) |
757 | 1372 (insert-file-contents filename) |
24576
d11ae896247c
(byte-compile-file): Clear buffer-file-coding-system. If the coding
Richard M. Stallman <rms@gnu.org>
parents:
24025
diff
changeset
|
1373 ;; Mimic the way after-insert-file-set-buffer-file-coding-system |
d11ae896247c
(byte-compile-file): Clear buffer-file-coding-system. If the coding
Richard M. Stallman <rms@gnu.org>
parents:
24025
diff
changeset
|
1374 ;; can make the buffer unibyte when visiting this file. |
d11ae896247c
(byte-compile-file): Clear buffer-file-coding-system. If the coding
Richard M. Stallman <rms@gnu.org>
parents:
24025
diff
changeset
|
1375 (when (or (eq last-coding-system-used 'no-conversion) |
d11ae896247c
(byte-compile-file): Clear buffer-file-coding-system. If the coding
Richard M. Stallman <rms@gnu.org>
parents:
24025
diff
changeset
|
1376 (eq (coding-system-type last-coding-system-used) 5)) |
d11ae896247c
(byte-compile-file): Clear buffer-file-coding-system. If the coding
Richard M. Stallman <rms@gnu.org>
parents:
24025
diff
changeset
|
1377 ;; For coding systems no-conversion and raw-text..., |
d11ae896247c
(byte-compile-file): Clear buffer-file-coding-system. If the coding
Richard M. Stallman <rms@gnu.org>
parents:
24025
diff
changeset
|
1378 ;; edit the buffer as unibyte. |
d11ae896247c
(byte-compile-file): Clear buffer-file-coding-system. If the coding
Richard M. Stallman <rms@gnu.org>
parents:
24025
diff
changeset
|
1379 (set-buffer-multibyte nil)) |
757 | 1380 ;; Run hooks including the uncompression hook. |
1381 ;; If they change the file name, then change it for the output also. | |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1382 (let ((buffer-file-name filename) |
10836
3c9b3505feef
(byte-compile-file): Bind default-major-mode to avoid randomness.
Richard M. Stallman <rms@gnu.org>
parents:
10696
diff
changeset
|
1383 (default-major-mode 'emacs-lisp-mode) |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1384 (enable-local-eval nil)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1385 (normal-mode) |
16788
ffb387a3d054
(byte-compile-file): Set default-directory in compiler input buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16666
diff
changeset
|
1386 (setq filename buffer-file-name)) |
ffb387a3d054
(byte-compile-file): Set default-directory in compiler input buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16666
diff
changeset
|
1387 ;; Set the default directory, in case an eval-when-compile uses it. |
ffb387a3d054
(byte-compile-file): Set default-directory in compiler input buffer.
Richard M. Stallman <rms@gnu.org>
parents:
16666
diff
changeset
|
1388 (setq default-directory (file-name-directory filename))) |
1129 | 1389 (setq byte-compiler-error-flag nil) |
1390 ;; It is important that input-buffer not be current at this call, | |
1391 ;; so that the value of point set in input-buffer | |
1392 ;; within byte-compile-from-buffer lingers in that buffer. | |
6193
74fcc9007c39
(byte-compile-insert-header): Take a filename argument.
Richard M. Stallman <rms@gnu.org>
parents:
6081
diff
changeset
|
1393 (setq output-buffer (byte-compile-from-buffer input-buffer filename)) |
2855
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1394 (if byte-compiler-error-flag |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1395 nil |
10696
5cf8a7a41664
(byte-compile-file): Add "done" message.
Karl Heuer <kwzh@gnu.org>
parents:
10687
diff
changeset
|
1396 (if byte-compile-verbose |
5cf8a7a41664
(byte-compile-file): Add "done" message.
Karl Heuer <kwzh@gnu.org>
parents:
10687
diff
changeset
|
1397 (message "Compiling %s...done" filename)) |
2855
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1398 (kill-buffer input-buffer) |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1399 (save-excursion |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1400 (set-buffer output-buffer) |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1401 (goto-char (point-max)) |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1402 (insert "\n") ; aaah, unix. |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1403 (let ((vms-stmlf-recfm t)) |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1404 (if (file-writable-p target-file) |
17002
07144e5d208a
(byte-compile-file): Write a compiled file without
Karl Heuer <kwzh@gnu.org>
parents:
16788
diff
changeset
|
1405 ;; We must disable any code conversion here. |
17077
8f8c3d05b158
(byte-compile-file): Bind coding-system-for-write
Kenichi Handa <handa@m17n.org>
parents:
17002
diff
changeset
|
1406 (let ((coding-system-for-write 'no-conversion)) |
9781
ae6fed248fb9
(byte-compile-file): Treat windows-nt like ms-dos.
Richard M. Stallman <rms@gnu.org>
parents:
9414
diff
changeset
|
1407 (if (or (eq system-type 'ms-dos) (eq system-type 'windows-nt)) |
5454
751ea2cff517
[ms-dos] (byte-compile-file): Save as binary.
Richard M. Stallman <rms@gnu.org>
parents:
5431
diff
changeset
|
1408 (setq buffer-file-type t)) |
2855
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1409 (write-region 1 (point-max) target-file)) |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1410 ;; This is just to give a better error message than |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1411 ;; write-region |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1412 (signal 'file-error |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1413 (list "Opening output file" |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1414 (if (file-exists-p target-file) |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1415 "cannot overwrite file" |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1416 "directory not writable or nonexistent") |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1417 target-file)))) |
2855
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1418 (kill-buffer (current-buffer))) |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1419 (if (and byte-compile-generate-call-tree |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1420 (or (eq t byte-compile-generate-call-tree) |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1421 (y-or-n-p (format "Report call tree for %s? " filename)))) |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1422 (save-excursion |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1423 (display-call-tree filename))) |
b858b91dff34
(byte-compile-file): Don't write output if error.
Richard M. Stallman <rms@gnu.org>
parents:
2853
diff
changeset
|
1424 (if load |
6043
1b850ad30158
(byte-compile-file): Return nil on failure.
Karl Heuer <kwzh@gnu.org>
parents:
5562
diff
changeset
|
1425 (load target-file)) |
1b850ad30158
(byte-compile-file): Return nil on failure.
Karl Heuer <kwzh@gnu.org>
parents:
5562
diff
changeset
|
1426 t))) |
757 | 1427 |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1428 ;;(defun byte-compile-and-load-file (&optional filename) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1429 ;; "Compile a file of Lisp code named FILENAME into a file of byte code, |
28402 | 1430 ;;and then load it. The output file's name is made by appending \"c\" to |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1431 ;;the end of FILENAME." |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1432 ;; (interactive) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1433 ;; (if filename ; I don't get it, (interactive-p) doesn't always work |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1434 ;; (byte-compile-file filename t) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1435 ;; (let ((current-prefix-arg '(4))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1436 ;; (call-interactively 'byte-compile-file)))) |
757 | 1437 |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1438 ;;(defun byte-compile-buffer (&optional buffer) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1439 ;; "Byte-compile and evaluate contents of BUFFER (default: the current buffer)." |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1440 ;; (interactive "bByte compile buffer: ") |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1441 ;; (setq buffer (if buffer (get-buffer buffer) (current-buffer))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1442 ;; (message "Compiling %s..." (buffer-name buffer)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1443 ;; (let* ((filename (or (buffer-file-name buffer) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1444 ;; (concat "#<buffer " (buffer-name buffer) ">"))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1445 ;; (byte-compile-current-file buffer)) |
6193
74fcc9007c39
(byte-compile-insert-header): Take a filename argument.
Richard M. Stallman <rms@gnu.org>
parents:
6081
diff
changeset
|
1446 ;; (byte-compile-from-buffer buffer nil)) |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1447 ;; (message "Compiling %s...done" (buffer-name buffer)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1448 ;; t) |
757 | 1449 |
1450 ;;; compiling a single function | |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
1451 ;;;###autoload |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1452 (defun compile-defun (&optional arg) |
757 | 1453 "Compile and evaluate the current top-level form. |
1454 Print the result in the minibuffer. | |
1455 With argument, insert value in current buffer after the form." | |
1456 (interactive "P") | |
1457 (save-excursion | |
1458 (end-of-defun) | |
1459 (beginning-of-defun) | |
1460 (let* ((byte-compile-current-file nil) | |
1461 (byte-compile-last-warned-form 'nothing) | |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
1462 (value (eval (displaying-byte-compile-warnings |
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
1463 (byte-compile-sexp (read (current-buffer))))))) |
757 | 1464 (cond (arg |
1465 (message "Compiling from buffer... done.") | |
1466 (prin1 value (current-buffer)) | |
1467 (insert "\n")) | |
1468 ((message "%s" (prin1-to-string value))))))) | |
1469 | |
1470 | |
6193
74fcc9007c39
(byte-compile-insert-header): Take a filename argument.
Richard M. Stallman <rms@gnu.org>
parents:
6081
diff
changeset
|
1471 (defun byte-compile-from-buffer (inbuffer &optional filename) |
74fcc9007c39
(byte-compile-insert-header): Take a filename argument.
Richard M. Stallman <rms@gnu.org>
parents:
6081
diff
changeset
|
1472 ;; Filename is used for the loading-into-Emacs-18 error message. |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1473 (let (outbuffer |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1474 ;; Prevent truncation of flonums and lists as we read and print them |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1475 (float-output-format nil) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1476 (case-fold-search nil) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1477 (print-length nil) |
13138
2a0ef3a2ccc3
(byte-compile-from-buffer): Bind print-level.
Richard M. Stallman <rms@gnu.org>
parents:
12928
diff
changeset
|
1478 (print-level nil) |
20818
732ffd28a863
(byte-compile-from-buffer): Bind edebug-all-defs and edebug-all-forms to nil.
Richard M. Stallman <rms@gnu.org>
parents:
20779
diff
changeset
|
1479 ;; Prevent edebug from interfering when we compile |
732ffd28a863
(byte-compile-from-buffer): Bind edebug-all-defs and edebug-all-forms to nil.
Richard M. Stallman <rms@gnu.org>
parents:
20779
diff
changeset
|
1480 ;; and put the output into a file. |
732ffd28a863
(byte-compile-from-buffer): Bind edebug-all-defs and edebug-all-forms to nil.
Richard M. Stallman <rms@gnu.org>
parents:
20779
diff
changeset
|
1481 (edebug-all-defs nil) |
732ffd28a863
(byte-compile-from-buffer): Bind edebug-all-defs and edebug-all-forms to nil.
Richard M. Stallman <rms@gnu.org>
parents:
20779
diff
changeset
|
1482 (edebug-all-forms nil) |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1483 ;; Simulate entry to byte-compile-top-level |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1484 (byte-compile-constants nil) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1485 (byte-compile-variables nil) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1486 (byte-compile-tag-number 0) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1487 (byte-compile-depth 0) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1488 (byte-compile-maxdepth 0) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1489 (byte-compile-output nil) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1490 ;; #### This is bound in b-c-close-variables. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1491 ;; (byte-compile-warnings (if (eq byte-compile-warnings t) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1492 ;; byte-compile-warning-types |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1493 ;; byte-compile-warnings)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1494 ) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1495 (byte-compile-close-variables |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1496 (save-excursion |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1497 (setq outbuffer |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1498 (set-buffer (get-buffer-create " *Compiler Output*"))) |
22910
5571f38cc118
(byte-compile-from-buffer): Make the output buffer multibyte.
Richard M. Stallman <rms@gnu.org>
parents:
22689
diff
changeset
|
1499 (set-buffer-multibyte t) |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1500 (erase-buffer) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1501 ;; (emacs-lisp-mode) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1502 (setq case-fold-search nil) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1503 ;; This is a kludge. Some operating systems (OS/2, DOS) need to |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1504 ;; write files containing binary information specially. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1505 ;; Under most circumstances, such files will be in binary |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1506 ;; overwrite mode, so those OS's use that flag to guess how |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1507 ;; they should write their data. Advise them that .elc files |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1508 ;; need to be written carefully. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1509 (setq overwrite-mode 'overwrite-mode-binary)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1510 (displaying-byte-compile-warnings |
22136
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1511 (and filename (byte-compile-insert-header filename inbuffer outbuffer)) |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1512 (save-excursion |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1513 (set-buffer inbuffer) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1514 (goto-char 1) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1515 |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1516 ;; Compile the forms from the input buffer. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1517 (while (progn |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1518 (while (progn (skip-chars-forward " \t\n\^l") |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1519 (looking-at ";")) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1520 (forward-line 1)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1521 (not (eobp))) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1522 (byte-compile-file-form (read inbuffer))) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1523 |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1524 ;; Compile pending forms at end of file. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1525 (byte-compile-flush-pending) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1526 (byte-compile-warn-about-unresolved-functions) |
14040 | 1527 ;; Should we always do this? When calling multiple files, it |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1528 ;; would be useful to delay this warning until all have |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1529 ;; been compiled. |
22136
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1530 (setq byte-compile-unresolved-functions nil)) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1531 ;; Fix up the header at the front of the output |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1532 ;; if the buffer contains multibyte characters. |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1533 (and filename (byte-compile-fix-header filename inbuffer outbuffer)))) |
8446
0199ece40d91
(byte-compile-protect-from-advice): Macro deleted.
Richard M. Stallman <rms@gnu.org>
parents:
8115
diff
changeset
|
1534 outbuffer)) |
757 | 1535 |
22136
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1536 (defun byte-compile-fix-header (filename inbuffer outbuffer) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1537 (save-excursion |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1538 (set-buffer outbuffer) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1539 ;; See if the buffer has any multibyte characters. |
30624
277e6060b376
(byte-compile-fix-header): Fix the way of checking the existence of
Kenichi Handa <handa@m17n.org>
parents:
29352
diff
changeset
|
1540 (when (< (point-max) (position-bytes (point-max))) |
22136
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1541 (when (byte-compile-version-cond byte-compile-compatibility) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1542 (error "Version-18 compatibility not valid with multibyte characters")) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1543 (goto-char (point-min)) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1544 ;; Find the comment that describes the version test. |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1545 (search-forward "\n;;; This file") |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1546 (beginning-of-line) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1547 (narrow-to-region (point) (point-max)) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1548 ;; Find the line of ballast semicolons. |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1549 (search-forward ";;;;;;;;;;") |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1550 (beginning-of-line) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1551 |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1552 (narrow-to-region (point-min) (point)) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1553 (let ((old-header-end (point)) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1554 delta) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1555 (goto-char (point-min)) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1556 (delete-region (point) (progn (re-search-forward "^(") |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1557 (beginning-of-line) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1558 (point))) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1559 (insert ";;; This file contains multibyte non-ASCII characters\n" |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1560 ";;; and therefore cannot be loaded into Emacs 19.\n") |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1561 ;; Replace "19" or "19.29" with "20", twice. |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1562 (re-search-forward "19\\(\\.[0-9]+\\)") |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1563 (replace-match "20") |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1564 (re-search-forward "19\\(\\.[0-9]+\\)") |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1565 (replace-match "20") |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1566 ;; Now compensate for the change in size, |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1567 ;; to make sure all positions in the file remain valid. |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1568 (setq delta (- (point-max) old-header-end)) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1569 (goto-char (point-max)) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1570 (widen) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1571 (delete-char delta))))) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1572 |
12823
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1573 (defun byte-compile-insert-header (filename inbuffer outbuffer) |
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1574 (set-buffer inbuffer) |
15925
278440a92757
(byte-compile-insert-header): Clean up syntax
Richard M. Stallman <rms@gnu.org>
parents:
14766
diff
changeset
|
1575 (let ((dynamic-docstrings byte-compile-dynamic-docstrings) |
22136
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1576 (dynamic byte-compile-dynamic)) |
12823
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1577 (set-buffer outbuffer) |
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1578 (goto-char 1) |
22047
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1579 ;; The magic number of .elc files is ";ELC", or 0x3B454C43. After |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1580 ;; that is the file-format version number (18, 19 or 20) as a |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1581 ;; byte, followed by some nulls. The primary motivation for doing |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1582 ;; this is to get some binary characters up in the first line of |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1583 ;; the file so that `diff' will simply say "Binary files differ" |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1584 ;; instead of actually doing a diff of two .elc files. An extra |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1585 ;; benefit is that you can add this to /etc/magic: |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1586 |
12823
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1587 ;; 0 string ;ELC GNU Emacs Lisp compiled file, |
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1588 ;; >4 byte x version %d |
22047
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1589 |
12823
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1590 (insert |
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1591 ";ELC" |
22047
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1592 (if (byte-compile-version-cond byte-compile-compatibility) 18 20) |
12823
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1593 "\000\000\000\n" |
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1594 ) |
15925
278440a92757
(byte-compile-insert-header): Clean up syntax
Richard M. Stallman <rms@gnu.org>
parents:
14766
diff
changeset
|
1595 (insert ";;; Compiled by " |
12823
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1596 (or (and (boundp 'user-mail-address) user-mail-address) |
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1597 (concat (user-login-name) "@" (system-name))) |
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1598 " on " |
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1599 (current-time-string) "\n;;; from file " filename "\n") |
15925
278440a92757
(byte-compile-insert-header): Clean up syntax
Richard M. Stallman <rms@gnu.org>
parents:
14766
diff
changeset
|
1600 (insert ";;; in Emacs version " emacs-version "\n") |
15927
9b6ae5c1a0bf
(byte-compile-insert-header):
Richard M. Stallman <rms@gnu.org>
parents:
15926
diff
changeset
|
1601 (insert ";;; with bytecomp version " |
15930
811f16bdff08
(byte-compile-insert-header): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
15927
diff
changeset
|
1602 (progn (string-match "[0-9.]+" byte-compile-version) |
811f16bdff08
(byte-compile-insert-header): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents:
15927
diff
changeset
|
1603 (match-string 0 byte-compile-version)) |
15927
9b6ae5c1a0bf
(byte-compile-insert-header):
Richard M. Stallman <rms@gnu.org>
parents:
15926
diff
changeset
|
1604 "\n;;; " |
12823
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1605 (cond |
15925
278440a92757
(byte-compile-insert-header): Clean up syntax
Richard M. Stallman <rms@gnu.org>
parents:
14766
diff
changeset
|
1606 ((eq byte-optimize 'source) "with source-level optimization only") |
278440a92757
(byte-compile-insert-header): Clean up syntax
Richard M. Stallman <rms@gnu.org>
parents:
14766
diff
changeset
|
1607 ((eq byte-optimize 'byte) "with byte-level optimization only") |
278440a92757
(byte-compile-insert-header): Clean up syntax
Richard M. Stallman <rms@gnu.org>
parents:
14766
diff
changeset
|
1608 (byte-optimize "with all optimizations") |
278440a92757
(byte-compile-insert-header): Clean up syntax
Richard M. Stallman <rms@gnu.org>
parents:
14766
diff
changeset
|
1609 (t "without optimization")) |
12823
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1610 (if (byte-compile-version-cond byte-compile-compatibility) |
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1611 "; compiled with Emacs 18 compatibility.\n" |
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1612 ".\n")) |
15925
278440a92757
(byte-compile-insert-header): Clean up syntax
Richard M. Stallman <rms@gnu.org>
parents:
14766
diff
changeset
|
1613 (if dynamic |
278440a92757
(byte-compile-insert-header): Clean up syntax
Richard M. Stallman <rms@gnu.org>
parents:
14766
diff
changeset
|
1614 (insert ";;; Function definitions are lazy-loaded.\n")) |
22136
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1615 (if (not (byte-compile-version-cond byte-compile-compatibility)) |
22047
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1616 (let (intro-string minimum-version) |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1617 ;; Figure out which Emacs version to require, |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1618 ;; and what comment to use to explain why. |
22136
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1619 ;; Note that this fails to take account of whether |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1620 ;; the buffer contains multibyte characters. We may have to |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1621 ;; compensate at the end in byte-compile-fix-header. |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1622 (if dynamic-docstrings |
22047
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1623 (setq intro-string |
22136
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1624 ";;; This file uses dynamic docstrings, first added in Emacs 19.29.\n" |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1625 minimum-version "19.29") |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1626 (setq intro-string |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1627 ";;; This file uses opcodes which do not exist in Emacs 18.\n" |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1628 minimum-version "19")) |
22047
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1629 ;; Now insert the comment and the error check. |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1630 (insert |
22136
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1631 "\n" |
22047
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1632 intro-string |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1633 ;; Have to check if emacs-version is bound so that this works |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1634 ;; in files loaded early in loadup.el. |
22136
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1635 "(if (and (boundp 'emacs-version)\n" |
22047
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1636 ;; If there is a name at the end of emacs-version, |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1637 ;; don't try to check the version number. |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1638 "\t (< (aref emacs-version (1- (length emacs-version))) ?A)\n" |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1639 "\t (or (and (boundp 'epoch::version) epoch::version)\n" |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1640 (format "\t (string-lessp emacs-version \"%s\")))\n" |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1641 minimum-version) |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1642 " (error \"`" |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1643 ;; prin1-to-string is used to quote backslashes. |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1644 (substring (prin1-to-string (file-name-nondirectory filename)) |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1645 1 -1) |
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1646 (format "' was compiled for Emacs %s or later\"))\n\n" |
22136
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1647 minimum-version) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1648 ;; Insert semicolons as ballast, so that byte-compile-fix-header |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1649 ;; can delete them so as to keep the buffer positions |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1650 ;; constant for the actual compiled code. |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1651 ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n")) |
22047
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1652 ;; Here if we want Emacs 18 compatibility. |
22136
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1653 (when dynamic-docstrings |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1654 (error "Version-18 compatibility doesn't support dynamic doc strings")) |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1655 (when byte-compile-dynamic |
bc8c7f59c064
(byte-compile-insert-header): Do not look for multibyte characters here.
Richard M. Stallman <rms@gnu.org>
parents:
22050
diff
changeset
|
1656 (error "Version-18 compatibility doesn't support dynamic byte code")) |
12823
c1fcd8660aba
(byte-compile-insert-header): Use 19.29, not 19.28.90
Richard M. Stallman <rms@gnu.org>
parents:
12794
diff
changeset
|
1657 (insert "(or (boundp 'current-load-list) (setq current-load-list nil))\n" |
22047
678a1ed22116
(byte-compile-from-buffer):
Richard M. Stallman <rms@gnu.org>
parents:
22015
diff
changeset
|
1658 "\n")))) |
757 | 1659 |
1660 (defun byte-compile-output-file-form (form) | |
1661 ;; writes the given form to the output buffer, being careful of docstrings | |
19637
baaf02a51ba2
(byte-compile-output-file-form): Handle custom-declare-variable.
Richard M. Stallman <rms@gnu.org>
parents:
18960
diff
changeset
|
1662 ;; in defun, defmacro, defvar, defconst, autoload and |
baaf02a51ba2
(byte-compile-output-file-form): Handle custom-declare-variable.
Richard M. Stallman <rms@gnu.org>
parents:
18960
diff
changeset
|
1663 ;; custom-declare-variable because make-docfile is so amazingly stupid. |
2566
4f201a4ab030
(define-function): Changed name back to defalisaases to get things in
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2544
diff
changeset
|
1664 ;; defalias calls are output directly by byte-compile-file-form-defmumble; |
4f201a4ab030
(define-function): Changed name back to defalisaases to get things in
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2544
diff
changeset
|
1665 ;; it does not pay to first build the defalias in defmumble and then parse |
4f201a4ab030
(define-function): Changed name back to defalisaases to get things in
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2544
diff
changeset
|
1666 ;; it here. |
19637
baaf02a51ba2
(byte-compile-output-file-form): Handle custom-declare-variable.
Richard M. Stallman <rms@gnu.org>
parents:
18960
diff
changeset
|
1667 (if (and (memq (car-safe form) '(defun defmacro defvar defconst autoload |
baaf02a51ba2
(byte-compile-output-file-form): Handle custom-declare-variable.
Richard M. Stallman <rms@gnu.org>
parents:
18960
diff
changeset
|
1668 custom-declare-variable)) |
757 | 1669 (stringp (nth 3 form))) |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1670 (byte-compile-output-docform nil nil '("\n(" 3 ")") form nil |
19637
baaf02a51ba2
(byte-compile-output-file-form): Handle custom-declare-variable.
Richard M. Stallman <rms@gnu.org>
parents:
18960
diff
changeset
|
1671 (memq (car form) |
baaf02a51ba2
(byte-compile-output-file-form): Handle custom-declare-variable.
Richard M. Stallman <rms@gnu.org>
parents:
18960
diff
changeset
|
1672 '(autoload custom-declare-variable))) |
757 | 1673 (let ((print-escape-newlines t) |
12552
176c42cc7eeb
(byte-compile-output-file-form): Bind print-length
Karl Heuer <kwzh@gnu.org>
parents:
12511
diff
changeset
|
1674 (print-length nil) |
176c42cc7eeb
(byte-compile-output-file-form): Bind print-length
Karl Heuer <kwzh@gnu.org>
parents:
12511
diff
changeset
|
1675 (print-level nil) |
16159
d4b674c08fe1
(byte-compile-output-file-form): Bind print-quoted and print-gensym to t
Erik Naggum <erik@naggum.no>
parents:
16149
diff
changeset
|
1676 (print-quoted t) |
d4b674c08fe1
(byte-compile-output-file-form): Bind print-quoted and print-gensym to t
Erik Naggum <erik@naggum.no>
parents:
16149
diff
changeset
|
1677 (print-gensym t)) |
757 | 1678 (princ "\n" outbuffer) |
1679 (prin1 form outbuffer) | |
1680 nil))) | |
1681 | |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1682 (defun byte-compile-output-docform (preface name info form specindex quoted) |
12794
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1683 "Print a form with a doc string. INFO is (prefix doc-index postfix). |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1684 If PREFACE and NAME are non-nil, print them too, |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1685 before INFO and the FORM but after the doc string itself. |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1686 If SPECINDEX is non-nil, it is the index in FORM |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1687 of the function bytecode string. In that case, |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1688 we output that argument and the following argument (the constants vector) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1689 together, for lazy loading. |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1690 QUOTED says that we have to put a quote before the |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1691 list that represents a doc string reference. |
19637
baaf02a51ba2
(byte-compile-output-file-form): Handle custom-declare-variable.
Richard M. Stallman <rms@gnu.org>
parents:
18960
diff
changeset
|
1692 `autoload' and `custom-declare-variable' need that." |
12794
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1693 ;; We need to examine byte-compile-dynamic-docstrings |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1694 ;; in the input buffer (now current), not in the output buffer. |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1695 (let ((dynamic-docstrings byte-compile-dynamic-docstrings)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1696 (set-buffer |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1697 (prog1 (current-buffer) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1698 (set-buffer outbuffer) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1699 (let (position) |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1700 |
12794
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1701 ;; Insert the doc string, and make it a comment with #@LENGTH. |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1702 (and (>= (nth 1 info) 0) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1703 dynamic-docstrings |
13791
1feec098c24d
(byte-compile-output-docform): Don't do dynamic doc
Karl Heuer <kwzh@gnu.org>
parents:
13474
diff
changeset
|
1704 (not byte-compile-compatibility) |
12794
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1705 (progn |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1706 ;; Make the doc string start at beginning of line |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1707 ;; for make-docfile's sake. |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1708 (insert "\n") |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1709 (setq position |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1710 (byte-compile-output-as-comment |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1711 (nth (nth 1 info) form) nil)) |
22015
3ace0ce90a3f
(byte-compile-output-docform): Use position-bytes.
Richard M. Stallman <rms@gnu.org>
parents:
21725
diff
changeset
|
1712 (setq position (position-bytes position)) |
12794
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1713 ;; If the doc string starts with * (a user variable), |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1714 ;; negate POSITION. |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1715 (if (and (stringp (nth (nth 1 info) form)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1716 (> (length (nth (nth 1 info) form)) 0) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1717 (eq (aref (nth (nth 1 info) form) 0) ?*)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1718 (setq position (- position))))) |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1719 |
12794
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1720 (if preface |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1721 (progn |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1722 (insert preface) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1723 (prin1 name outbuffer))) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1724 (insert (car info)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1725 (let ((print-escape-newlines t) |
16159
d4b674c08fe1
(byte-compile-output-file-form): Bind print-quoted and print-gensym to t
Erik Naggum <erik@naggum.no>
parents:
16149
diff
changeset
|
1726 (print-quoted t) |
25636
ebc88533212e
(byte-compile-output-docform): Bind print-gensym-alist for compatibility,
Richard M. Stallman <rms@gnu.org>
parents:
25635
diff
changeset
|
1727 ;; For compatibility with code before print-circle, |
ebc88533212e
(byte-compile-output-docform): Bind print-gensym-alist for compatibility,
Richard M. Stallman <rms@gnu.org>
parents:
25635
diff
changeset
|
1728 ;; use a cons cell to say that we want |
ebc88533212e
(byte-compile-output-docform): Bind print-gensym-alist for compatibility,
Richard M. Stallman <rms@gnu.org>
parents:
25635
diff
changeset
|
1729 ;; print-gensym-alist not to be cleared |
ebc88533212e
(byte-compile-output-docform): Bind print-gensym-alist for compatibility,
Richard M. Stallman <rms@gnu.org>
parents:
25635
diff
changeset
|
1730 ;; between calls to print functions. |
ebc88533212e
(byte-compile-output-docform): Bind print-gensym-alist for compatibility,
Richard M. Stallman <rms@gnu.org>
parents:
25635
diff
changeset
|
1731 (print-gensym '(t)) |
ebc88533212e
(byte-compile-output-docform): Bind print-gensym-alist for compatibility,
Richard M. Stallman <rms@gnu.org>
parents:
25635
diff
changeset
|
1732 ;; print-gensym-alist was used before print-circle existed. |
ebc88533212e
(byte-compile-output-docform): Bind print-gensym-alist for compatibility,
Richard M. Stallman <rms@gnu.org>
parents:
25635
diff
changeset
|
1733 print-gensym-alist |
25635
f39d91949fc4
(byte-compile-output-docform): Bind print-continuous-numbering and
Richard M. Stallman <rms@gnu.org>
parents:
24576
diff
changeset
|
1734 (print-continuous-numbering t) |
f39d91949fc4
(byte-compile-output-docform): Bind print-continuous-numbering and
Richard M. Stallman <rms@gnu.org>
parents:
24576
diff
changeset
|
1735 print-number-table |
12794
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1736 (index 0)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1737 (prin1 (car form) outbuffer) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1738 (while (setq form (cdr form)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1739 (setq index (1+ index)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1740 (insert " ") |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1741 (cond ((and (numberp specindex) (= index specindex)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1742 (let ((position |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1743 (byte-compile-output-as-comment |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1744 (cons (car form) (nth 1 form)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1745 t))) |
22015
3ace0ce90a3f
(byte-compile-output-docform): Use position-bytes.
Richard M. Stallman <rms@gnu.org>
parents:
21725
diff
changeset
|
1746 (setq position (position-bytes position)) |
12794
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1747 (princ (format "(#$ . %d) nil" position) outbuffer) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1748 (setq form (cdr form)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1749 (setq index (1+ index)))) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1750 ((= index (nth 1 info)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1751 (if position |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1752 (princ (format (if quoted "'(#$ . %d)" "(#$ . %d)") |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1753 position) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1754 outbuffer) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1755 (let ((print-escape-newlines nil)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1756 (goto-char (prog1 (1+ (point)) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1757 (prin1 (car form) outbuffer))) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1758 (insert "\\\n") |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1759 (goto-char (point-max))))) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1760 (t |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1761 (prin1 (car form) outbuffer))))) |
913a19cf074a
(byte-compile-output-docform): Check
Richard M. Stallman <rms@gnu.org>
parents:
12726
diff
changeset
|
1762 (insert (nth 2 info)))))) |
757 | 1763 nil) |
1764 | |
1765 (defun byte-compile-keep-pending (form &optional handler) | |
1766 (if (memq byte-optimize '(t source)) | |
1767 (setq form (byte-optimize-form form t))) | |
1768 (if handler | |
1769 (let ((for-effect t)) | |
1770 ;; To avoid consing up monstrously large forms at load time, we split | |
1771 ;; the output regularly. | |
3954
cac16b165691
(byte-compile-keep-pending): Handle fset like defalias.
Richard M. Stallman <rms@gnu.org>
parents:
3948
diff
changeset
|
1772 (and (memq (car-safe form) '(fset defalias)) |
cac16b165691
(byte-compile-keep-pending): Handle fset like defalias.
Richard M. Stallman <rms@gnu.org>
parents:
3948
diff
changeset
|
1773 (nthcdr 300 byte-compile-output) |
757 | 1774 (byte-compile-flush-pending)) |
1775 (funcall handler form) | |
1776 (if for-effect | |
1777 (byte-compile-discard))) | |
1778 (byte-compile-form form t)) | |
1779 nil) | |
1780 | |
1781 (defun byte-compile-flush-pending () | |
1782 (if byte-compile-output | |
1783 (let ((form (byte-compile-out-toplevel t 'file))) | |
1784 (cond ((eq (car-safe form) 'progn) | |
29239
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1785 (mapc 'byte-compile-output-file-form (cdr form))) |
757 | 1786 (form |
1787 (byte-compile-output-file-form form))) | |
1788 (setq byte-compile-constants nil | |
1789 byte-compile-variables nil | |
1790 byte-compile-depth 0 | |
1791 byte-compile-maxdepth 0 | |
1792 byte-compile-output nil)))) | |
1793 | |
1794 (defun byte-compile-file-form (form) | |
1795 (let ((byte-compile-current-form nil) ; close over this for warnings. | |
1796 handler) | |
1797 (cond | |
1798 ((not (consp form)) | |
1799 (byte-compile-keep-pending form)) | |
1800 ((and (symbolp (car form)) | |
1801 (setq handler (get (car form) 'byte-hunk-handler))) | |
1802 (cond ((setq form (funcall handler form)) | |
1803 (byte-compile-flush-pending) | |
1804 (byte-compile-output-file-form form)))) | |
1805 ((eq form (setq form (macroexpand form byte-compile-macro-environment))) | |
1806 (byte-compile-keep-pending form)) | |
1807 (t | |
1808 (byte-compile-file-form form))))) | |
1809 | |
1810 ;; Functions and variables with doc strings must be output separately, | |
1811 ;; so make-docfile can recognise them. Most other things can be output | |
1812 ;; as byte-code. | |
1813 | |
1814 (put 'defsubst 'byte-hunk-handler 'byte-compile-file-form-defsubst) | |
1815 (defun byte-compile-file-form-defsubst (form) | |
1816 (cond ((assq (nth 1 form) byte-compile-unresolved-functions) | |
1817 (setq byte-compile-current-form (nth 1 form)) | |
1818 (byte-compile-warn "defsubst %s was used before it was defined" | |
1819 (nth 1 form)))) | |
1820 (byte-compile-file-form | |
1821 (macroexpand form byte-compile-macro-environment)) | |
1822 ;; Return nil so the form is not output twice. | |
1823 nil) | |
1824 | |
1825 (put 'autoload 'byte-hunk-handler 'byte-compile-file-form-autoload) | |
1826 (defun byte-compile-file-form-autoload (form) | |
1827 (and (let ((form form)) | |
1828 (while (if (setq form (cdr form)) (byte-compile-constp (car form)))) | |
1829 (null form)) ;Constants only | |
1830 (eval (nth 5 form)) ;Macro | |
1831 (eval form)) ;Define the autoload. | |
28402 | 1832 ;; Avoid undefined function warnings for the autoload. |
28441
a7b3ff772283
(byte-compile-file-form-autoload): Re-enable new code.
Gerd Moellmann <gerd@gnu.org>
parents:
28422
diff
changeset
|
1833 (if (and (consp (nth 1 form)) |
28402 | 1834 (eq (car (nth 1 form)) 'quote) |
1835 (consp (cdr (nth 1 form))) | |
1836 (symbolp (nth 1 (nth 1 form)))) | |
1837 (add-to-list 'byte-compile-function-environment | |
1838 (cons (nth 1 (nth 1 form)) | |
37909
3d650ae7e609
(byte-compile-file-form-autoload): Use the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35145
diff
changeset
|
1839 (cons 'autoload (cdr (cdr form)))))) |
757 | 1840 (if (stringp (nth 3 form)) |
1841 form | |
1842 ;; No doc string, so we can compile this as a normal form. | |
1843 (byte-compile-keep-pending form 'byte-compile-normal-call))) | |
1844 | |
1845 (put 'defvar 'byte-hunk-handler 'byte-compile-file-form-defvar) | |
1846 (put 'defconst 'byte-hunk-handler 'byte-compile-file-form-defvar) | |
1847 (defun byte-compile-file-form-defvar (form) | |
1848 (if (null (nth 3 form)) | |
1849 ;; Since there is no doc string, we can compile this as a normal form, | |
1850 ;; and not do a file-boundary. | |
1851 (byte-compile-keep-pending form) | |
1852 (if (memq 'free-vars byte-compile-warnings) | |
1853 (setq byte-compile-bound-variables | |
1854 (cons (nth 1 form) byte-compile-bound-variables))) | |
1855 (cond ((consp (nth 2 form)) | |
1856 (setq form (copy-sequence form)) | |
1857 (setcar (cdr (cdr form)) | |
1858 (byte-compile-top-level (nth 2 form) nil 'file)))) | |
1859 form)) | |
1860 | |
17704
00ed998f90d3
(byte-compile-file-form-custom-declare-variable): New function.
Richard M. Stallman <rms@gnu.org>
parents:
17077
diff
changeset
|
1861 (put 'custom-declare-variable 'byte-hunk-handler |
00ed998f90d3
(byte-compile-file-form-custom-declare-variable): New function.
Richard M. Stallman <rms@gnu.org>
parents:
17077
diff
changeset
|
1862 'byte-compile-file-form-custom-declare-variable) |
00ed998f90d3
(byte-compile-file-form-custom-declare-variable): New function.
Richard M. Stallman <rms@gnu.org>
parents:
17077
diff
changeset
|
1863 (defun byte-compile-file-form-custom-declare-variable (form) |
00ed998f90d3
(byte-compile-file-form-custom-declare-variable): New function.
Richard M. Stallman <rms@gnu.org>
parents:
17077
diff
changeset
|
1864 (if (memq 'free-vars byte-compile-warnings) |
00ed998f90d3
(byte-compile-file-form-custom-declare-variable): New function.
Richard M. Stallman <rms@gnu.org>
parents:
17077
diff
changeset
|
1865 (setq byte-compile-bound-variables |
00ed998f90d3
(byte-compile-file-form-custom-declare-variable): New function.
Richard M. Stallman <rms@gnu.org>
parents:
17077
diff
changeset
|
1866 (cons (nth 1 (nth 1 form)) byte-compile-bound-variables))) |
00ed998f90d3
(byte-compile-file-form-custom-declare-variable): New function.
Richard M. Stallman <rms@gnu.org>
parents:
17077
diff
changeset
|
1867 form) |
00ed998f90d3
(byte-compile-file-form-custom-declare-variable): New function.
Richard M. Stallman <rms@gnu.org>
parents:
17077
diff
changeset
|
1868 |
757 | 1869 (put 'require 'byte-hunk-handler 'byte-compile-file-form-eval-boundary) |
1870 (defun byte-compile-file-form-eval-boundary (form) | |
1871 (eval form) | |
1872 (byte-compile-keep-pending form 'byte-compile-normal-call)) | |
1873 | |
1874 (put 'progn 'byte-hunk-handler 'byte-compile-file-form-progn) | |
1875 (put 'prog1 'byte-hunk-handler 'byte-compile-file-form-progn) | |
1876 (put 'prog2 'byte-hunk-handler 'byte-compile-file-form-progn) | |
1877 (defun byte-compile-file-form-progn (form) | |
29239
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
1878 (mapc 'byte-compile-file-form (cdr form)) |
757 | 1879 ;; Return nil so the forms are not output twice. |
1880 nil) | |
1881 | |
1882 ;; This handler is not necessary, but it makes the output from dont-compile | |
1883 ;; and similar macros cleaner. | |
1884 (put 'eval 'byte-hunk-handler 'byte-compile-file-form-eval) | |
1885 (defun byte-compile-file-form-eval (form) | |
1886 (if (eq (car-safe (nth 1 form)) 'quote) | |
1887 (nth 1 (nth 1 form)) | |
1888 (byte-compile-keep-pending form))) | |
1889 | |
1890 (put 'defun 'byte-hunk-handler 'byte-compile-file-form-defun) | |
1891 (defun byte-compile-file-form-defun (form) | |
1892 (byte-compile-file-form-defmumble form nil)) | |
1893 | |
1894 (put 'defmacro 'byte-hunk-handler 'byte-compile-file-form-defmacro) | |
1895 (defun byte-compile-file-form-defmacro (form) | |
1896 (byte-compile-file-form-defmumble form t)) | |
1897 | |
1898 (defun byte-compile-file-form-defmumble (form macrop) | |
1899 (let* ((name (car (cdr form))) | |
1900 (this-kind (if macrop 'byte-compile-macro-environment | |
1901 'byte-compile-function-environment)) | |
1902 (that-kind (if macrop 'byte-compile-function-environment | |
1903 'byte-compile-macro-environment)) | |
1904 (this-one (assq name (symbol-value this-kind))) | |
1905 (that-one (assq name (symbol-value that-kind))) | |
1906 (byte-compile-free-references nil) | |
1907 (byte-compile-free-assignments nil)) | |
1908 | |
1909 ;; When a function or macro is defined, add it to the call tree so that | |
1910 ;; we can tell when functions are not used. | |
1911 (if byte-compile-generate-call-tree | |
1912 (or (assq name byte-compile-call-tree) | |
1913 (setq byte-compile-call-tree | |
1914 (cons (list name nil nil) byte-compile-call-tree)))) | |
1915 | |
1916 (setq byte-compile-current-form name) ; for warnings | |
1917 (if (memq 'redefine byte-compile-warnings) | |
1918 (byte-compile-arglist-warn form macrop)) | |
1919 (if byte-compile-verbose | |
10687
1bd70186f894
(byte-compile-file-form-defmumble, display-call-tree): Print ellipsis earlier,
Karl Heuer <kwzh@gnu.org>
parents:
10514
diff
changeset
|
1920 (message "Compiling %s... (%s)" (or filename "") (nth 1 form))) |
757 | 1921 (cond (that-one |
1922 (if (and (memq 'redefine byte-compile-warnings) | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1923 ;; don't warn when compiling the stubs in byte-run... |
757 | 1924 (not (assq (nth 1 form) |
1925 byte-compile-initial-macro-environment))) | |
1926 (byte-compile-warn | |
1927 "%s defined multiple times, as both function and macro" | |
1928 (nth 1 form))) | |
1929 (setcdr that-one nil)) | |
1930 (this-one | |
1931 (if (and (memq 'redefine byte-compile-warnings) | |
1932 ;; hack: don't warn when compiling the magic internal | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
1933 ;; byte-compiler macros in byte-run.el... |
757 | 1934 (not (assq (nth 1 form) |
1935 byte-compile-initial-macro-environment))) | |
1936 (byte-compile-warn "%s %s defined multiple times in this file" | |
1937 (if macrop "macro" "function") | |
1938 (nth 1 form)))) | |
1939 ((and (fboundp name) | |
1940 (eq (car-safe (symbol-function name)) | |
1941 (if macrop 'lambda 'macro))) | |
1942 (if (memq 'redefine byte-compile-warnings) | |
1943 (byte-compile-warn "%s %s being redefined as a %s" | |
1944 (if macrop "function" "macro") | |
1945 (nth 1 form) | |
1946 (if macrop "macro" "function"))) | |
1947 ;; shadow existing definition | |
1948 (set this-kind | |
1949 (cons (cons name nil) (symbol-value this-kind)))) | |
1950 ) | |
1951 (let ((body (nthcdr 3 form))) | |
1952 (if (and (stringp (car body)) | |
1953 (symbolp (car-safe (cdr-safe body))) | |
1954 (car-safe (cdr-safe body)) | |
1955 (stringp (car-safe (cdr-safe (cdr-safe body))))) | |
1956 (byte-compile-warn "Probable `\"' without `\\' in doc string of %s" | |
1957 (nth 1 form)))) | |
1958 (let* ((new-one (byte-compile-lambda (cons 'lambda (nthcdr 2 form)))) | |
1959 (code (byte-compile-byte-code-maker new-one))) | |
1960 (if this-one | |
1961 (setcdr this-one new-one) | |
1962 (set this-kind | |
1963 (cons (cons name new-one) (symbol-value this-kind)))) | |
1964 (if (and (stringp (nth 3 form)) | |
1965 (eq 'quote (car-safe code)) | |
1966 (eq 'lambda (car-safe (nth 1 code)))) | |
1967 (cons (car form) | |
1968 (cons name (cdr (nth 1 code)))) | |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1969 (byte-compile-flush-pending) |
757 | 1970 (if (not (stringp (nth 3 form))) |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1971 ;; No doc string. Provide -1 as the "doc string index" |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1972 ;; so that no element will be treated as a doc string. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1973 (byte-compile-output-docform |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1974 (if (byte-compile-version-cond byte-compile-compatibility) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1975 "\n(fset '" "\n(defalias '") |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1976 name |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1977 (cond ((atom code) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1978 (if macrop '(" '(macro . #[" -1 "])") '(" #[" -1 "]"))) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1979 ((eq (car code) 'quote) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1980 (setq code new-one) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1981 (if macrop '(" '(macro " -1 ")") '(" '(" -1 ")"))) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1982 ((if macrop '(" (cons 'macro (" -1 "))") '(" (" -1 ")")))) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1983 (append code nil) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1984 (and (atom code) byte-compile-dynamic |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1985 1) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1986 nil) |
757 | 1987 ;; Output the form by hand, that's much simpler than having |
2566
4f201a4ab030
(define-function): Changed name back to defalisaases to get things in
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2544
diff
changeset
|
1988 ;; b-c-output-file-form analyze the defalias. |
757 | 1989 (byte-compile-output-docform |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1990 (if (byte-compile-version-cond byte-compile-compatibility) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1991 "\n(fset '" "\n(defalias '") |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1992 name |
757 | 1993 (cond ((atom code) |
1994 (if macrop '(" '(macro . #[" 4 "])") '(" #[" 4 "]"))) | |
1995 ((eq (car code) 'quote) | |
1996 (setq code new-one) | |
1997 (if macrop '(" '(macro " 2 ")") '(" '(" 2 ")"))) | |
1998 ((if macrop '(" (cons 'macro (" 5 "))") '(" (" 5 ")")))) | |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
1999 (append code nil) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2000 (and (atom code) byte-compile-dynamic |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2001 1) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2002 nil)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2003 (princ ")" outbuffer) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2004 nil)))) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2005 |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2006 ;; Print Lisp object EXP in the output file, inside a comment, |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2007 ;; and return the file position it will have. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2008 ;; If QUOTED is non-nil, print with quoting; otherwise, print without quoting. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2009 (defun byte-compile-output-as-comment (exp quoted) |
23135
99ab9c46504a
(byte-compile-output-as-comment):
Kenichi Handa <handa@m17n.org>
parents:
23054
diff
changeset
|
2010 (let ((position (point))) |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2011 (set-buffer |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2012 (prog1 (current-buffer) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2013 (set-buffer outbuffer) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2014 |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2015 ;; Insert EXP, and make it a comment with #@LENGTH. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2016 (insert " ") |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2017 (if quoted |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2018 (prin1 exp outbuffer) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2019 (princ exp outbuffer)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2020 (goto-char position) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2021 ;; Quote certain special characters as needed. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2022 ;; get_doc_string in doc.c does the unquoting. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2023 (while (search-forward "\^A" nil t) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2024 (replace-match "\^A\^A" t t)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2025 (goto-char position) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2026 (while (search-forward "\000" nil t) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2027 (replace-match "\^A0" t t)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2028 (goto-char position) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2029 (while (search-forward "\037" nil t) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2030 (replace-match "\^A_" t t)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2031 (goto-char (point-max)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2032 (insert "\037") |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2033 (goto-char position) |
23135
99ab9c46504a
(byte-compile-output-as-comment):
Kenichi Handa <handa@m17n.org>
parents:
23054
diff
changeset
|
2034 (insert "#@" (format "%d" (- (position-bytes (point-max)) |
99ab9c46504a
(byte-compile-output-as-comment):
Kenichi Handa <handa@m17n.org>
parents:
23054
diff
changeset
|
2035 (position-bytes position)))) |
10235
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2036 |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2037 ;; Save the file position of the object. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2038 ;; Note we should add 1 to skip the space |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2039 ;; that we inserted before the actual doc string, |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2040 ;; and subtract 1 to convert from an 1-origin Emacs position |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2041 ;; to a file position; they cancel. |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2042 (setq position (point)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2043 (goto-char (point-max)))) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2044 position)) |
ff7189e5e459
(byte-compile-dest-file): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
9802
diff
changeset
|
2045 |
757 | 2046 |
2047 | |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
2048 ;;;###autoload |
757 | 2049 (defun byte-compile (form) |
2050 "If FORM is a symbol, byte-compile its function definition. | |
2051 If FORM is a lambda or a macro, byte-compile it as a function." | |
2052 (displaying-byte-compile-warnings | |
2053 (byte-compile-close-variables | |
2054 (let* ((fun (if (symbolp form) | |
2055 (and (fboundp form) (symbol-function form)) | |
2056 form)) | |
2057 (macro (eq (car-safe fun) 'macro))) | |
2058 (if macro | |
2059 (setq fun (cdr fun))) | |
2060 (cond ((eq (car-safe fun) 'lambda) | |
2061 (setq fun (if macro | |
2062 (cons 'macro (byte-compile-lambda fun)) | |
2063 (byte-compile-lambda fun))) | |
2064 (if (symbolp form) | |
2566
4f201a4ab030
(define-function): Changed name back to defalisaases to get things in
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
2544
diff
changeset
|
2065 (defalias form fun) |
757 | 2066 fun))))))) |
2067 | |
2068 (defun byte-compile-sexp (sexp) | |
2069 "Compile and return SEXP." | |
2070 (displaying-byte-compile-warnings | |
2071 (byte-compile-close-variables | |
2072 (byte-compile-top-level sexp)))) | |
2073 | |
2074 ;; Given a function made by byte-compile-lambda, make a form which produces it. | |
2075 (defun byte-compile-byte-code-maker (fun) | |
2076 (cond | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
2077 ((byte-compile-version-cond byte-compile-compatibility) |
757 | 2078 ;; Return (quote (lambda ...)). |
2079 (list 'quote (byte-compile-byte-code-unmake fun))) | |
2080 ;; ## atom is faster than compiled-func-p. | |
2081 ((atom fun) ; compiled function. | |
2082 ;; generate-emacs19-bytecodes must be on, otherwise byte-compile-lambda | |
2083 ;; would have produced a lambda. | |
16149
eb953f4baf7b
(byte-compile-out-toplevel): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
15972
diff
changeset
|
2084 fun) |
757 | 2085 ;; b-c-lambda didn't produce a compiled-function, so it's either a trivial |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
2086 ;; function, or this is Emacs 18, or generate-emacs19-bytecodes is off. |
757 | 2087 ((let (tmp) |
2088 (if (and (setq tmp (assq 'byte-code (cdr-safe (cdr fun)))) | |
2089 (null (cdr (memq tmp fun)))) | |
2090 ;; Generate a make-byte-code call. | |
2091 (let* ((interactive (assq 'interactive (cdr (cdr fun))))) | |
2092 (nconc (list 'make-byte-code | |
2093 (list 'quote (nth 1 fun)) ;arglist | |
2094 (nth 1 tmp) ;bytes | |
2095 (nth 2 tmp) ;consts | |
2096 (nth 3 tmp)) ;depth | |
2097 (cond ((stringp (nth 2 fun)) | |
2098 (list (nth 2 fun))) ;doc | |
2099 (interactive | |
2100 (list nil))) | |
2101 (cond (interactive | |
2102 (list (if (or (null (nth 1 interactive)) | |
2103 (stringp (nth 1 interactive))) | |
2104 (nth 1 interactive) | |
2105 ;; Interactive spec is a list or a variable | |
2106 ;; (if it is correct). | |
2107 (list 'quote (nth 1 interactive)))))))) | |
2108 ;; a non-compiled function (probably trivial) | |
2109 (list 'quote fun)))))) | |
2110 | |
2111 ;; Turn a function into an ordinary lambda. Needed for v18 files. | |
2112 (defun byte-compile-byte-code-unmake (function) | |
2113 (if (consp function) | |
2114 function;;It already is a lambda. | |
2115 (setq function (append function nil)) ; turn it into a list | |
2116 (nconc (list 'lambda (nth 0 function)) | |
2117 (and (nth 4 function) (list (nth 4 function))) | |
2118 (if (nthcdr 5 function) | |
2119 (list (cons 'interactive (if (nth 5 function) | |
2120 (nthcdr 5 function))))) | |
2121 (list (list 'byte-code | |
2122 (nth 1 function) (nth 2 function) | |
2123 (nth 3 function)))))) | |
2124 | |
2125 | |
2126 ;; Byte-compile a lambda-expression and return a valid function. | |
2127 ;; The value is usually a compiled function but may be the original | |
2128 ;; lambda-expression. | |
2129 (defun byte-compile-lambda (fun) | |
26922
6fdf1f6c23a0
(byte-compile-bound-variables): Doc fix.
Dave Love <fx@gnu.org>
parents:
25636
diff
changeset
|
2130 (unless (eq 'lambda (car-safe fun)) |
6fdf1f6c23a0
(byte-compile-bound-variables): Doc fix.
Dave Love <fx@gnu.org>
parents:
25636
diff
changeset
|
2131 (error "Not a lambda list: %S" fun)) |
757 | 2132 (let* ((arglist (nth 1 fun)) |
2133 (byte-compile-bound-variables | |
2134 (nconc (and (memq 'free-vars byte-compile-warnings) | |
2135 (delq '&rest (delq '&optional (copy-sequence arglist)))) | |
2136 byte-compile-bound-variables)) | |
2137 (body (cdr (cdr fun))) | |
2138 (doc (if (stringp (car body)) | |
2139 (prog1 (car body) | |
16232
d79492598ec8
(byte-compile-lambda): If the doc string is also the
Richard M. Stallman <rms@gnu.org>
parents:
16159
diff
changeset
|
2140 ;; Discard the doc string |
d79492598ec8
(byte-compile-lambda): If the doc string is also the
Richard M. Stallman <rms@gnu.org>
parents:
16159
diff
changeset
|
2141 ;; unless it is the last element of the body. |
22350
745759e4e099
(byte-compile-lambda): Fix previous change.
Karl Heuer <kwzh@gnu.org>
parents:
22136
diff
changeset
|
2142 (if (cdr body) |
16232
d79492598ec8
(byte-compile-lambda): If the doc string is also the
Richard M. Stallman <rms@gnu.org>
parents:
16159
diff
changeset
|
2143 (setq body (cdr body)))))) |
757 | 2144 (int (assq 'interactive body))) |
2145 (cond (int | |
2146 ;; Skip (interactive) if it is in front (the most usual location). | |
2147 (if (eq int (car body)) | |
2148 (setq body (cdr body))) | |
1532 | 2149 (cond ((consp (cdr int)) |
757 | 2150 (if (cdr (cdr int)) |
2151 (byte-compile-warn "malformed interactive spec: %s" | |
2152 (prin1-to-string int))) | |
1532 | 2153 ;; If the interactive spec is a call to `list', |
2154 ;; don't compile it, because `call-interactively' | |
2155 ;; looks at the args of `list'. | |
13474
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2156 (let ((form (nth 1 int))) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2157 (while (or (eq (car-safe form) 'let) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2158 (eq (car-safe form) 'let*) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2159 (eq (car-safe form) 'save-excursion)) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2160 (while (consp (cdr form)) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2161 (setq form (cdr form))) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2162 (setq form (car form))) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2163 (or (eq (car-safe form) 'list) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2164 (setq int (list 'interactive |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2165 (byte-compile-top-level (nth 1 int))))))) |
1532 | 2166 ((cdr int) |
2167 (byte-compile-warn "malformed interactive spec: %s" | |
2168 (prin1-to-string int)))))) | |
757 | 2169 (let ((compiled (byte-compile-top-level (cons 'progn body) nil 'lambda))) |
2170 (if (and (eq 'byte-code (car-safe compiled)) | |
1882
83fc53d66a31
(byte-compile-lambda): Test of byte-compile-compatibility was backwards.
Richard M. Stallman <rms@gnu.org>
parents:
1819
diff
changeset
|
2171 (not (byte-compile-version-cond |
83fc53d66a31
(byte-compile-lambda): Test of byte-compile-compatibility was backwards.
Richard M. Stallman <rms@gnu.org>
parents:
1819
diff
changeset
|
2172 byte-compile-compatibility))) |
757 | 2173 (apply 'make-byte-code |
2174 (append (list arglist) | |
2175 ;; byte-string, constants-vector, stack depth | |
2176 (cdr compiled) | |
2177 ;; optionally, the doc string. | |
2178 (if (or doc int) | |
2179 (list doc)) | |
2180 ;; optionally, the interactive spec. | |
2181 (if int | |
2182 (list (nth 1 int))))) | |
2183 (setq compiled | |
2184 (nconc (if int (list int)) | |
2185 (cond ((eq (car-safe compiled) 'progn) (cdr compiled)) | |
2186 (compiled (list compiled))))) | |
2187 (nconc (list 'lambda arglist) | |
2188 (if (or doc (stringp (car compiled))) | |
2189 (cons doc (cond (compiled) | |
2190 (body (list nil)))) | |
2191 compiled)))))) | |
2192 | |
2193 (defun byte-compile-constants-vector () | |
2194 ;; Builds the constants-vector from the current variables and constants. | |
2195 ;; This modifies the constants from (const . nil) to (const . offset). | |
2196 ;; To keep the byte-codes to look up the vector as short as possible: | |
2197 ;; First 6 elements are vars, as there are one-byte varref codes for those. | |
2198 ;; Next up to byte-constant-limit are constants, still with one-byte codes. | |
2199 ;; Next variables again, to get 2-byte codes for variable lookup. | |
2200 ;; The rest of the constants and variables need 3-byte byte-codes. | |
2201 (let* ((i -1) | |
2202 (rest (nreverse byte-compile-variables)) ; nreverse because the first | |
2203 (other (nreverse byte-compile-constants)) ; vars often are used most. | |
2204 ret tmp | |
2205 (limits '(5 ; Use the 1-byte varref codes, | |
2206 63 ; 1-constlim ; 1-byte byte-constant codes, | |
2207 255 ; 2-byte varref codes, | |
2208 65535)) ; 3-byte codes for the rest. | |
2209 limit) | |
2210 (while (or rest other) | |
2211 (setq limit (car limits)) | |
2212 (while (and rest (not (eq i limit))) | |
2213 (if (setq tmp (assq (car (car rest)) ret)) | |
2214 (setcdr (car rest) (cdr tmp)) | |
2215 (setcdr (car rest) (setq i (1+ i))) | |
2216 (setq ret (cons (car rest) ret))) | |
2217 (setq rest (cdr rest))) | |
2218 (setq limits (cdr limits) | |
2219 rest (prog1 other | |
2220 (setq other rest)))) | |
2221 (apply 'vector (nreverse (mapcar 'car ret))))) | |
2222 | |
2223 ;; Given an expression FORM, compile it and return an equivalent byte-code | |
2224 ;; expression (a call to the function byte-code). | |
2225 (defun byte-compile-top-level (form &optional for-effect output-type) | |
2226 ;; OUTPUT-TYPE advises about how form is expected to be used: | |
2227 ;; 'eval or nil -> a single form, | |
2228 ;; 'progn or t -> a list of forms, | |
2229 ;; 'lambda -> body of a lambda, | |
2230 ;; 'file -> used at file-level. | |
8446
0199ece40d91
(byte-compile-protect-from-advice): Macro deleted.
Richard M. Stallman <rms@gnu.org>
parents:
8115
diff
changeset
|
2231 (let ((byte-compile-constants nil) |
0199ece40d91
(byte-compile-protect-from-advice): Macro deleted.
Richard M. Stallman <rms@gnu.org>
parents:
8115
diff
changeset
|
2232 (byte-compile-variables nil) |
0199ece40d91
(byte-compile-protect-from-advice): Macro deleted.
Richard M. Stallman <rms@gnu.org>
parents:
8115
diff
changeset
|
2233 (byte-compile-tag-number 0) |
0199ece40d91
(byte-compile-protect-from-advice): Macro deleted.
Richard M. Stallman <rms@gnu.org>
parents:
8115
diff
changeset
|
2234 (byte-compile-depth 0) |
0199ece40d91
(byte-compile-protect-from-advice): Macro deleted.
Richard M. Stallman <rms@gnu.org>
parents:
8115
diff
changeset
|
2235 (byte-compile-maxdepth 0) |
0199ece40d91
(byte-compile-protect-from-advice): Macro deleted.
Richard M. Stallman <rms@gnu.org>
parents:
8115
diff
changeset
|
2236 (byte-compile-output nil)) |
6081
65adb7b035fd
(byte-compile-protect-from-advice): New macro that
Richard M. Stallman <rms@gnu.org>
parents:
6043
diff
changeset
|
2237 (if (memq byte-optimize '(t source)) |
65adb7b035fd
(byte-compile-protect-from-advice): New macro that
Richard M. Stallman <rms@gnu.org>
parents:
6043
diff
changeset
|
2238 (setq form (byte-optimize-form form for-effect))) |
65adb7b035fd
(byte-compile-protect-from-advice): New macro that
Richard M. Stallman <rms@gnu.org>
parents:
6043
diff
changeset
|
2239 (while (and (eq (car-safe form) 'progn) (null (cdr (cdr form)))) |
65adb7b035fd
(byte-compile-protect-from-advice): New macro that
Richard M. Stallman <rms@gnu.org>
parents:
6043
diff
changeset
|
2240 (setq form (nth 1 form))) |
65adb7b035fd
(byte-compile-protect-from-advice): New macro that
Richard M. Stallman <rms@gnu.org>
parents:
6043
diff
changeset
|
2241 (if (and (eq 'byte-code (car-safe form)) |
65adb7b035fd
(byte-compile-protect-from-advice): New macro that
Richard M. Stallman <rms@gnu.org>
parents:
6043
diff
changeset
|
2242 (not (memq byte-optimize '(t byte))) |
65adb7b035fd
(byte-compile-protect-from-advice): New macro that
Richard M. Stallman <rms@gnu.org>
parents:
6043
diff
changeset
|
2243 (stringp (nth 1 form)) (vectorp (nth 2 form)) |
65adb7b035fd
(byte-compile-protect-from-advice): New macro that
Richard M. Stallman <rms@gnu.org>
parents:
6043
diff
changeset
|
2244 (natnump (nth 3 form))) |
65adb7b035fd
(byte-compile-protect-from-advice): New macro that
Richard M. Stallman <rms@gnu.org>
parents:
6043
diff
changeset
|
2245 form |
65adb7b035fd
(byte-compile-protect-from-advice): New macro that
Richard M. Stallman <rms@gnu.org>
parents:
6043
diff
changeset
|
2246 (byte-compile-form form for-effect) |
8446
0199ece40d91
(byte-compile-protect-from-advice): Macro deleted.
Richard M. Stallman <rms@gnu.org>
parents:
8115
diff
changeset
|
2247 (byte-compile-out-toplevel for-effect output-type)))) |
757 | 2248 |
2249 (defun byte-compile-out-toplevel (&optional for-effect output-type) | |
2250 (if for-effect | |
2251 ;; The stack is empty. Push a value to be returned from (byte-code ..). | |
2252 (if (eq (car (car byte-compile-output)) 'byte-discard) | |
2253 (setq byte-compile-output (cdr byte-compile-output)) | |
2254 (byte-compile-push-constant | |
2255 ;; Push any constant - preferably one which already is used, and | |
2256 ;; a number or symbol - ie not some big sequence. The return value | |
2257 ;; isn't returned, but it would be a shame if some textually large | |
2258 ;; constant was not optimized away because we chose to return it. | |
2259 (and (not (assq nil byte-compile-constants)) ; Nil is often there. | |
2260 (let ((tmp (reverse byte-compile-constants))) | |
2261 (while (and tmp (not (or (symbolp (car (car tmp))) | |
2262 (numberp (car (car tmp)))))) | |
2263 (setq tmp (cdr tmp))) | |
2264 (car (car tmp))))))) | |
2265 (byte-compile-out 'byte-return 0) | |
2266 (setq byte-compile-output (nreverse byte-compile-output)) | |
2267 (if (memq byte-optimize '(t byte)) | |
2268 (setq byte-compile-output | |
2269 (byte-optimize-lapcode byte-compile-output for-effect))) | |
2270 | |
2271 ;; Decompile trivial functions: | |
2272 ;; only constants and variables, or a single funcall except in lambdas. | |
2273 ;; Except for Lisp_Compiled objects, forms like (foo "hi") | |
2274 ;; are still quicker than (byte-code "..." [foo "hi"] 2). | |
2275 ;; Note that even (quote foo) must be parsed just as any subr by the | |
2276 ;; interpreter, so quote should be compiled into byte-code in some contexts. | |
2277 ;; What to leave uncompiled: | |
11117
34477ac36e6e
(byte-compile-out-toplevel): Compile lambda forms even if trivial.
Karl Heuer <kwzh@gnu.org>
parents:
10836
diff
changeset
|
2278 ;; lambda -> never. we used to leave it uncompiled if the body was |
34477ac36e6e
(byte-compile-out-toplevel): Compile lambda forms even if trivial.
Karl Heuer <kwzh@gnu.org>
parents:
10836
diff
changeset
|
2279 ;; a single atom, but that causes confusion if the docstring |
34477ac36e6e
(byte-compile-out-toplevel): Compile lambda forms even if trivial.
Karl Heuer <kwzh@gnu.org>
parents:
10836
diff
changeset
|
2280 ;; uses the (file . pos) syntax. Besides, now that we have |
34477ac36e6e
(byte-compile-out-toplevel): Compile lambda forms even if trivial.
Karl Heuer <kwzh@gnu.org>
parents:
10836
diff
changeset
|
2281 ;; the Lisp_Compiled type, the compiled form is faster. |
757 | 2282 ;; eval -> atom, quote or (function atom atom atom) |
2283 ;; progn -> as <<same-as-eval>> or (progn <<same-as-eval>> atom) | |
2284 ;; file -> as progn, but takes both quotes and atoms, and longer forms. | |
2285 (let (rest | |
2286 (maycall (not (eq output-type 'lambda))) ; t if we may make a funcall. | |
2287 tmp body) | |
2288 (cond | |
2289 ;; #### This should be split out into byte-compile-nontrivial-function-p. | |
11117
34477ac36e6e
(byte-compile-out-toplevel): Compile lambda forms even if trivial.
Karl Heuer <kwzh@gnu.org>
parents:
10836
diff
changeset
|
2290 ((or (eq output-type 'lambda) |
34477ac36e6e
(byte-compile-out-toplevel): Compile lambda forms even if trivial.
Karl Heuer <kwzh@gnu.org>
parents:
10836
diff
changeset
|
2291 (nthcdr (if (eq output-type 'file) 50 8) byte-compile-output) |
757 | 2292 (assq 'TAG byte-compile-output) ; Not necessary, but speeds up a bit. |
2293 (not (setq tmp (assq 'byte-return byte-compile-output))) | |
2294 (progn | |
2295 (setq rest (nreverse | |
2296 (cdr (memq tmp (reverse byte-compile-output))))) | |
2297 (while (cond | |
2298 ((memq (car (car rest)) '(byte-varref byte-constant)) | |
2299 (setq tmp (car (cdr (car rest)))) | |
16149
eb953f4baf7b
(byte-compile-out-toplevel): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
15972
diff
changeset
|
2300 (if (if (eq (car (car rest)) 'byte-constant) |
eb953f4baf7b
(byte-compile-out-toplevel): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
15972
diff
changeset
|
2301 (or (consp tmp) |
eb953f4baf7b
(byte-compile-out-toplevel): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
15972
diff
changeset
|
2302 (and (symbolp tmp) |
27824 | 2303 (not (byte-compile-const-symbol-p tmp))))) |
16149
eb953f4baf7b
(byte-compile-out-toplevel): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
15972
diff
changeset
|
2304 (if maycall |
eb953f4baf7b
(byte-compile-out-toplevel): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
15972
diff
changeset
|
2305 (setq body (cons (list 'quote tmp) body))) |
eb953f4baf7b
(byte-compile-out-toplevel): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
15972
diff
changeset
|
2306 (setq body (cons tmp body)))) |
757 | 2307 ((and maycall |
2308 ;; Allow a funcall if at most one atom follows it. | |
2309 (null (nthcdr 3 rest)) | |
2310 (setq tmp (get (car (car rest)) 'byte-opcode-invert)) | |
2311 (or (null (cdr rest)) | |
2312 (and (memq output-type '(file progn t)) | |
2313 (cdr (cdr rest)) | |
2314 (eq (car (nth 1 rest)) 'byte-discard) | |
2315 (progn (setq rest (cdr rest)) t)))) | |
2316 (setq maycall nil) ; Only allow one real function call. | |
2317 (setq body (nreverse body)) | |
2318 (setq body (list | |
2319 (if (and (eq tmp 'funcall) | |
2320 (eq (car-safe (car body)) 'quote)) | |
2321 (cons (nth 1 (car body)) (cdr body)) | |
2322 (cons tmp body)))) | |
2323 (or (eq output-type 'file) | |
2324 (not (delq nil (mapcar 'consp (cdr (car body)))))))) | |
2325 (setq rest (cdr rest))) | |
11117
34477ac36e6e
(byte-compile-out-toplevel): Compile lambda forms even if trivial.
Karl Heuer <kwzh@gnu.org>
parents:
10836
diff
changeset
|
2326 rest)) |
757 | 2327 (let ((byte-compile-vector (byte-compile-constants-vector))) |
2328 (list 'byte-code (byte-compile-lapcode byte-compile-output) | |
2329 byte-compile-vector byte-compile-maxdepth))) | |
2330 ;; it's a trivial function | |
2331 ((cdr body) (cons 'progn (nreverse body))) | |
2332 ((car body))))) | |
2333 | |
2334 ;; Given BODY, compile it and return a new body. | |
2335 (defun byte-compile-top-level-body (body &optional for-effect) | |
2336 (setq body (byte-compile-top-level (cons 'progn body) for-effect t)) | |
2337 (cond ((eq (car-safe body) 'progn) | |
2338 (cdr body)) | |
2339 (body | |
2340 (list body)))) | |
2341 | |
28402 | 2342 ;; This is the recursive entry point for compiling each subform of an |
757 | 2343 ;; expression. |
2344 ;; If for-effect is non-nil, byte-compile-form will output a byte-discard | |
2345 ;; before terminating (ie no value will be left on the stack). | |
2346 ;; A byte-compile handler may, when for-effect is non-nil, choose output code | |
2347 ;; which does not leave a value on the stack, and then set for-effect to nil | |
2348 ;; (to prevent byte-compile-form from outputting the byte-discard). | |
2349 ;; If a handler wants to call another handler, it should do so via | |
2350 ;; byte-compile-form, or take extreme care to handle for-effect correctly. | |
2351 ;; (Use byte-compile-form-do-effect to reset the for-effect flag too.) | |
2352 ;; | |
2353 (defun byte-compile-form (form &optional for-effect) | |
2354 (setq form (macroexpand form byte-compile-macro-environment)) | |
2355 (cond ((not (consp form)) | |
27824 | 2356 (cond ((or (not (symbolp form)) (byte-compile-const-symbol-p form)) |
757 | 2357 (byte-compile-constant form)) |
2358 ((and for-effect byte-compile-delete-errors) | |
2359 (setq for-effect nil)) | |
2360 (t (byte-compile-variable-ref 'byte-varref form)))) | |
2361 ((symbolp (car form)) | |
2362 (let* ((fn (car form)) | |
2363 (handler (get fn 'byte-compile))) | |
27824 | 2364 (if (byte-compile-const-symbol-p fn) |
958 | 2365 (byte-compile-warn "%s called as a function" fn)) |
757 | 2366 (if (and handler |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
2367 (or (not (byte-compile-version-cond |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
2368 byte-compile-compatibility)) |
757 | 2369 (not (get (get fn 'byte-opcode) 'emacs19-opcode)))) |
2370 (funcall handler form) | |
2371 (if (memq 'callargs byte-compile-warnings) | |
2372 (byte-compile-callargs-warn form)) | |
2373 (byte-compile-normal-call form)))) | |
1819
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
2374 ((and (or (byte-code-function-p (car form)) |
757 | 2375 (eq (car-safe (car form)) 'lambda)) |
2376 ;; if the form comes out the same way it went in, that's | |
2377 ;; because it was malformed, and we couldn't unfold it. | |
2378 (not (eq form (setq form (byte-compile-unfold-lambda form))))) | |
2379 (byte-compile-form form for-effect) | |
2380 (setq for-effect nil)) | |
2381 ((byte-compile-normal-call form))) | |
2382 (if for-effect | |
2383 (byte-compile-discard))) | |
2384 | |
2385 (defun byte-compile-normal-call (form) | |
2386 (if byte-compile-generate-call-tree | |
2387 (byte-compile-annotate-call-tree form)) | |
2388 (byte-compile-push-constant (car form)) | |
29239
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
2389 (mapc 'byte-compile-form (cdr form)) ; wasteful, but faster. |
757 | 2390 (byte-compile-out 'byte-call (length (cdr form)))) |
2391 | |
2392 (defun byte-compile-variable-ref (base-op var) | |
27824 | 2393 (if (or (not (symbolp var)) (byte-compile-const-symbol-p var)) |
757 | 2394 (byte-compile-warn (if (eq base-op 'byte-varbind) |
2395 "Attempt to let-bind %s %s" | |
2396 "Variable reference to %s %s") | |
2397 (if (symbolp var) "constant" "nonvariable") | |
2398 (prin1-to-string var)) | |
10256
83d56dd99a40
(byte-compile-warning-types): Add obsolete.
Richard M. Stallman <rms@gnu.org>
parents:
10235
diff
changeset
|
2399 (if (and (get var 'byte-obsolete-variable) |
83d56dd99a40
(byte-compile-warning-types): Add obsolete.
Richard M. Stallman <rms@gnu.org>
parents:
10235
diff
changeset
|
2400 (memq 'obsolete byte-compile-warnings)) |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
2401 (let* ((ob (get var 'byte-obsolete-variable)) |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
2402 (when (cdr ob))) |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
2403 (byte-compile-warn "%s is an obsolete variable%s; %s" var |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
2404 (if when (concat " since " when) "") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
2405 (if (stringp (car ob)) |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
2406 (car ob) |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
2407 (format "use %s instead." (car ob)))))) |
757 | 2408 (if (memq 'free-vars byte-compile-warnings) |
2409 (if (eq base-op 'byte-varbind) | |
2410 (setq byte-compile-bound-variables | |
2411 (cons var byte-compile-bound-variables)) | |
2412 (or (boundp var) | |
2413 (memq var byte-compile-bound-variables) | |
2414 (if (eq base-op 'byte-varset) | |
2415 (or (memq var byte-compile-free-assignments) | |
2416 (progn | |
2417 (byte-compile-warn "assignment to free variable %s" var) | |
2418 (setq byte-compile-free-assignments | |
2419 (cons var byte-compile-free-assignments)))) | |
2420 (or (memq var byte-compile-free-references) | |
2421 (progn | |
2422 (byte-compile-warn "reference to free variable %s" var) | |
2423 (setq byte-compile-free-references | |
2424 (cons var byte-compile-free-references))))))))) | |
2425 (let ((tmp (assq var byte-compile-variables))) | |
2426 (or tmp | |
2427 (setq tmp (list var) | |
2428 byte-compile-variables (cons tmp byte-compile-variables))) | |
2429 (byte-compile-out base-op tmp))) | |
2430 | |
2431 (defmacro byte-compile-get-constant (const) | |
27824 | 2432 `(or (if (stringp ,const) |
2433 (assoc ,const byte-compile-constants) | |
2434 (assq ,const byte-compile-constants)) | |
2435 (car (setq byte-compile-constants | |
2436 (cons (list ,const) byte-compile-constants))))) | |
757 | 2437 |
2438 ;; Use this when the value of a form is a constant. This obeys for-effect. | |
2439 (defun byte-compile-constant (const) | |
2440 (if for-effect | |
2441 (setq for-effect nil) | |
2442 (byte-compile-out 'byte-constant (byte-compile-get-constant const)))) | |
2443 | |
2444 ;; Use this for a constant that is not the value of its containing form. | |
2445 ;; This ignores for-effect. | |
2446 (defun byte-compile-push-constant (const) | |
2447 (let ((for-effect nil)) | |
2448 (inline (byte-compile-constant const)))) | |
2449 | |
2450 | |
2451 ;; Compile those primitive ordinary functions | |
2452 ;; which have special byte codes just for speed. | |
2453 | |
2454 (defmacro byte-defop-compiler (function &optional compile-handler) | |
2455 ;; add a compiler-form for FUNCTION. | |
2456 ;; If function is a symbol, then the variable "byte-SYMBOL" must name | |
2457 ;; the opcode to be used. If function is a list, the first element | |
2458 ;; is the function and the second element is the bytecode-symbol. | |
2459 ;; COMPILE-HANDLER is the function to use to compile this byte-op, or | |
2460 ;; may be the abbreviations 0, 1, 2, 3, 0-1, or 1-2. | |
2461 ;; If it is nil, then the handler is "byte-compile-SYMBOL." | |
2462 (let (opcode) | |
2463 (if (symbolp function) | |
2464 (setq opcode (intern (concat "byte-" (symbol-name function)))) | |
2465 (setq opcode (car (cdr function)) | |
2466 function (car function))) | |
2467 (let ((fnform | |
2468 (list 'put (list 'quote function) ''byte-compile | |
2469 (list 'quote | |
2470 (or (cdr (assq compile-handler | |
2471 '((0 . byte-compile-no-args) | |
2472 (1 . byte-compile-one-arg) | |
2473 (2 . byte-compile-two-args) | |
2474 (3 . byte-compile-three-args) | |
2475 (0-1 . byte-compile-zero-or-one-arg) | |
2476 (1-2 . byte-compile-one-or-two-args) | |
2477 (2-3 . byte-compile-two-or-three-args) | |
2478 ))) | |
2479 compile-handler | |
2480 (intern (concat "byte-compile-" | |
2481 (symbol-name function)))))))) | |
2482 (if opcode | |
2483 (list 'progn fnform | |
2484 (list 'put (list 'quote function) | |
2485 ''byte-opcode (list 'quote opcode)) | |
2486 (list 'put (list 'quote opcode) | |
2487 ''byte-opcode-invert (list 'quote function))) | |
2488 fnform)))) | |
2489 | |
2490 (defmacro byte-defop-compiler19 (function &optional compile-handler) | |
2491 ;; Just like byte-defop-compiler, but defines an opcode that will only | |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
2492 ;; be used when byte-compile-compatibility is false. |
757 | 2493 (if (and (byte-compile-single-version) |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
2494 byte-compile-compatibility) |
958 | 2495 ;; #### instead of doing nothing, this should do some remprops, |
2496 ;; #### to protect against the case where a single-version compiler | |
2497 ;; #### is loaded into a world that has contained a multi-version one. | |
757 | 2498 nil |
2499 (list 'progn | |
2500 (list 'put | |
2501 (list 'quote | |
2502 (or (car (cdr-safe function)) | |
2503 (intern (concat "byte-" | |
2504 (symbol-name (or (car-safe function) function)))))) | |
2505 ''emacs19-opcode t) | |
2506 (list 'byte-defop-compiler function compile-handler)))) | |
2507 | |
2508 (defmacro byte-defop-compiler-1 (function &optional compile-handler) | |
2509 (list 'byte-defop-compiler (list function nil) compile-handler)) | |
2510 | |
2511 | |
2512 (put 'byte-call 'byte-opcode-invert 'funcall) | |
2513 (put 'byte-list1 'byte-opcode-invert 'list) | |
2514 (put 'byte-list2 'byte-opcode-invert 'list) | |
2515 (put 'byte-list3 'byte-opcode-invert 'list) | |
2516 (put 'byte-list4 'byte-opcode-invert 'list) | |
2517 (put 'byte-listN 'byte-opcode-invert 'list) | |
2518 (put 'byte-concat2 'byte-opcode-invert 'concat) | |
2519 (put 'byte-concat3 'byte-opcode-invert 'concat) | |
2520 (put 'byte-concat4 'byte-opcode-invert 'concat) | |
2521 (put 'byte-concatN 'byte-opcode-invert 'concat) | |
2522 (put 'byte-insertN 'byte-opcode-invert 'insert) | |
2523 | |
2524 (byte-defop-compiler (dot byte-point) 0) | |
2525 (byte-defop-compiler (dot-max byte-point-max) 0) | |
2526 (byte-defop-compiler (dot-min byte-point-min) 0) | |
2527 (byte-defop-compiler point 0) | |
2528 ;;(byte-defop-compiler mark 0) ;; obsolete | |
2529 (byte-defop-compiler point-max 0) | |
2530 (byte-defop-compiler point-min 0) | |
2531 (byte-defop-compiler following-char 0) | |
2532 (byte-defop-compiler preceding-char 0) | |
2533 (byte-defop-compiler current-column 0) | |
2534 (byte-defop-compiler eolp 0) | |
2535 (byte-defop-compiler eobp 0) | |
2536 (byte-defop-compiler bolp 0) | |
2537 (byte-defop-compiler bobp 0) | |
2538 (byte-defop-compiler current-buffer 0) | |
2539 ;;(byte-defop-compiler read-char 0) ;; obsolete | |
2540 (byte-defop-compiler interactive-p 0) | |
2541 (byte-defop-compiler19 widen 0) | |
2542 (byte-defop-compiler19 end-of-line 0-1) | |
2543 (byte-defop-compiler19 forward-char 0-1) | |
2544 (byte-defop-compiler19 forward-line 0-1) | |
2545 (byte-defop-compiler symbolp 1) | |
2546 (byte-defop-compiler consp 1) | |
2547 (byte-defop-compiler stringp 1) | |
2548 (byte-defop-compiler listp 1) | |
2549 (byte-defop-compiler not 1) | |
2550 (byte-defop-compiler (null byte-not) 1) | |
2551 (byte-defop-compiler car 1) | |
2552 (byte-defop-compiler cdr 1) | |
2553 (byte-defop-compiler length 1) | |
2554 (byte-defop-compiler symbol-value 1) | |
2555 (byte-defop-compiler symbol-function 1) | |
2556 (byte-defop-compiler (1+ byte-add1) 1) | |
2557 (byte-defop-compiler (1- byte-sub1) 1) | |
2558 (byte-defop-compiler goto-char 1) | |
18722
3905119ebc75
(char-after): Allow 0 args.
Richard M. Stallman <rms@gnu.org>
parents:
18391
diff
changeset
|
2559 (byte-defop-compiler char-after 0-1) |
757 | 2560 (byte-defop-compiler set-buffer 1) |
2561 ;;(byte-defop-compiler set-mark 1) ;; obsolete | |
2562 (byte-defop-compiler19 forward-word 1) | |
2563 (byte-defop-compiler19 char-syntax 1) | |
2564 (byte-defop-compiler19 nreverse 1) | |
2565 (byte-defop-compiler19 car-safe 1) | |
2566 (byte-defop-compiler19 cdr-safe 1) | |
2567 (byte-defop-compiler19 numberp 1) | |
2568 (byte-defop-compiler19 integerp 1) | |
2569 (byte-defop-compiler19 skip-chars-forward 1-2) | |
2570 (byte-defop-compiler19 skip-chars-backward 1-2) | |
2571 (byte-defop-compiler eq 2) | |
2572 (byte-defop-compiler memq 2) | |
2573 (byte-defop-compiler cons 2) | |
2574 (byte-defop-compiler aref 2) | |
2575 (byte-defop-compiler set 2) | |
2576 (byte-defop-compiler (= byte-eqlsign) 2) | |
2577 (byte-defop-compiler (< byte-lss) 2) | |
2578 (byte-defop-compiler (> byte-gtr) 2) | |
2579 (byte-defop-compiler (<= byte-leq) 2) | |
2580 (byte-defop-compiler (>= byte-geq) 2) | |
2581 (byte-defop-compiler get 2) | |
2582 (byte-defop-compiler nth 2) | |
2583 (byte-defop-compiler substring 2-3) | |
958 | 2584 (byte-defop-compiler19 (move-marker byte-set-marker) 2-3) |
757 | 2585 (byte-defop-compiler19 set-marker 2-3) |
2586 (byte-defop-compiler19 match-beginning 1) | |
2587 (byte-defop-compiler19 match-end 1) | |
2588 (byte-defop-compiler19 upcase 1) | |
2589 (byte-defop-compiler19 downcase 1) | |
2590 (byte-defop-compiler19 string= 2) | |
2591 (byte-defop-compiler19 string< 2) | |
958 | 2592 (byte-defop-compiler19 (string-equal byte-string=) 2) |
2593 (byte-defop-compiler19 (string-lessp byte-string<) 2) | |
757 | 2594 (byte-defop-compiler19 equal 2) |
2595 (byte-defop-compiler19 nthcdr 2) | |
2596 (byte-defop-compiler19 elt 2) | |
2597 (byte-defop-compiler19 member 2) | |
2598 (byte-defop-compiler19 assq 2) | |
958 | 2599 (byte-defop-compiler19 (rplaca byte-setcar) 2) |
2600 (byte-defop-compiler19 (rplacd byte-setcdr) 2) | |
757 | 2601 (byte-defop-compiler19 setcar 2) |
2602 (byte-defop-compiler19 setcdr 2) | |
2603 (byte-defop-compiler19 buffer-substring 2) | |
2604 (byte-defop-compiler19 delete-region 2) | |
2605 (byte-defop-compiler19 narrow-to-region 2) | |
2606 (byte-defop-compiler19 (% byte-rem) 2) | |
2607 (byte-defop-compiler aset 3) | |
2608 | |
2609 (byte-defop-compiler max byte-compile-associative) | |
2610 (byte-defop-compiler min byte-compile-associative) | |
2611 (byte-defop-compiler (+ byte-plus) byte-compile-associative) | |
2612 (byte-defop-compiler19 (* byte-mult) byte-compile-associative) | |
2613 | |
2614 ;;####(byte-defop-compiler19 move-to-column 1) | |
2615 (byte-defop-compiler-1 interactive byte-compile-noop) | |
2616 | |
2617 | |
2618 (defun byte-compile-subr-wrong-args (form n) | |
2619 (byte-compile-warn "%s called with %d arg%s, but requires %s" | |
2620 (car form) (length (cdr form)) | |
2621 (if (= 1 (length (cdr form))) "" "s") n) | |
2622 ;; get run-time wrong-number-of-args error. | |
2623 (byte-compile-normal-call form)) | |
2624 | |
2625 (defun byte-compile-no-args (form) | |
2626 (if (not (= (length form) 1)) | |
2627 (byte-compile-subr-wrong-args form "none") | |
2628 (byte-compile-out (get (car form) 'byte-opcode) 0))) | |
2629 | |
2630 (defun byte-compile-one-arg (form) | |
2631 (if (not (= (length form) 2)) | |
2632 (byte-compile-subr-wrong-args form 1) | |
2633 (byte-compile-form (car (cdr form))) ;; Push the argument | |
2634 (byte-compile-out (get (car form) 'byte-opcode) 0))) | |
2635 | |
2636 (defun byte-compile-two-args (form) | |
2637 (if (not (= (length form) 3)) | |
2638 (byte-compile-subr-wrong-args form 2) | |
2639 (byte-compile-form (car (cdr form))) ;; Push the arguments | |
2640 (byte-compile-form (nth 2 form)) | |
2641 (byte-compile-out (get (car form) 'byte-opcode) 0))) | |
2642 | |
2643 (defun byte-compile-three-args (form) | |
2644 (if (not (= (length form) 4)) | |
2645 (byte-compile-subr-wrong-args form 3) | |
2646 (byte-compile-form (car (cdr form))) ;; Push the arguments | |
2647 (byte-compile-form (nth 2 form)) | |
2648 (byte-compile-form (nth 3 form)) | |
2649 (byte-compile-out (get (car form) 'byte-opcode) 0))) | |
2650 | |
2651 (defun byte-compile-zero-or-one-arg (form) | |
2652 (let ((len (length form))) | |
2653 (cond ((= len 1) (byte-compile-one-arg (append form '(nil)))) | |
2654 ((= len 2) (byte-compile-one-arg form)) | |
2655 (t (byte-compile-subr-wrong-args form "0-1"))))) | |
2656 | |
2657 (defun byte-compile-one-or-two-args (form) | |
2658 (let ((len (length form))) | |
2659 (cond ((= len 2) (byte-compile-two-args (append form '(nil)))) | |
2660 ((= len 3) (byte-compile-two-args form)) | |
2661 (t (byte-compile-subr-wrong-args form "1-2"))))) | |
2662 | |
2663 (defun byte-compile-two-or-three-args (form) | |
2664 (let ((len (length form))) | |
2665 (cond ((= len 3) (byte-compile-three-args (append form '(nil)))) | |
2666 ((= len 4) (byte-compile-three-args form)) | |
2667 (t (byte-compile-subr-wrong-args form "2-3"))))) | |
2668 | |
2669 (defun byte-compile-noop (form) | |
2670 (byte-compile-constant nil)) | |
2671 | |
2672 (defun byte-compile-discard () | |
2673 (byte-compile-out 'byte-discard 0)) | |
2674 | |
2675 | |
2676 ;; Compile a function that accepts one or more args and is right-associative. | |
13474
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2677 ;; We do it by left-associativity so that the operations |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2678 ;; are done in the same order as in interpreted code. |
15972
b741b3129c1b
(byte-compile-associative): Treat one arg case like (+ x 0).
Richard M. Stallman <rms@gnu.org>
parents:
15954
diff
changeset
|
2679 ;; We treat the one-arg case, as in (+ x), like (+ x 0). |
b741b3129c1b
(byte-compile-associative): Treat one arg case like (+ x 0).
Richard M. Stallman <rms@gnu.org>
parents:
15954
diff
changeset
|
2680 ;; in order to convert markers to numbers, and trigger expected errors. |
757 | 2681 (defun byte-compile-associative (form) |
2682 (if (cdr form) | |
13474
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2683 (let ((opcode (get (car form) 'byte-opcode)) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2684 (args (copy-sequence (cdr form)))) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2685 (byte-compile-form (car args)) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2686 (setq args (cdr args)) |
15972
b741b3129c1b
(byte-compile-associative): Treat one arg case like (+ x 0).
Richard M. Stallman <rms@gnu.org>
parents:
15954
diff
changeset
|
2687 (or args (setq args '(0) |
b741b3129c1b
(byte-compile-associative): Treat one arg case like (+ x 0).
Richard M. Stallman <rms@gnu.org>
parents:
15954
diff
changeset
|
2688 opcode (get '+ 'byte-opcode))) |
13474
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2689 (while args |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2690 (byte-compile-form (car args)) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2691 (byte-compile-out opcode 0) |
3e7f6fdc234d
(byte-compile-associative): Do operations left to right.
Richard M. Stallman <rms@gnu.org>
parents:
13403
diff
changeset
|
2692 (setq args (cdr args)))) |
757 | 2693 (byte-compile-constant (eval form)))) |
2694 | |
2695 | |
2696 ;; more complicated compiler macros | |
2697 | |
2698 (byte-defop-compiler list) | |
2699 (byte-defop-compiler concat) | |
2700 (byte-defop-compiler fset) | |
2701 (byte-defop-compiler (indent-to-column byte-indent-to) byte-compile-indent-to) | |
2702 (byte-defop-compiler indent-to) | |
2703 (byte-defop-compiler insert) | |
2704 (byte-defop-compiler-1 function byte-compile-function-form) | |
2705 (byte-defop-compiler-1 - byte-compile-minus) | |
2706 (byte-defop-compiler19 (/ byte-quo) byte-compile-quo) | |
2707 (byte-defop-compiler19 nconc) | |
2708 | |
2709 (defun byte-compile-list (form) | |
2710 (let ((count (length (cdr form)))) | |
2711 (cond ((= count 0) | |
2712 (byte-compile-constant nil)) | |
2713 ((< count 5) | |
29239
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
2714 (mapc 'byte-compile-form (cdr form)) |
757 | 2715 (byte-compile-out |
2716 (aref [byte-list1 byte-list2 byte-list3 byte-list4] (1- count)) 0)) | |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
2717 ((and (< count 256) (not (byte-compile-version-cond |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
2718 byte-compile-compatibility))) |
29239
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
2719 (mapc 'byte-compile-form (cdr form)) |
757 | 2720 (byte-compile-out 'byte-listN count)) |
2721 (t (byte-compile-normal-call form))))) | |
2722 | |
2723 (defun byte-compile-concat (form) | |
2724 (let ((count (length (cdr form)))) | |
2725 (cond ((and (< 1 count) (< count 5)) | |
29239
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
2726 (mapc 'byte-compile-form (cdr form)) |
757 | 2727 (byte-compile-out |
2728 (aref [byte-concat2 byte-concat3 byte-concat4] (- count 2)) | |
2729 0)) | |
2730 ;; Concat of one arg is not a no-op if arg is not a string. | |
2731 ((= count 0) | |
2732 (byte-compile-form "")) | |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
2733 ((and (< count 256) (not (byte-compile-version-cond |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
2734 byte-compile-compatibility))) |
29239
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
2735 (mapc 'byte-compile-form (cdr form)) |
757 | 2736 (byte-compile-out 'byte-concatN count)) |
2737 ((byte-compile-normal-call form))))) | |
2738 | |
2739 (defun byte-compile-minus (form) | |
2740 (if (null (setq form (cdr form))) | |
2741 (byte-compile-constant 0) | |
2742 (byte-compile-form (car form)) | |
2743 (if (cdr form) | |
2744 (while (setq form (cdr form)) | |
2745 (byte-compile-form (car form)) | |
2746 (byte-compile-out 'byte-diff 0)) | |
2747 (byte-compile-out 'byte-negate 0)))) | |
2748 | |
2749 (defun byte-compile-quo (form) | |
2750 (let ((len (length form))) | |
2751 (cond ((<= len 2) | |
2752 (byte-compile-subr-wrong-args form "2 or more")) | |
2753 (t | |
2754 (byte-compile-form (car (setq form (cdr form)))) | |
2755 (while (setq form (cdr form)) | |
2756 (byte-compile-form (car form)) | |
2757 (byte-compile-out 'byte-quo 0)))))) | |
2758 | |
2759 (defun byte-compile-nconc (form) | |
2760 (let ((len (length form))) | |
2761 (cond ((= len 1) | |
2762 (byte-compile-constant nil)) | |
2763 ((= len 2) | |
2764 ;; nconc of one arg is a noop, even if that arg isn't a list. | |
2765 (byte-compile-form (nth 1 form))) | |
2766 (t | |
2767 (byte-compile-form (car (setq form (cdr form)))) | |
2768 (while (setq form (cdr form)) | |
2769 (byte-compile-form (car form)) | |
2770 (byte-compile-out 'byte-nconc 0)))))) | |
2771 | |
2772 (defun byte-compile-fset (form) | |
2773 ;; warn about forms like (fset 'foo '(lambda () ...)) | |
2774 ;; (where the lambda expression is non-trivial...) | |
2775 (let ((fn (nth 2 form)) | |
2776 body) | |
2777 (if (and (eq (car-safe fn) 'quote) | |
2778 (eq (car-safe (setq fn (nth 1 fn))) 'lambda)) | |
2779 (progn | |
2780 (setq body (cdr (cdr fn))) | |
2781 (if (stringp (car body)) (setq body (cdr body))) | |
2782 (if (eq 'interactive (car-safe (car body))) (setq body (cdr body))) | |
2783 (if (and (consp (car body)) | |
2784 (not (eq 'byte-code (car (car body))))) | |
2785 (byte-compile-warn | |
2786 "A quoted lambda form is the second argument of fset. This is probably | |
2787 not what you want, as that lambda cannot be compiled. Consider using | |
2788 the syntax (function (lambda (...) ...)) instead."))))) | |
2789 (byte-compile-two-args form)) | |
2790 | |
2791 (defun byte-compile-funarg (form) | |
2792 ;; (mapcar '(lambda (x) ..) ..) ==> (mapcar (function (lambda (x) ..)) ..) | |
3591
507f64624555
Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents:
3455
diff
changeset
|
2793 ;; for cases where it's guaranteed that first arg will be used as a lambda. |
757 | 2794 (byte-compile-normal-call |
2795 (let ((fn (nth 1 form))) | |
2796 (if (and (eq (car-safe fn) 'quote) | |
2797 (eq (car-safe (nth 1 fn)) 'lambda)) | |
2798 (cons (car form) | |
2799 (cons (cons 'function (cdr fn)) | |
2800 (cdr (cdr form)))) | |
2801 form)))) | |
2802 | |
15953
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2803 (defun byte-compile-funarg-2 (form) |
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2804 ;; (sort ... '(lambda (x) ..)) ==> (sort ... (function (lambda (x) ..))) |
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2805 ;; for cases where it's guaranteed that second arg will be used as a lambda. |
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2806 (byte-compile-normal-call |
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2807 (let ((fn (nth 2 form))) |
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2808 (if (and (eq (car-safe fn) 'quote) |
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2809 (eq (car-safe (nth 1 fn)) 'lambda)) |
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2810 (cons (car form) |
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2811 (cons (nth 1 form) |
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2812 (cons (cons 'function (cdr fn)) |
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2813 (cdr (cdr (cdr form)))))) |
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2814 form)))) |
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2815 |
757 | 2816 ;; (function foo) must compile like 'foo, not like (symbol-function 'foo). |
2817 ;; Otherwise it will be incompatible with the interpreter, | |
2818 ;; and (funcall (function foo)) will lose with autoloads. | |
2819 | |
2820 (defun byte-compile-function-form (form) | |
2821 (byte-compile-constant | |
2822 (cond ((symbolp (nth 1 form)) | |
2823 (nth 1 form)) | |
2824 ;; If we're not allowed to use #[] syntax, then output a form like | |
2825 ;; '(lambda (..) (byte-code ..)) instead of a call to make-byte-code. | |
2826 ;; In this situation, calling make-byte-code at run-time will usually | |
2827 ;; be less efficient than processing a call to byte-code. | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
2828 ((byte-compile-version-cond byte-compile-compatibility) |
757 | 2829 (byte-compile-byte-code-unmake (byte-compile-lambda (nth 1 form)))) |
2830 ((byte-compile-lambda (nth 1 form)))))) | |
2831 | |
2832 (defun byte-compile-indent-to (form) | |
2833 (let ((len (length form))) | |
2834 (cond ((= len 2) | |
2835 (byte-compile-form (car (cdr form))) | |
2836 (byte-compile-out 'byte-indent-to 0)) | |
2837 ((= len 3) | |
2838 ;; no opcode for 2-arg case. | |
2839 (byte-compile-normal-call form)) | |
2840 (t | |
2841 (byte-compile-subr-wrong-args form "1-2"))))) | |
2842 | |
2843 (defun byte-compile-insert (form) | |
2844 (cond ((null (cdr form)) | |
2845 (byte-compile-constant nil)) | |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
2846 ((and (not (byte-compile-version-cond |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
2847 byte-compile-compatibility)) |
757 | 2848 (<= (length form) 256)) |
29239
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
2849 (mapc 'byte-compile-form (cdr form)) |
757 | 2850 (if (cdr (cdr form)) |
2851 (byte-compile-out 'byte-insertN (length (cdr form))) | |
2852 (byte-compile-out 'byte-insert 0))) | |
2853 ((memq t (mapcar 'consp (cdr (cdr form)))) | |
2854 (byte-compile-normal-call form)) | |
2855 ;; We can split it; there is no function call after inserting 1st arg. | |
2856 (t | |
2857 (while (setq form (cdr form)) | |
2858 (byte-compile-form (car form)) | |
2859 (byte-compile-out 'byte-insert 0) | |
2860 (if (cdr form) | |
2861 (byte-compile-discard)))))) | |
2862 | |
2863 | |
2864 (byte-defop-compiler-1 setq) | |
2865 (byte-defop-compiler-1 setq-default) | |
2866 (byte-defop-compiler-1 quote) | |
2867 (byte-defop-compiler-1 quote-form) | |
2868 | |
2869 (defun byte-compile-setq (form) | |
2870 (let ((args (cdr form))) | |
2871 (if args | |
2872 (while args | |
2873 (byte-compile-form (car (cdr args))) | |
2874 (or for-effect (cdr (cdr args)) | |
2875 (byte-compile-out 'byte-dup 0)) | |
2876 (byte-compile-variable-ref 'byte-varset (car args)) | |
2877 (setq args (cdr (cdr args)))) | |
2878 ;; (setq), with no arguments. | |
2879 (byte-compile-form nil for-effect)) | |
2880 (setq for-effect nil))) | |
2881 | |
2882 (defun byte-compile-setq-default (form) | |
4049
7908fc6e4fb9
(byte-compile-setq-default):
Richard M. Stallman <rms@gnu.org>
parents:
4013
diff
changeset
|
2883 (let ((args (cdr form)) |
7908fc6e4fb9
(byte-compile-setq-default):
Richard M. Stallman <rms@gnu.org>
parents:
4013
diff
changeset
|
2884 setters) |
7908fc6e4fb9
(byte-compile-setq-default):
Richard M. Stallman <rms@gnu.org>
parents:
4013
diff
changeset
|
2885 (while args |
7908fc6e4fb9
(byte-compile-setq-default):
Richard M. Stallman <rms@gnu.org>
parents:
4013
diff
changeset
|
2886 (setq setters |
7908fc6e4fb9
(byte-compile-setq-default):
Richard M. Stallman <rms@gnu.org>
parents:
4013
diff
changeset
|
2887 (cons (list 'set-default (list 'quote (car args)) (car (cdr args))) |
7908fc6e4fb9
(byte-compile-setq-default):
Richard M. Stallman <rms@gnu.org>
parents:
4013
diff
changeset
|
2888 setters)) |
7908fc6e4fb9
(byte-compile-setq-default):
Richard M. Stallman <rms@gnu.org>
parents:
4013
diff
changeset
|
2889 (setq args (cdr (cdr args)))) |
7908fc6e4fb9
(byte-compile-setq-default):
Richard M. Stallman <rms@gnu.org>
parents:
4013
diff
changeset
|
2890 (byte-compile-form (cons 'progn (nreverse setters))))) |
757 | 2891 |
2892 (defun byte-compile-quote (form) | |
2893 (byte-compile-constant (car (cdr form)))) | |
2894 | |
2895 (defun byte-compile-quote-form (form) | |
2896 (byte-compile-constant (byte-compile-top-level (nth 1 form)))) | |
2897 | |
2898 | |
2899 ;;; control structures | |
2900 | |
2901 (defun byte-compile-body (body &optional for-effect) | |
2902 (while (cdr body) | |
2903 (byte-compile-form (car body) t) | |
2904 (setq body (cdr body))) | |
2905 (byte-compile-form (car body) for-effect)) | |
2906 | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
2907 (defsubst byte-compile-body-do-effect (body) |
757 | 2908 (byte-compile-body body for-effect) |
2909 (setq for-effect nil)) | |
2910 | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
2911 (defsubst byte-compile-form-do-effect (form) |
757 | 2912 (byte-compile-form form for-effect) |
2913 (setq for-effect nil)) | |
2914 | |
2915 (byte-defop-compiler-1 inline byte-compile-progn) | |
2916 (byte-defop-compiler-1 progn) | |
2917 (byte-defop-compiler-1 prog1) | |
2918 (byte-defop-compiler-1 prog2) | |
2919 (byte-defop-compiler-1 if) | |
2920 (byte-defop-compiler-1 cond) | |
2921 (byte-defop-compiler-1 and) | |
2922 (byte-defop-compiler-1 or) | |
2923 (byte-defop-compiler-1 while) | |
2924 (byte-defop-compiler-1 funcall) | |
2925 (byte-defop-compiler-1 apply byte-compile-funarg) | |
2926 (byte-defop-compiler-1 mapcar byte-compile-funarg) | |
2927 (byte-defop-compiler-1 mapatoms byte-compile-funarg) | |
2928 (byte-defop-compiler-1 mapconcat byte-compile-funarg) | |
31211 | 2929 (byte-defop-compiler-1 mapc byte-compile-funarg) |
15953
38a50022d610
(byte-compile-funarg-2): New function,
Richard M. Stallman <rms@gnu.org>
parents:
15930
diff
changeset
|
2930 (byte-defop-compiler-1 sort byte-compile-funarg-2) |
757 | 2931 (byte-defop-compiler-1 let) |
2932 (byte-defop-compiler-1 let*) | |
2933 | |
2934 (defun byte-compile-progn (form) | |
2935 (byte-compile-body-do-effect (cdr form))) | |
2936 | |
2937 (defun byte-compile-prog1 (form) | |
2938 (byte-compile-form-do-effect (car (cdr form))) | |
2939 (byte-compile-body (cdr (cdr form)) t)) | |
2940 | |
2941 (defun byte-compile-prog2 (form) | |
2942 (byte-compile-form (nth 1 form) t) | |
2943 (byte-compile-form-do-effect (nth 2 form)) | |
2944 (byte-compile-body (cdr (cdr (cdr form))) t)) | |
2945 | |
2946 (defmacro byte-compile-goto-if (cond discard tag) | |
27824 | 2947 `(byte-compile-goto |
2948 (if ,cond | |
2949 (if ,discard 'byte-goto-if-not-nil 'byte-goto-if-not-nil-else-pop) | |
2950 (if ,discard 'byte-goto-if-nil 'byte-goto-if-nil-else-pop)) | |
2951 ,tag)) | |
757 | 2952 |
2953 (defun byte-compile-if (form) | |
2954 (byte-compile-form (car (cdr form))) | |
2955 (if (null (nthcdr 3 form)) | |
2956 ;; No else-forms | |
2957 (let ((donetag (byte-compile-make-tag))) | |
2958 (byte-compile-goto-if nil for-effect donetag) | |
2959 (byte-compile-form (nth 2 form) for-effect) | |
2960 (byte-compile-out-tag donetag)) | |
2961 (let ((donetag (byte-compile-make-tag)) (elsetag (byte-compile-make-tag))) | |
2962 (byte-compile-goto 'byte-goto-if-nil elsetag) | |
2963 (byte-compile-form (nth 2 form) for-effect) | |
2964 (byte-compile-goto 'byte-goto donetag) | |
2965 (byte-compile-out-tag elsetag) | |
2966 (byte-compile-body (cdr (cdr (cdr form))) for-effect) | |
2967 (byte-compile-out-tag donetag))) | |
2968 (setq for-effect nil)) | |
2969 | |
2970 (defun byte-compile-cond (clauses) | |
2971 (let ((donetag (byte-compile-make-tag)) | |
2972 nexttag clause) | |
2973 (while (setq clauses (cdr clauses)) | |
2974 (setq clause (car clauses)) | |
2975 (cond ((or (eq (car clause) t) | |
2976 (and (eq (car-safe (car clause)) 'quote) | |
2977 (car-safe (cdr-safe (car clause))))) | |
2978 ;; Unconditional clause | |
2979 (setq clause (cons t clause) | |
2980 clauses nil)) | |
2981 ((cdr clauses) | |
2982 (byte-compile-form (car clause)) | |
2983 (if (null (cdr clause)) | |
2984 ;; First clause is a singleton. | |
2985 (byte-compile-goto-if t for-effect donetag) | |
2986 (setq nexttag (byte-compile-make-tag)) | |
2987 (byte-compile-goto 'byte-goto-if-nil nexttag) | |
2988 (byte-compile-body (cdr clause) for-effect) | |
2989 (byte-compile-goto 'byte-goto donetag) | |
2990 (byte-compile-out-tag nexttag))))) | |
2991 ;; Last clause | |
2992 (and (cdr clause) (not (eq (car clause) t)) | |
2993 (progn (byte-compile-form (car clause)) | |
2994 (byte-compile-goto-if nil for-effect donetag) | |
2995 (setq clause (cdr clause)))) | |
2996 (byte-compile-body-do-effect clause) | |
2997 (byte-compile-out-tag donetag))) | |
2998 | |
2999 (defun byte-compile-and (form) | |
3000 (let ((failtag (byte-compile-make-tag)) | |
3001 (args (cdr form))) | |
3002 (if (null args) | |
3003 (byte-compile-form-do-effect t) | |
3004 (while (cdr args) | |
3005 (byte-compile-form (car args)) | |
3006 (byte-compile-goto-if nil for-effect failtag) | |
3007 (setq args (cdr args))) | |
3008 (byte-compile-form-do-effect (car args)) | |
3009 (byte-compile-out-tag failtag)))) | |
3010 | |
3011 (defun byte-compile-or (form) | |
3012 (let ((wintag (byte-compile-make-tag)) | |
3013 (args (cdr form))) | |
3014 (if (null args) | |
3015 (byte-compile-form-do-effect nil) | |
3016 (while (cdr args) | |
3017 (byte-compile-form (car args)) | |
3018 (byte-compile-goto-if t for-effect wintag) | |
3019 (setq args (cdr args))) | |
3020 (byte-compile-form-do-effect (car args)) | |
3021 (byte-compile-out-tag wintag)))) | |
3022 | |
3023 (defun byte-compile-while (form) | |
3024 (let ((endtag (byte-compile-make-tag)) | |
3025 (looptag (byte-compile-make-tag))) | |
3026 (byte-compile-out-tag looptag) | |
3027 (byte-compile-form (car (cdr form))) | |
3028 (byte-compile-goto-if nil for-effect endtag) | |
3029 (byte-compile-body (cdr (cdr form)) t) | |
3030 (byte-compile-goto 'byte-goto looptag) | |
3031 (byte-compile-out-tag endtag) | |
3032 (setq for-effect nil))) | |
3033 | |
3034 (defun byte-compile-funcall (form) | |
29239
86949998e6fd
(byte-compile-callargs-warn): Use subr-arity to check primitives.
Dave Love <fx@gnu.org>
parents:
28441
diff
changeset
|
3035 (mapc 'byte-compile-form (cdr form)) |
757 | 3036 (byte-compile-out 'byte-call (length (cdr (cdr form))))) |
3037 | |
3038 | |
3039 (defun byte-compile-let (form) | |
3040 ;; First compute the binding values in the old scope. | |
3041 (let ((varlist (car (cdr form)))) | |
3042 (while varlist | |
3043 (if (consp (car varlist)) | |
3044 (byte-compile-form (car (cdr (car varlist)))) | |
3045 (byte-compile-push-constant nil)) | |
3046 (setq varlist (cdr varlist)))) | |
3047 (let ((byte-compile-bound-variables byte-compile-bound-variables) ;new scope | |
3048 (varlist (reverse (car (cdr form))))) | |
3049 (while varlist | |
3050 (byte-compile-variable-ref 'byte-varbind (if (consp (car varlist)) | |
3051 (car (car varlist)) | |
3052 (car varlist))) | |
3053 (setq varlist (cdr varlist))) | |
3054 (byte-compile-body-do-effect (cdr (cdr form))) | |
3055 (byte-compile-out 'byte-unbind (length (car (cdr form)))))) | |
3056 | |
3057 (defun byte-compile-let* (form) | |
3058 (let ((byte-compile-bound-variables byte-compile-bound-variables) ;new scope | |
3059 (varlist (copy-sequence (car (cdr form))))) | |
3060 (while varlist | |
3061 (if (atom (car varlist)) | |
3062 (byte-compile-push-constant nil) | |
3063 (byte-compile-form (car (cdr (car varlist)))) | |
3064 (setcar varlist (car (car varlist)))) | |
3065 (byte-compile-variable-ref 'byte-varbind (car varlist)) | |
3066 (setq varlist (cdr varlist))) | |
3067 (byte-compile-body-do-effect (cdr (cdr form))) | |
3068 (byte-compile-out 'byte-unbind (length (car (cdr form)))))) | |
3069 | |
3070 | |
3071 (byte-defop-compiler-1 /= byte-compile-negated) | |
3072 (byte-defop-compiler-1 atom byte-compile-negated) | |
3073 (byte-defop-compiler-1 nlistp byte-compile-negated) | |
3074 | |
3075 (put '/= 'byte-compile-negated-op '=) | |
3076 (put 'atom 'byte-compile-negated-op 'consp) | |
3077 (put 'nlistp 'byte-compile-negated-op 'listp) | |
3078 | |
3079 (defun byte-compile-negated (form) | |
3080 (byte-compile-form-do-effect (byte-compile-negation-optimizer form))) | |
3081 | |
3082 ;; Even when optimization is off, /= is optimized to (not (= ...)). | |
3083 (defun byte-compile-negation-optimizer (form) | |
3084 ;; an optimizer for forms where <form1> is less efficient than (not <form2>) | |
3085 (list 'not | |
3086 (cons (or (get (car form) 'byte-compile-negated-op) | |
3087 (error | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3088 "Compiler error: `%s' has no `byte-compile-negated-op' property" |
757 | 3089 (car form))) |
3090 (cdr form)))) | |
3091 | |
3092 ;;; other tricky macro-like special-forms | |
3093 | |
3094 (byte-defop-compiler-1 catch) | |
3095 (byte-defop-compiler-1 unwind-protect) | |
3096 (byte-defop-compiler-1 condition-case) | |
3097 (byte-defop-compiler-1 save-excursion) | |
16274
e9819849c533
(save-current-buffer): Compile it like save-excursion.
Richard M. Stallman <rms@gnu.org>
parents:
16232
diff
changeset
|
3098 (byte-defop-compiler-1 save-current-buffer) |
757 | 3099 (byte-defop-compiler-1 save-restriction) |
3100 (byte-defop-compiler-1 save-window-excursion) | |
3101 (byte-defop-compiler-1 with-output-to-temp-buffer) | |
2798
e2f296263868
(byte-compile-track-mouse): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2735
diff
changeset
|
3102 (byte-defop-compiler-1 track-mouse) |
757 | 3103 |
3104 (defun byte-compile-catch (form) | |
3105 (byte-compile-form (car (cdr form))) | |
3106 (byte-compile-push-constant | |
3107 (byte-compile-top-level (cons 'progn (cdr (cdr form))) for-effect)) | |
3108 (byte-compile-out 'byte-catch 0)) | |
3109 | |
3110 (defun byte-compile-unwind-protect (form) | |
3111 (byte-compile-push-constant | |
3112 (byte-compile-top-level-body (cdr (cdr form)) t)) | |
3113 (byte-compile-out 'byte-unwind-protect 0) | |
3114 (byte-compile-form-do-effect (car (cdr form))) | |
3115 (byte-compile-out 'byte-unbind 1)) | |
3116 | |
2798
e2f296263868
(byte-compile-track-mouse): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2735
diff
changeset
|
3117 (defun byte-compile-track-mouse (form) |
6293
649c8a929063
(byte-compile-track-mouse): Undo previous change,
Richard M. Stallman <rms@gnu.org>
parents:
6217
diff
changeset
|
3118 (byte-compile-form |
649c8a929063
(byte-compile-track-mouse): Undo previous change,
Richard M. Stallman <rms@gnu.org>
parents:
6217
diff
changeset
|
3119 (list |
649c8a929063
(byte-compile-track-mouse): Undo previous change,
Richard M. Stallman <rms@gnu.org>
parents:
6217
diff
changeset
|
3120 'funcall |
649c8a929063
(byte-compile-track-mouse): Undo previous change,
Richard M. Stallman <rms@gnu.org>
parents:
6217
diff
changeset
|
3121 (list 'quote |
649c8a929063
(byte-compile-track-mouse): Undo previous change,
Richard M. Stallman <rms@gnu.org>
parents:
6217
diff
changeset
|
3122 (list 'lambda nil |
649c8a929063
(byte-compile-track-mouse): Undo previous change,
Richard M. Stallman <rms@gnu.org>
parents:
6217
diff
changeset
|
3123 (cons 'track-mouse |
649c8a929063
(byte-compile-track-mouse): Undo previous change,
Richard M. Stallman <rms@gnu.org>
parents:
6217
diff
changeset
|
3124 (byte-compile-top-level-body (cdr form)))))))) |
2798
e2f296263868
(byte-compile-track-mouse): New function.
Richard M. Stallman <rms@gnu.org>
parents:
2735
diff
changeset
|
3125 |
757 | 3126 (defun byte-compile-condition-case (form) |
3127 (let* ((var (nth 1 form)) | |
3128 (byte-compile-bound-variables | |
3129 (if var (cons var byte-compile-bound-variables) | |
3130 byte-compile-bound-variables))) | |
3131 (or (symbolp var) | |
3132 (byte-compile-warn | |
3133 "%s is not a variable-name or nil (in condition-case)" var)) | |
3134 (byte-compile-push-constant var) | |
3135 (byte-compile-push-constant (byte-compile-top-level | |
3136 (nth 2 form) for-effect)) | |
3137 (let ((clauses (cdr (cdr (cdr form)))) | |
3138 compiled-clauses) | |
3139 (while clauses | |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3140 (let* ((clause (car clauses)) |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3141 (condition (car clause))) |
5562
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3142 (cond ((not (or (symbolp condition) |
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3143 (and (listp condition) |
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3144 (let ((syms condition) (ok t)) |
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3145 (while syms |
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3146 (if (not (symbolp (car syms))) |
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3147 (setq ok nil)) |
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3148 (setq syms (cdr syms))) |
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3149 ok)))) |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3150 (byte-compile-warn |
5562
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3151 "%s is not a condition name or list of such (in condition-case)" |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3152 (prin1-to-string condition))) |
5562
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3153 ;; ((not (or (eq condition 't) |
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3154 ;; (and (stringp (get condition 'error-message)) |
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3155 ;; (consp (get condition 'error-conditions))))) |
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3156 ;; (byte-compile-warn |
28402 | 3157 ;; "%s is not a known condition name (in condition-case)" |
5562
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3158 ;; condition)) |
2b3d2ea74ce1
(byte-compile-condition-case): Disable warning about
Richard M. Stallman <rms@gnu.org>
parents:
5454
diff
changeset
|
3159 ) |
757 | 3160 (setq compiled-clauses |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3161 (cons (cons condition |
757 | 3162 (byte-compile-top-level-body |
3163 (cdr clause) for-effect)) | |
3164 compiled-clauses))) | |
3165 (setq clauses (cdr clauses))) | |
3166 (byte-compile-push-constant (nreverse compiled-clauses))) | |
3167 (byte-compile-out 'byte-condition-case 0))) | |
3168 | |
3169 | |
3170 (defun byte-compile-save-excursion (form) | |
3171 (byte-compile-out 'byte-save-excursion 0) | |
3172 (byte-compile-body-do-effect (cdr form)) | |
3173 (byte-compile-out 'byte-unbind 1)) | |
3174 | |
3175 (defun byte-compile-save-restriction (form) | |
3176 (byte-compile-out 'byte-save-restriction 0) | |
3177 (byte-compile-body-do-effect (cdr form)) | |
3178 (byte-compile-out 'byte-unbind 1)) | |
3179 | |
16274
e9819849c533
(save-current-buffer): Compile it like save-excursion.
Richard M. Stallman <rms@gnu.org>
parents:
16232
diff
changeset
|
3180 (defun byte-compile-save-current-buffer (form) |
e9819849c533
(save-current-buffer): Compile it like save-excursion.
Richard M. Stallman <rms@gnu.org>
parents:
16232
diff
changeset
|
3181 (byte-compile-out 'byte-save-current-buffer 0) |
e9819849c533
(save-current-buffer): Compile it like save-excursion.
Richard M. Stallman <rms@gnu.org>
parents:
16232
diff
changeset
|
3182 (byte-compile-body-do-effect (cdr form)) |
e9819849c533
(save-current-buffer): Compile it like save-excursion.
Richard M. Stallman <rms@gnu.org>
parents:
16232
diff
changeset
|
3183 (byte-compile-out 'byte-unbind 1)) |
e9819849c533
(save-current-buffer): Compile it like save-excursion.
Richard M. Stallman <rms@gnu.org>
parents:
16232
diff
changeset
|
3184 |
757 | 3185 (defun byte-compile-save-window-excursion (form) |
3186 (byte-compile-push-constant | |
3187 (byte-compile-top-level-body (cdr form) for-effect)) | |
3188 (byte-compile-out 'byte-save-window-excursion 0)) | |
3189 | |
3190 (defun byte-compile-with-output-to-temp-buffer (form) | |
3191 (byte-compile-form (car (cdr form))) | |
3192 (byte-compile-out 'byte-temp-output-buffer-setup 0) | |
3193 (byte-compile-body (cdr (cdr form))) | |
3194 (byte-compile-out 'byte-temp-output-buffer-show 0)) | |
3195 | |
3196 | |
3197 ;;; top-level forms elsewhere | |
3198 | |
3199 (byte-defop-compiler-1 defun) | |
3200 (byte-defop-compiler-1 defmacro) | |
3201 (byte-defop-compiler-1 defvar) | |
3202 (byte-defop-compiler-1 defconst byte-compile-defvar) | |
3203 (byte-defop-compiler-1 autoload) | |
3204 (byte-defop-compiler-1 lambda byte-compile-lambda-form) | |
8086
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3205 (byte-defop-compiler-1 defalias) |
757 | 3206 |
3207 (defun byte-compile-defun (form) | |
3208 ;; This is not used for file-level defuns with doc strings. | |
3209 (byte-compile-two-args ; Use this to avoid byte-compile-fset's warning. | |
3210 (list 'fset (list 'quote (nth 1 form)) | |
3211 (byte-compile-byte-code-maker | |
3212 (byte-compile-lambda (cons 'lambda (cdr (cdr form))))))) | |
3213 (byte-compile-discard) | |
3214 (byte-compile-constant (nth 1 form))) | |
3215 | |
3216 (defun byte-compile-defmacro (form) | |
3217 ;; This is not used for file-level defmacros with doc strings. | |
3218 (byte-compile-body-do-effect | |
3219 (list (list 'fset (list 'quote (nth 1 form)) | |
3220 (let ((code (byte-compile-byte-code-maker | |
3221 (byte-compile-lambda | |
3222 (cons 'lambda (cdr (cdr form))))))) | |
3223 (if (eq (car-safe code) 'make-byte-code) | |
3224 (list 'cons ''macro code) | |
3225 (list 'quote (cons 'macro (eval code)))))) | |
3226 (list 'quote (nth 1 form))))) | |
3227 | |
3228 (defun byte-compile-defvar (form) | |
3229 ;; This is not used for file-level defvar/consts with doc strings. | |
31882
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3230 (let ((fun (nth 0 form)) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3231 (var (nth 1 form)) |
757 | 3232 (value (nth 2 form)) |
3233 (string (nth 3 form))) | |
31882
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3234 (when (> (length form) 4) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3235 (byte-compile-warn |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3236 "%s %s called with %d arguments, but accepts only %s" |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3237 fun var (length (cdr form)) 3)) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3238 (when (memq 'free-vars byte-compile-warnings) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3239 (setq byte-compile-bound-variables |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3240 (cons var byte-compile-bound-variables))) |
757 | 3241 (byte-compile-body-do-effect |
31882
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3242 (list |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3243 ;; Put the defined variable in this library's load-history entry |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3244 ;; just as a real defvar would, but only in top-level forms. |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3245 (when (null byte-compile-current-form) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3246 `(push ',var current-load-list)) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3247 (when (> (length form) 3) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3248 (when (and string (not (stringp string))) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3249 (byte-compile-warn "Third arg to %s %s is not a string: %s" |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3250 fun var string)) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3251 `(put ',var 'variable-documentation ,string)) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3252 (if (cdr (cdr form)) ; `value' provided |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3253 (if (eq fun 'defconst) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3254 ;; `defconst' sets `var' unconditionally. |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3255 `(setq ,var ,value) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3256 ;; `defvar' sets `var' only when unbound. |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3257 `(if (not (boundp ',var)) (setq ,var ,value)))) |
02bf229fa2be
(byte-compile-defvar-or-defconst): Only cons onto
Gerd Moellmann <gerd@gnu.org>
parents:
31552
diff
changeset
|
3258 `',var)))) |
757 | 3259 |
3260 (defun byte-compile-autoload (form) | |
3261 (and (byte-compile-constp (nth 1 form)) | |
3262 (byte-compile-constp (nth 5 form)) | |
3263 (eval (nth 5 form)) ; macro-p | |
3264 (not (fboundp (eval (nth 1 form)))) | |
3265 (byte-compile-warn | |
28402 | 3266 "The compiler ignores `autoload' except at top level. You should |
757 | 3267 probably put the autoload of the macro `%s' at top-level." |
3268 (eval (nth 1 form)))) | |
3269 (byte-compile-normal-call form)) | |
3270 | |
28402 | 3271 ;; Lambdas in valid places are handled as special cases by various code. |
757 | 3272 ;; The ones that remain are errors. |
3273 (defun byte-compile-lambda-form (form) | |
3274 (error "`lambda' used as function name is invalid")) | |
3275 | |
8086
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3276 ;; Compile normally, but deal with warnings for the function being defined. |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3277 (defun byte-compile-defalias (form) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3278 (if (and (consp (cdr form)) (consp (nth 1 form)) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3279 (eq (car (nth 1 form)) 'quote) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3280 (consp (cdr (nth 1 form))) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3281 (symbolp (nth 1 (nth 1 form))) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3282 (consp (nthcdr 2 form)) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3283 (consp (nth 2 form)) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3284 (eq (car (nth 2 form)) 'quote) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3285 (consp (cdr (nth 2 form))) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3286 (symbolp (nth 1 (nth 2 form)))) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3287 (progn |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3288 (byte-compile-defalias-warn (nth 1 (nth 1 form)) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3289 (nth 1 (nth 2 form))) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3290 (setq byte-compile-function-environment |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3291 (cons (cons (nth 1 (nth 1 form)) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3292 (nth 1 (nth 2 form))) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3293 byte-compile-function-environment)))) |
8115
e45d541e55cf
(byte-compile-defalias): Fix typo in prev change.
Richard M. Stallman <rms@gnu.org>
parents:
8086
diff
changeset
|
3294 (byte-compile-normal-call form)) |
8086
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3295 |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3296 ;; Turn off warnings about prior calls to the function being defalias'd. |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3297 ;; This could be smarter and compare those calls with |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3298 ;; the function it is being aliased to. |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3299 (defun byte-compile-defalias-warn (new alias) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3300 (let ((calls (assq new byte-compile-unresolved-functions))) |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3301 (if calls |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3302 (setq byte-compile-unresolved-functions |
9f6348616e4d
(byte-compile-callargs-warn): Handle function defnition
Richard M. Stallman <rms@gnu.org>
parents:
7298
diff
changeset
|
3303 (delq calls byte-compile-unresolved-functions))))) |
757 | 3304 |
3305 ;;; tags | |
3306 | |
3307 ;; Note: Most operations will strip off the 'TAG, but it speeds up | |
3308 ;; optimization to have the 'TAG as a part of the tag. | |
3309 ;; Tags will be (TAG . (tag-number . stack-depth)). | |
3310 (defun byte-compile-make-tag () | |
3311 (list 'TAG (setq byte-compile-tag-number (1+ byte-compile-tag-number)))) | |
3312 | |
3313 | |
3314 (defun byte-compile-out-tag (tag) | |
3315 (setq byte-compile-output (cons tag byte-compile-output)) | |
3316 (if (cdr (cdr tag)) | |
3317 (progn | |
3318 ;; ## remove this someday | |
3319 (and byte-compile-depth | |
3320 (not (= (cdr (cdr tag)) byte-compile-depth)) | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3321 (error "Compiler bug: depth conflict at tag %d" (car (cdr tag)))) |
757 | 3322 (setq byte-compile-depth (cdr (cdr tag)))) |
3323 (setcdr (cdr tag) byte-compile-depth))) | |
3324 | |
3325 (defun byte-compile-goto (opcode tag) | |
3326 (setq byte-compile-output (cons (cons opcode tag) byte-compile-output)) | |
3327 (setcdr (cdr tag) (if (memq opcode byte-goto-always-pop-ops) | |
3328 (1- byte-compile-depth) | |
3329 byte-compile-depth)) | |
3330 (setq byte-compile-depth (and (not (eq opcode 'byte-goto)) | |
3331 (1- byte-compile-depth)))) | |
3332 | |
3333 (defun byte-compile-out (opcode offset) | |
3334 (setq byte-compile-output (cons (cons opcode offset) byte-compile-output)) | |
3335 (cond ((eq opcode 'byte-call) | |
3336 (setq byte-compile-depth (- byte-compile-depth offset))) | |
3337 ((eq opcode 'byte-return) | |
3338 ;; This is actually an unnecessary case, because there should be | |
3339 ;; no more opcodes behind byte-return. | |
3340 (setq byte-compile-depth nil)) | |
3341 (t | |
3342 (setq byte-compile-depth (+ byte-compile-depth | |
3343 (or (aref byte-stack+-info | |
3344 (symbol-value opcode)) | |
3345 (- (1- offset)))) | |
3346 byte-compile-maxdepth (max byte-compile-depth | |
3347 byte-compile-maxdepth)))) | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3348 ;;(if (< byte-compile-depth 0) (error "Compiler error: stack underflow")) |
757 | 3349 ) |
3350 | |
3351 | |
3352 ;;; call tree stuff | |
3353 | |
3354 (defun byte-compile-annotate-call-tree (form) | |
3355 (let (entry) | |
3356 ;; annotate the current call | |
3357 (if (setq entry (assq (car form) byte-compile-call-tree)) | |
3358 (or (memq byte-compile-current-form (nth 1 entry)) ;callers | |
3359 (setcar (cdr entry) | |
3360 (cons byte-compile-current-form (nth 1 entry)))) | |
3361 (setq byte-compile-call-tree | |
3362 (cons (list (car form) (list byte-compile-current-form) nil) | |
3363 byte-compile-call-tree))) | |
3364 ;; annotate the current function | |
3365 (if (setq entry (assq byte-compile-current-form byte-compile-call-tree)) | |
3366 (or (memq (car form) (nth 2 entry)) ;called | |
3367 (setcar (cdr (cdr entry)) | |
3368 (cons (car form) (nth 2 entry)))) | |
3369 (setq byte-compile-call-tree | |
3370 (cons (list byte-compile-current-form nil (list (car form))) | |
3371 byte-compile-call-tree))) | |
3372 )) | |
3373 | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3374 ;; Renamed from byte-compile-report-call-tree |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3375 ;; to avoid interfering with completion of byte-compile-file. |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
3376 ;;;###autoload |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3377 (defun display-call-tree (&optional filename) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3378 "Display a call graph of a specified file. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3379 This lists which functions have been called, what functions called |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3380 them, and what functions they call. The list includes all functions |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3381 whose definitions have been compiled in this Emacs session, as well as |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3382 all functions called by those functions. |
757 | 3383 |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3384 The call graph does not include macros, inline functions, or |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3385 primitives that the byte-code interpreter knows about directly \(eq, |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3386 cons, etc.\). |
757 | 3387 |
3388 The call tree also lists those functions which are not known to be called | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3389 \(that is, to which no calls have been compiled\), and which cannot be |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3390 invoked interactively." |
757 | 3391 (interactive) |
3392 (message "Generating call tree...") | |
3393 (with-output-to-temp-buffer "*Call-Tree*" | |
3394 (set-buffer "*Call-Tree*") | |
3395 (erase-buffer) | |
10687
1bd70186f894
(byte-compile-file-form-defmumble, display-call-tree): Print ellipsis earlier,
Karl Heuer <kwzh@gnu.org>
parents:
10514
diff
changeset
|
3396 (message "Generating call tree... (sorting on %s)" |
757 | 3397 byte-compile-call-tree-sort) |
3398 (insert "Call tree for " | |
3399 (cond ((null byte-compile-current-file) (or filename "???")) | |
3400 ((stringp byte-compile-current-file) | |
3401 byte-compile-current-file) | |
3402 (t (buffer-name byte-compile-current-file))) | |
3403 " sorted on " | |
3404 (prin1-to-string byte-compile-call-tree-sort) | |
3405 ":\n\n") | |
3406 (if byte-compile-call-tree-sort | |
3407 (setq byte-compile-call-tree | |
3408 (sort byte-compile-call-tree | |
3409 (cond ((eq byte-compile-call-tree-sort 'callers) | |
3410 (function (lambda (x y) (< (length (nth 1 x)) | |
3411 (length (nth 1 y)))))) | |
3412 ((eq byte-compile-call-tree-sort 'calls) | |
3413 (function (lambda (x y) (< (length (nth 2 x)) | |
3414 (length (nth 2 y)))))) | |
3415 ((eq byte-compile-call-tree-sort 'calls+callers) | |
3416 (function (lambda (x y) (< (+ (length (nth 1 x)) | |
3417 (length (nth 2 x))) | |
3418 (+ (length (nth 1 y)) | |
3419 (length (nth 2 y))))))) | |
3420 ((eq byte-compile-call-tree-sort 'name) | |
3421 (function (lambda (x y) (string< (car x) | |
3422 (car y))))) | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3423 (t (error "`byte-compile-call-tree-sort': `%s' - unknown sort mode" |
757 | 3424 byte-compile-call-tree-sort)))))) |
3425 (message "Generating call tree...") | |
3426 (let ((rest byte-compile-call-tree) | |
3427 (b (current-buffer)) | |
3428 f p | |
3429 callers calls) | |
3430 (while rest | |
3431 (prin1 (car (car rest)) b) | |
3432 (setq callers (nth 1 (car rest)) | |
3433 calls (nth 2 (car rest))) | |
3434 (insert "\t" | |
3435 (cond ((not (fboundp (setq f (car (car rest))))) | |
3436 (if (null f) | |
3437 " <top level>";; shouldn't insert nil then, actually -sk | |
3438 " <not defined>")) | |
3439 ((subrp (setq f (symbol-function f))) | |
3440 " <subr>") | |
3441 ((symbolp f) | |
3442 (format " ==> %s" f)) | |
1819
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
3443 ((byte-code-function-p f) |
757 | 3444 "<compiled function>") |
3445 ((not (consp f)) | |
3446 "<malformed function>") | |
3447 ((eq 'macro (car f)) | |
1819
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
3448 (if (or (byte-code-function-p (cdr f)) |
757 | 3449 (assq 'byte-code (cdr (cdr (cdr f))))) |
3450 " <compiled macro>" | |
3451 " <macro>")) | |
3452 ((assq 'byte-code (cdr (cdr f))) | |
3453 "<compiled lambda>") | |
3454 ((eq 'lambda (car f)) | |
3455 "<function>") | |
3456 (t "???")) | |
3457 (format " (%d callers + %d calls = %d)" | |
3458 ;; Does the optimizer eliminate common subexpressions?-sk | |
3459 (length callers) | |
3460 (length calls) | |
3461 (+ (length callers) (length calls))) | |
3462 "\n") | |
3463 (if callers | |
3464 (progn | |
3465 (insert " called by:\n") | |
3466 (setq p (point)) | |
3467 (insert " " (if (car callers) | |
3468 (mapconcat 'symbol-name callers ", ") | |
3469 "<top level>")) | |
3470 (let ((fill-prefix " ")) | |
3471 (fill-region-as-paragraph p (point))))) | |
3472 (if calls | |
3473 (progn | |
3474 (insert " calls:\n") | |
3475 (setq p (point)) | |
3476 (insert " " (mapconcat 'symbol-name calls ", ")) | |
3477 (let ((fill-prefix " ")) | |
3478 (fill-region-as-paragraph p (point))))) | |
3479 (insert "\n") | |
3480 (setq rest (cdr rest))) | |
3481 | |
3482 (message "Generating call tree...(finding uncalled functions...)") | |
3483 (setq rest byte-compile-call-tree) | |
3484 (let ((uncalled nil)) | |
3485 (while rest | |
3486 (or (nth 1 (car rest)) | |
3487 (null (setq f (car (car rest)))) | |
3488 (byte-compile-fdefinition f t) | |
3489 (commandp (byte-compile-fdefinition f nil)) | |
3490 (setq uncalled (cons f uncalled))) | |
3491 (setq rest (cdr rest))) | |
3492 (if uncalled | |
3493 (let ((fill-prefix " ")) | |
3494 (insert "Noninteractive functions not known to be called:\n ") | |
3495 (setq p (point)) | |
3496 (insert (mapconcat 'symbol-name (nreverse uncalled) ", ")) | |
3497 (fill-region-as-paragraph p (point))))) | |
3498 ) | |
3499 (message "Generating call tree...done.") | |
3500 )) | |
3501 | |
3502 | |
3503 ;;; by crl@newton.purdue.edu | |
3504 ;;; Only works noninteractively. | |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
3505 ;;;###autoload |
757 | 3506 (defun batch-byte-compile () |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3507 "Run `byte-compile-file' on the files remaining on the command line. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3508 Use this from the command line, with `-batch'; |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3509 it won't work in an interactive Emacs. |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3510 Each file is processed even if an error occurred previously. |
757 | 3511 For example, invoke \"emacs -batch -f batch-byte-compile $emacs/ ~/*.el\"" |
3512 ;; command-line-args-left is what is left of the command line (from startup.el) | |
3513 (defvar command-line-args-left) ;Avoid 'free variable' warning | |
3514 (if (not noninteractive) | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3515 (error "`batch-byte-compile' is to be used only with -batch")) |
757 | 3516 (let ((error nil)) |
3517 (while command-line-args-left | |
3518 (if (file-directory-p (expand-file-name (car command-line-args-left))) | |
3519 (let ((files (directory-files (car command-line-args-left))) | |
3520 source dest) | |
3521 (while files | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3522 (if (and (string-match emacs-lisp-file-regexp (car files)) |
757 | 3523 (not (auto-save-file-name-p (car files))) |
3524 (setq source (expand-file-name (car files) | |
3525 (car command-line-args-left))) | |
3526 (setq dest (byte-compile-dest-file source)) | |
3527 (file-exists-p dest) | |
3528 (file-newer-than-file-p source dest)) | |
3529 (if (null (batch-byte-compile-file source)) | |
3530 (setq error t))) | |
3531 (setq files (cdr files)))) | |
3532 (if (null (batch-byte-compile-file (car command-line-args-left))) | |
3533 (setq error t))) | |
3534 (setq command-line-args-left (cdr command-line-args-left))) | |
3535 (message "Done") | |
3536 (kill-emacs (if error 1 0)))) | |
3537 | |
3538 (defun batch-byte-compile-file (file) | |
3539 (condition-case err | |
18391
1ff0bfd40508
(byte-compile-file): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
18266
diff
changeset
|
3540 (byte-compile-file file) |
757 | 3541 (error |
3542 (message (if (cdr err) | |
3543 ">>Error occurred processing %s: %s (%s)" | |
3544 ">>Error occurred processing %s: %s") | |
3545 file | |
3546 (get (car err) 'error-message) | |
3547 (prin1-to-string (cdr err))) | |
3548 nil))) | |
3549 | |
5283
f48e54cb9b01
(byte-compile-dest-file): If FILENAME is not recognized, append .elc to it.
Richard M. Stallman <rms@gnu.org>
parents:
4556
diff
changeset
|
3550 ;;;###autoload |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3551 (defun batch-byte-recompile-directory () |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3552 "Runs `byte-recompile-directory' on the dirs remaining on the command line. |
3718
37a8a7489fc5
(byte-compile-file): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
3653
diff
changeset
|
3553 Must be used only with `-batch', and kills Emacs on completion. |
37a8a7489fc5
(byte-compile-file): Undo previous change.
Richard M. Stallman <rms@gnu.org>
parents:
3653
diff
changeset
|
3554 For example, invoke `emacs -batch -f batch-byte-recompile-directory .'." |
3653
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3555 ;; command-line-args-left is what is left of the command line (startup.el) |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3556 (defvar command-line-args-left) ;Avoid 'free variable' warning |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3557 (if (not noninteractive) |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3558 (error "batch-byte-recompile-directory is to be used only with -batch")) |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3559 (or command-line-args-left |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3560 (setq command-line-args-left '("."))) |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3561 (while command-line-args-left |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3562 (byte-recompile-directory (car command-line-args-left)) |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3563 (setq command-line-args-left (cdr command-line-args-left))) |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3564 (kill-emacs 0)) |
974055b516d9
* bytecomp.el: Bring it up to version 2.10 of the
Jim Blandy <jimb@redhat.com>
parents:
3591
diff
changeset
|
3565 |
757 | 3566 |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3567 (make-obsolete 'dot 'point "before 19.15") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3568 (make-obsolete 'dot-max 'point-max "before 19.15") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3569 (make-obsolete 'dot-min 'point-min "before 19.15") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3570 (make-obsolete 'dot-marker 'point-marker "before 19.15") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3571 |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3572 (make-obsolete 'buffer-flush-undo 'buffer-disable-undo "before 19.15") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3573 (make-obsolete 'baud-rate "use the baud-rate variable instead" "before 19.15") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3574 (make-obsolete 'compiled-function-p 'byte-code-function-p "before 19.15") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3575 (make-obsolete 'define-function 'defalias "20.1") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3576 (make-obsolete-variable 'auto-fill-hook 'auto-fill-function "before 19.15") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3577 (make-obsolete-variable 'blink-paren-hook 'blink-paren-function "before 19.15") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3578 (make-obsolete-variable 'lisp-indent-hook 'lisp-indent-function "before 19.15") |
958 | 3579 (make-obsolete-variable 'inhibit-local-variables |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3580 "use enable-local-variables (with the reversed sense)." |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3581 "before 19.15") |
1604
25173c1db5a6
* bytecomp.el: Declare unread-command-char an obsolete variable.
Jim Blandy <jimb@redhat.com>
parents:
1532
diff
changeset
|
3582 (make-obsolete-variable 'unread-command-char |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3583 "use unread-command-events instead. That variable is a list of events to reread, so it now uses nil to mean `no event', instead of -1." |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3584 "before 19.15") |
1819
df06a60f3362
* disass.el (disassemble): Add autoload cookie for this.
Jim Blandy <jimb@redhat.com>
parents:
1604
diff
changeset
|
3585 (make-obsolete-variable 'unread-command-event |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3586 "use unread-command-events; which is a list of events rather than a single event." |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3587 "before 19.15") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3588 (make-obsolete-variable 'suspend-hooks 'suspend-hook "before 19.15") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3589 (make-obsolete-variable 'comment-indent-hook 'comment-indent-function "before 19.15") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3590 (make-obsolete-variable 'meta-flag "Use the set-input-mode function instead." "before 19.34") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3591 (make-obsolete-variable 'executing-macro 'executing-kbd-macro "before 19.34") |
12511
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3592 (make-obsolete-variable 'before-change-function |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3593 "use before-change-functions; which is a list of functions rather than a single function." |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3594 "before 19.34") |
12511
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3595 (make-obsolete-variable 'after-change-function |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3596 "use after-change-functions; which is a list of functions rather than a single function." |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3597 "before 19.34") |
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3598 (make-obsolete-variable 'font-lock-doc-string-face 'font-lock-string-face "before 19.34") |
14766
aaaef422311b
(post-command-idle-hook, post-command-idle-delay): Mark obsolete.
Richard M. Stallman <rms@gnu.org>
parents:
14412
diff
changeset
|
3599 (make-obsolete-variable 'post-command-idle-hook |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3600 "use timers instead, with `run-with-idle-timer'." "before 19.34") |
14766
aaaef422311b
(post-command-idle-hook, post-command-idle-delay): Mark obsolete.
Richard M. Stallman <rms@gnu.org>
parents:
14412
diff
changeset
|
3601 (make-obsolete-variable 'post-command-idle-delay |
29352
fa490904bee0
* byte-run.el (make-obsolete, make-obsolete-variable):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
29239
diff
changeset
|
3602 "use timers instead, with `run-with-idle-timer'." "before 19.34") |
757 | 3603 |
3604 (provide 'byte-compile) | |
5341
2f4fab6070b8
Provide bytecomp as well as byte-compile.
Richard M. Stallman <rms@gnu.org>
parents:
5283
diff
changeset
|
3605 (provide 'bytecomp) |
757 | 3606 |
3607 | |
3608 ;;; report metering (see the hacks in bytecode.c) | |
3609 | |
784
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3610 (defun byte-compile-report-ops () |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3611 (defvar byte-code-meter) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3612 (with-output-to-temp-buffer "*Meter*" |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3613 (set-buffer "*Meter*") |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3614 (let ((i 0) n op off) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3615 (while (< i 256) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3616 (setq n (aref (aref byte-code-meter 0) i) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3617 off nil) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3618 (if t ;(not (zerop n)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3619 (progn |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3620 (setq op i) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3621 (setq off nil) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3622 (cond ((< op byte-nth) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3623 (setq off (logand op 7)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3624 (setq op (logand op 248))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3625 ((>= op byte-constant) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3626 (setq off (- op byte-constant) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3627 op byte-constant))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3628 (setq op (aref byte-code-vector op)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3629 (insert (format "%-4d" i)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3630 (insert (symbol-name op)) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3631 (if off (insert " [" (int-to-string off) "]")) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3632 (indent-to 40) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3633 (insert (int-to-string n) "\n"))) |
6d993c174c62
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
757
diff
changeset
|
3634 (setq i (1+ i)))))) |
757 | 3635 |
3636 ;; To avoid "lisp nesting exceeds max-lisp-eval-depth" when bytecomp compiles | |
3637 ;; itself, compile some of its most used recursive functions (at load time). | |
3638 ;; | |
3639 (eval-when-compile | |
12511
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3640 (or (byte-code-function-p (symbol-function 'byte-compile-form)) |
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3641 (assq 'byte-code (symbol-function 'byte-compile-form)) |
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3642 (let ((byte-optimize nil) ; do it fast |
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3643 (byte-compile-warnings nil)) |
37909
3d650ae7e609
(byte-compile-file-form-autoload): Use the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35145
diff
changeset
|
3644 (mapcar (lambda (x) |
3d650ae7e609
(byte-compile-file-form-autoload): Use the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35145
diff
changeset
|
3645 (or noninteractive (message "compiling %s..." x)) |
3d650ae7e609
(byte-compile-file-form-autoload): Use the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35145
diff
changeset
|
3646 (byte-compile x) |
3d650ae7e609
(byte-compile-file-form-autoload): Use the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
35145
diff
changeset
|
3647 (or noninteractive (message "compiling %s...done" x))) |
12511
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3648 '(byte-compile-normal-call |
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3649 byte-compile-form |
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3650 byte-compile-body |
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3651 ;; Inserted some more than necessary, to speed it up. |
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3652 byte-compile-top-level |
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3653 byte-compile-out-toplevel |
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3654 byte-compile-constant |
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3655 byte-compile-variable-ref)))) |
93a7cb2eefcc
Made executing-macro, before-change-function, after-change-function and font-lock-doc-string-face obsolete.
Simon Marshall <simon@gnu.org>
parents:
12487
diff
changeset
|
3656 nil) |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
3657 |
27584 | 3658 (run-hooks 'bytecomp-load-hook) |
3659 | |
819
5bbabfcef929
*** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents:
784
diff
changeset
|
3660 ;;; bytecomp.el ends here |