* lisp/emacs-lisp/byte-opt.el: Use lexical binding.
[bpt/emacs.git] / lisp / emacs-lisp / bytecomp.el
CommitLineData
55535639 1;;; bytecomp.el --- compilation of Lisp code into byte code
fd5285f3 2
73b0cd50 3;; Copyright (C) 1985-1987, 1992, 1994, 1998, 2000-2011
13639aab 4;; Free Software Foundation, Inc.
3a801d0c 5
fd5285f3
RS
6;; Author: Jamie Zawinski <jwz@lucid.com>
7;; Hallvard Furuseth <hbf@ulrik.uio.no>
74dfd056 8;; Maintainer: FSF
713ea1de 9;; Keywords: lisp
bd78fa1d 10;; Package: emacs
1c393159 11
1c393159
JB
12;; This file is part of GNU Emacs.
13
d6cba7ae 14;; GNU Emacs is free software: you can redistribute it and/or modify
1c393159 15;; it under the terms of the GNU General Public License as published by
d6cba7ae
GM
16;; the Free Software Foundation, either version 3 of the License, or
17;; (at your option) any later version.
1c393159
JB
18
19;; GNU Emacs is distributed in the hope that it will be useful,
20;; but WITHOUT ANY WARRANTY; without even the implied warranty of
21;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22;; GNU General Public License for more details.
23
24;; You should have received a copy of the GNU General Public License
d6cba7ae 25;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
1c393159 26
e41b2db1
ER
27;;; Commentary:
28
29;; The Emacs Lisp byte compiler. This crunches lisp source into a sort
a586093f
SM
30;; of p-code (`lapcode') which takes up less space and can be interpreted
31;; faster. [`LAP' == `Lisp Assembly Program'.]
e41b2db1
ER
32;; The user entry points are byte-compile-file and byte-recompile-directory.
33
fd5285f3
RS
34;;; Code:
35
e2abe5a1
SM
36;; FIXME: Use lexical-binding and get rid of the atrocious "bytecomp-"
37;; variable prefix.
38
b578f267
EN
39;; ========================================================================
40;; Entry points:
41;; byte-recompile-directory, byte-compile-file,
430e7297 42;; byte-recompile-file,
b578f267
EN
43;; batch-byte-compile, batch-byte-recompile-directory,
44;; byte-compile, compile-defun,
45;; display-call-tree
46;; (byte-compile-buffer and byte-compile-and-load-file were turned off
47;; because they are not terribly useful and get in the way of completion.)
48
49;; This version of the byte compiler has the following improvements:
50;; + optimization of compiled code:
51;; - removal of unreachable code;
52;; - removal of calls to side-effectless functions whose return-value
53;; is unused;
54;; - compile-time evaluation of safe constant forms, such as (consp nil)
55;; and (ash 1 6);
56;; - open-coding of literal lambdas;
57;; - peephole optimization of emitted code;
58;; - trivial functions are left uncompiled for speed.
59;; + support for inline functions;
60;; + compile-time evaluation of arbitrary expressions;
61;; + compile-time warning messages for:
62;; - functions being redefined with incompatible arglists;
63;; - functions being redefined as macros, or vice-versa;
64;; - functions or macros defined multiple times in the same file;
65;; - functions being called with the incorrect number of arguments;
c5091f25 66;; - functions being called which are not defined globally, in the
b578f267
EN
67;; file, or as autoloads;
68;; - assignment and reference of undeclared free variables;
69;; - various syntax errors;
70;; + correct compilation of nested defuns, defmacros, defvars and defsubsts;
71;; + correct compilation of top-level uses of macros;
72;; + the ability to generate a histogram of functions called.
73
416d3588 74;; User customization variables: M-x customize-group bytecomp
b578f267
EN
75
76;; New Features:
77;;
78;; o The form `defsubst' is just like `defun', except that the function
79;; generated will be open-coded in compiled code which uses it. This
80;; means that no function call will be generated, it will simply be
81;; spliced in. Lisp functions calls are very slow, so this can be a
82;; big win.
83;;
84;; You can generally accomplish the same thing with `defmacro', but in
85;; that case, the defined procedure can't be used as an argument to
86;; mapcar, etc.
87;;
88;; o You can also open-code one particular call to a function without
89;; open-coding all calls. Use the 'inline' form to do this, like so:
90;;
91;; (inline (foo 1 2 3)) ;; `foo' will be open-coded
92;; or...
c5091f25 93;; (inline ;; `foo' and `baz' will be
b578f267
EN
94;; (foo 1 2 3 (bar 5)) ;; open-coded, but `bar' will not.
95;; (baz 0))
96;;
97;; o It is possible to open-code a function in the same file it is defined
6b61353c 98;; in without having to load that file before compiling it. The
b578f267
EN
99;; byte-compiler has been modified to remember function definitions in
100;; the compilation environment in the same way that it remembers macro
101;; definitions.
102;;
103;; o Forms like ((lambda ...) ...) are open-coded.
104;;
105;; o The form `eval-when-compile' is like progn, except that the body
106;; is evaluated at compile-time. When it appears at top-level, this
107;; is analogous to the Common Lisp idiom (eval-when (compile) ...).
108;; When it does not appear at top-level, it is similar to the
109;; Common Lisp #. reader macro (but not in interpreted code).
110;;
111;; o The form `eval-and-compile' is similar to eval-when-compile, but
112;; the whole form is evalled both at compile-time and at run-time.
113;;
114;; o The command compile-defun is analogous to eval-defun.
115;;
c5091f25 116;; o If you run byte-compile-file on a filename which is visited in a
b578f267
EN
117;; buffer, and that buffer is modified, you are asked whether you want
118;; to save the buffer before compiling.
119;;
120;; o byte-compiled files now start with the string `;ELC'.
121;; Some versions of `file' can be customized to recognize that.
1c393159 122
79d52eea 123(require 'backquote)
b9598260 124(require 'macroexp)
94d11cb5 125(require 'cconv)
14acf2f5 126(eval-when-compile (require 'cl))
79d52eea 127
1c393159
JB
128(or (fboundp 'defsubst)
129 ;; This really ought to be loaded already!
6c2161c4 130 (load "byte-run"))
1c393159 131
b9598260
SM
132;; The feature of compiling in a specific target Emacs version
133;; has been turned off because compile time options are a bad idea.
134(defmacro byte-compile-single-version () nil)
135(defmacro byte-compile-version-cond (cond) cond)
136
b9598260 137
713ea1de 138(defgroup bytecomp nil
25d1fc94 139 "Emacs Lisp byte-compiler."
713ea1de
RS
140 :group 'lisp)
141
5692cc8c 142(defcustom emacs-lisp-file-regexp "\\.el\\'"
2b9c3b12 143 "Regexp which matches Emacs Lisp source files.
3f12e5bd 144If you change this, you might want to set `byte-compile-dest-file-function'."
713ea1de
RS
145 :group 'bytecomp
146 :type 'regexp)
1c393159 147
3f12e5bd
GM
148(defcustom byte-compile-dest-file-function nil
149 "Function for the function `byte-compile-dest-file' to call.
150It should take one argument, the name of an Emacs Lisp source
151file name, and return the name of the compiled file."
152 :group 'bytecomp
153 :type '(choice (const nil) function)
154 :version "23.2")
155
2140206e
RS
156;; This enables file name handlers such as jka-compr
157;; to remove parts of the file name that should not be copied
158;; through to the output file name.
159(defun byte-compiler-base-file-name (filename)
160 (let ((handler (find-file-name-handler filename
161 'byte-compiler-base-file-name)))
162 (if handler
163 (funcall handler 'byte-compiler-base-file-name filename)
164 filename)))
165
1c393159 166(or (fboundp 'byte-compile-dest-file)
e27c3564 167 ;; The user may want to redefine this along with emacs-lisp-file-regexp,
1c393159 168 ;; so only define it if it is undefined.
3f12e5bd
GM
169 ;; Note - redefining this function is obsolete as of 23.2.
170 ;; Customize byte-compile-dest-file-function instead.
1c393159 171 (defun byte-compile-dest-file (filename)
f9b4b5d8 172 "Convert an Emacs Lisp source file name to a compiled file name.
3f12e5bd
GM
173If `byte-compile-dest-file-function' is non-nil, uses that
174function to do the work. Otherwise, if FILENAME matches
175`emacs-lisp-file-regexp' (by default, files with the extension `.el'),
176adds `c' to it; otherwise adds `.elc'."
177 (if byte-compile-dest-file-function
178 (funcall byte-compile-dest-file-function filename)
179 (setq filename (file-name-sans-versions
180 (byte-compiler-base-file-name filename)))
181 (cond ((string-match emacs-lisp-file-regexp filename)
182 (concat (substring filename 0 (match-beginning 0)) ".elc"))
183 (t (concat filename ".elc"))))))
1c393159
JB
184
185;; This can be the 'byte-compile property of any symbol.
52799cb8 186(autoload 'byte-compile-inline-expand "byte-opt")
1c393159
JB
187
188;; This is the entrypoint to the lapcode optimizer pass1.
52799cb8 189(autoload 'byte-optimize-form "byte-opt")
1c393159 190;; This is the entrypoint to the lapcode optimizer pass2.
52799cb8
RS
191(autoload 'byte-optimize-lapcode "byte-opt")
192(autoload 'byte-compile-unfold-lambda "byte-opt")
1c393159 193
ed015bdd
JB
194;; This is the entry point to the decompiler, which is used by the
195;; disassembler. The disassembler just requires 'byte-compile, but
196;; that doesn't define this function, so this seems to be a reasonable
197;; thing to do.
198(autoload 'byte-decompile-bytecode "byte-opt")
199
713ea1de 200(defcustom byte-compile-verbose
1c393159 201 (and (not noninteractive) (> baud-rate search-slow-speed))
2b9c3b12 202 "Non-nil means print messages describing progress of byte-compiler."
713ea1de
RS
203 :group 'bytecomp
204 :type 'boolean)
1c393159 205
713ea1de 206(defcustom byte-optimize t
2b9c3b12 207 "Enable optimization in the byte compiler.
9bb2e9f8
JB
208Possible values are:
209 nil - no optimization
210 t - all optimizations
211 `source' - source-level optimizations only
212 `byte' - code-level optimizations only"
713ea1de
RS
213 :group 'bytecomp
214 :type '(choice (const :tag "none" nil)
215 (const :tag "all" t)
216 (const :tag "source-level" source)
217 (const :tag "byte-level" byte)))
218
cd91e34c 219(defcustom byte-compile-delete-errors nil
2b9c3b12 220 "If non-nil, the optimizer may delete forms that may signal an error.
713ea1de
RS
221This includes variable references and calls to functions such as `car'."
222 :group 'bytecomp
223 :type 'boolean)
1c393159 224
d82e848c 225(defvar byte-compile-dynamic nil
713ea1de 226 "If non-nil, compile function bodies so they load lazily.
458f70dc
RS
227They are hidden in comments in the compiled file,
228and each one is brought into core when the
d82e848c
RS
229function is called.
230
231To enable this option, make it a file-local variable
232in the source file you want it to apply to.
233For example, add -*-byte-compile-dynamic: t;-*- on the first line.
234
235When this option is true, if you load the compiled file and then move it,
236the functions you loaded will not be able to run.")
631c8020 237;;;###autoload(put 'byte-compile-dynamic 'safe-local-variable 'booleanp)
d82e848c 238
0e66b003
KH
239(defvar byte-compile-disable-print-circle nil
240 "If non-nil, disable `print-circle' on printing a byte-compiled code.")
53cfe624 241(make-obsolete-variable 'byte-compile-disable-print-circle nil "24.1")
0e66b003
KH
242;;;###autoload(put 'byte-compile-disable-print-circle 'safe-local-variable 'booleanp)
243
713ea1de 244(defcustom byte-compile-dynamic-docstrings t
2b9c3b12
JB
245 "If non-nil, compile doc strings for lazy access.
246We bury the doc strings of functions and variables inside comments in
247the file, and bring them into core only when they are actually needed.
d82e848c
RS
248
249When this option is true, if you load the compiled file and then move it,
250you won't be able to find the documentation of anything in that file.
251
1c660f5a
KH
252To disable this option for a certain file, make it a file-local variable
253in the source file. For example, add this to the first line:
254 -*-byte-compile-dynamic-docstrings:nil;-*-
255You can also set the variable globally.
256
713ea1de
RS
257This option is enabled by default because it reduces Emacs memory usage."
258 :group 'bytecomp
259 :type 'boolean)
631c8020 260;;;###autoload(put 'byte-compile-dynamic-docstrings 'safe-local-variable 'booleanp)
d82e848c 261
7847454a
GM
262(defconst byte-compile-log-buffer "*Compile-Log*"
263 "Name of the byte-compiler's log buffer.")
264
713ea1de 265(defcustom byte-optimize-log nil
7847454a 266 "If non-nil, the byte-compiler will log its optimizations.
1c393159 267If this is 'source, then only source-level optimizations will be logged.
7847454a
GM
268If it is 'byte, then only byte-level optimizations will be logged.
269The information is logged to `byte-compile-log-buffer'."
713ea1de
RS
270 :group 'bytecomp
271 :type '(choice (const :tag "none" nil)
272 (const :tag "all" t)
273 (const :tag "source-level" source)
274 (const :tag "byte-level" byte)))
275
276(defcustom byte-compile-error-on-warn nil
2b9c3b12 277 "If true, the byte-compiler reports warnings with `error'."
713ea1de
RS
278 :group 'bytecomp
279 :type 'boolean)
1c393159 280
9290191f 281(defconst byte-compile-warning-types
086af77c 282 '(redefine callargs free-vars unresolved
8accceac 283 obsolete noruntime cl-functions interactive-only
4f1e9960 284 make-local mapcar constants suspicious lexical)
4795d1c7 285 "The list of warning types used when `byte-compile-warnings' is t.")
713ea1de 286(defcustom byte-compile-warnings t
2b9c3b12 287 "List of warnings that the byte-compiler should issue (t for all).
4795d1c7 288
9bb2e9f8 289Elements of the list may be:
9e2b097b
JB
290
291 free-vars references to variables not in the current lexical scope.
292 unresolved calls to unknown functions.
11efeb9b
RS
293 callargs function calls with args that don't match the definition.
294 redefine function name redefined from a macro to ordinary function or vice
9e2b097b 295 versa, or redefined to take a different number of arguments.
4795d1c7
RS
296 obsolete obsolete variables and functions.
297 noruntime functions that may not be defined at runtime (typically
298 defined only under `eval-when-compile').
6b8c2efc 299 cl-functions calls to runtime functions from the CL package (as
086af77c
RS
300 distinguished from macros and aliases).
301 interactive-only
15ce9dcf 302 commands that normally shouldn't be called from Lisp code.
86da2828 303 make-local calls to make-variable-buffer-local that may be incorrect.
cf637a34 304 mapcar mapcar called for effect.
416d3588 305 constants let-binding of, or assignment to, constants/nonvariables.
62a258a7 306 suspicious constructs that usually don't do what the coder wanted.
cf637a34
GM
307
308If the list begins with `not', then the remaining elements specify warnings to
309suppress. For example, (not mapcar) will suppress warnings about mapcar."
713ea1de 310 :group 'bytecomp
4795d1c7 311 :type `(choice (const :tag "All" t)
aa635691 312 (set :menu-tag "Some"
62a258a7
SM
313 ,@(mapcar (lambda (x) `(const ,x))
314 byte-compile-warning-types))))
6a831405 315
0027258d 316;;;###autoload
acef0722
SM
317(put 'byte-compile-warnings 'safe-local-variable
318 (lambda (v)
319 (or (symbolp v)
320 (null (delq nil (mapcar (lambda (x) (not (symbolp x))) v))))))
086af77c 321
cf637a34
GM
322(defun byte-compile-warning-enabled-p (warning)
323 "Return non-nil if WARNING is enabled, according to `byte-compile-warnings'."
324 (or (eq byte-compile-warnings t)
325 (if (eq (car byte-compile-warnings) 'not)
326 (not (memq warning byte-compile-warnings))
327 (memq warning byte-compile-warnings))))
328
329;;;###autoload
330(defun byte-compile-disable-warning (warning)
331 "Change `byte-compile-warnings' to disable WARNING.
332If `byte-compile-warnings' is t, set it to `(not WARNING)'.
798bd437
GM
333Otherwise, if the first element is `not', add WARNING, else remove it.
334Normally you should let-bind `byte-compile-warnings' before calling this,
335else the global value will be modified."
cf637a34
GM
336 (setq byte-compile-warnings
337 (cond ((eq byte-compile-warnings t)
338 (list 'not warning))
339 ((eq (car byte-compile-warnings) 'not)
340 (if (memq warning byte-compile-warnings)
341 byte-compile-warnings
342 (append byte-compile-warnings (list warning))))
343 (t
344 (delq warning byte-compile-warnings)))))
345
346;;;###autoload
347(defun byte-compile-enable-warning (warning)
348 "Change `byte-compile-warnings' to enable WARNING.
349If `byte-compile-warnings' is `t', do nothing. Otherwise, if the
798bd437
GM
350first element is `not', remove WARNING, else add it.
351Normally you should let-bind `byte-compile-warnings' before calling this,
352else the global value will be modified."
cf637a34
GM
353 (or (eq byte-compile-warnings t)
354 (setq byte-compile-warnings
355 (cond ((eq (car byte-compile-warnings) 'not)
356 (delq warning byte-compile-warnings))
357 ((memq warning byte-compile-warnings)
358 byte-compile-warnings)
359 (t
360 (append byte-compile-warnings (list warning)))))))
361
086af77c
RS
362(defvar byte-compile-interactive-only-functions
363 '(beginning-of-buffer end-of-buffer replace-string replace-regexp
dfd4e693 364 insert-file insert-buffer insert-file-literally previous-line next-line
dd9b52a6 365 goto-line comint-run delete-backward-char)
086af77c 366 "List of commands that are not meant to be called from Lisp.")
1c393159 367
8480fc7c
GM
368(defvar byte-compile-not-obsolete-vars nil
369 "If non-nil, a list of variables that shouldn't be reported as obsolete.")
370
371(defvar byte-compile-not-obsolete-funcs nil
372 "If non-nil, a list of functions that shouldn't be reported as obsolete.")
6b61353c 373
713ea1de 374(defcustom byte-compile-generate-call-tree nil
2b9c3b12 375 "Non-nil means collect call-graph information when compiling.
78bba1c8 376This records which functions were called and from where.
52799cb8
RS
377If the value is t, compilation displays the call graph when it finishes.
378If the value is neither t nor nil, compilation asks you whether to display
379the graph.
1c393159
JB
380
381The call tree only lists functions called, not macros used. Those functions
382which the byte-code interpreter knows about directly (eq, cons, etc.) are
383not reported.
384
385The call tree also lists those functions which are not known to be called
5023d9a0 386\(that is, to which no calls have been compiled). Functions which can be
713ea1de
RS
387invoked interactively are excluded from this list."
388 :group 'bytecomp
389 :type '(choice (const :tag "Yes" t) (const :tag "No" nil)
778c7576 390 (other :tag "Ask" lambda)))
1c393159 391
2b9c3b12
JB
392(defvar byte-compile-call-tree nil
393 "Alist of functions and their call tree.
1c393159
JB
394Each element looks like
395
396 \(FUNCTION CALLERS CALLS\)
397
398where CALLERS is a list of functions that call FUNCTION, and CALLS
399is a list of functions for which calls were generated while compiling
400FUNCTION.")
401
713ea1de 402(defcustom byte-compile-call-tree-sort 'name
2b9c3b12 403 "If non-nil, sort the call tree.
52799cb8 404The values `name', `callers', `calls', `calls+callers'
713ea1de
RS
405specify different fields to sort on."
406 :group 'bytecomp
407 :type '(choice (const name) (const callers) (const calls)
408 (const calls+callers) (const nil)))
52799cb8 409
b9598260 410(defvar byte-compile-debug t)
590130fb 411(setq debug-on-error t)
b9598260 412
1c393159 413(defvar byte-compile-constants nil
a586093f 414 "List of all constants encountered during compilation of this form.")
1c393159 415(defvar byte-compile-variables nil
a586093f 416 "List of all variables encountered during compilation of this form.")
1c393159 417(defvar byte-compile-bound-variables nil
ce5b520a 418 "List of dynamic variables bound in the context of the current form.
b92dd692 419This list lives partly on the stack.")
6c2161c4
SM
420(defvar byte-compile-const-variables nil
421 "List of variables declared as constants during compilation of this file.")
1c393159
JB
422(defvar byte-compile-free-references)
423(defvar byte-compile-free-assignments)
424
ab94e6e7
RS
425(defvar byte-compiler-error-flag)
426
1c393159 427(defconst byte-compile-initial-macro-environment
52799cb8
RS
428 '(
429;; (byte-compiler-options . (lambda (&rest forms)
430;; (apply 'byte-compiler-options-handler forms)))
a9de04fa 431 (declare-function . byte-compile-macroexpand-declare-function)
1c393159 432 (eval-when-compile . (lambda (&rest body)
b9598260
SM
433 (list
434 'quote
435 (byte-compile-eval
436 (byte-compile-top-level
437 (macroexpand-all
438 (cons 'progn body)
439 byte-compile-initial-macro-environment))))))
1c393159 440 (eval-and-compile . (lambda (&rest body)
3c3ddb98 441 (byte-compile-eval-before-compile (cons 'progn body))
1c393159
JB
442 (cons 'progn body))))
443 "The default macro-environment passed to macroexpand by the compiler.
444Placing a macro here will cause a macro to have different semantics when
445expanded by the compiler as when expanded by the interpreter.")
446
447(defvar byte-compile-macro-environment byte-compile-initial-macro-environment
52799cb8
RS
448 "Alist of macros defined in the file being compiled.
449Each element looks like (MACRONAME . DEFINITION). It is
e27c3564 450\(MACRONAME . nil) when a macro is redefined as a function.")
1c393159
JB
451
452(defvar byte-compile-function-environment nil
52799cb8
RS
453 "Alist of functions defined in the file being compiled.
454This is so we can inline them when necessary.
455Each element looks like (FUNCTIONNAME . DEFINITION). It is
a7a7ddf1
RS
456\(FUNCTIONNAME . nil) when a function is redefined as a macro.
457It is \(FUNCTIONNAME . t) when all we know is that it was defined,
cb4fb1d0
GM
458and we don't know the definition. For an autoloaded function, DEFINITION
459has the form (autoload . FILENAME).")
1c393159
JB
460
461(defvar byte-compile-unresolved-functions nil
a586093f 462 "Alist of undefined functions to which calls have been compiled.
2cb63a7c
AM
463This variable is only significant whilst compiling an entire buffer.
464Used for warnings when a function is not known to be defined or is later
a586093f 465defined with incorrect args.")
1c393159 466
6b61353c
KH
467(defvar byte-compile-noruntime-functions nil
468 "Alist of functions called that may not be defined when the compiled code is run.
469Used for warnings about calling a function that is defined during compilation
470but won't necessarily be defined when the compiled file is loaded.")
471
b9598260
SM
472;; Variables for lexical binding
473(defvar byte-compile-lexical-environment nil
474 "The current lexical environment.")
b9598260 475
1c393159
JB
476(defvar byte-compile-tag-number 0)
477(defvar byte-compile-output nil
478 "Alist describing contents to put in byte code string.
479Each element is (INDEX . VALUE)")
480(defvar byte-compile-depth 0 "Current depth of execution stack.")
481(defvar byte-compile-maxdepth 0 "Maximum depth of execution stack.")
482
483\f
484;;; The byte codes; this information is duplicated in bytecomp.c
485
fef3407e 486(defvar byte-code-vector nil
1c393159
JB
487 "An array containing byte-code names indexed by byte-code values.")
488
fef3407e 489(defvar byte-stack+-info nil
1c393159
JB
490 "An array with the stack adjustment for each byte-code.")
491
492(defmacro byte-defop (opcode stack-adjust opname &optional docstring)
493 ;; This is a speed-hack for building the byte-code-vector at compile-time.
494 ;; We fill in the vector at macroexpand-time, and then after the last call
495 ;; to byte-defop, we write the vector out as a constant instead of writing
496 ;; out a bunch of calls to aset.
497 ;; Actually, we don't fill in the vector itself, because that could make
498 ;; it problematic to compile big changes to this compiler; we store the
499 ;; values on its plist, and remove them later in -extrude.
500 (let ((v1 (or (get 'byte-code-vector 'tmp-compile-time-value)
501 (put 'byte-code-vector 'tmp-compile-time-value
502 (make-vector 256 nil))))
503 (v2 (or (get 'byte-stack+-info 'tmp-compile-time-value)
504 (put 'byte-stack+-info 'tmp-compile-time-value
505 (make-vector 256 nil)))))
506 (aset v1 opcode opname)
507 (aset v2 opcode stack-adjust))
508 (if docstring
509 (list 'defconst opname opcode (concat "Byte code opcode " docstring "."))
510 (list 'defconst opname opcode)))
511
512(defmacro byte-extrude-byte-code-vectors ()
513 (prog1 (list 'setq 'byte-code-vector
514 (get 'byte-code-vector 'tmp-compile-time-value)
515 'byte-stack+-info
516 (get 'byte-stack+-info 'tmp-compile-time-value))
fd9b0a6b
DL
517 (put 'byte-code-vector 'tmp-compile-time-value nil)
518 (put 'byte-stack+-info 'tmp-compile-time-value nil)))
1c393159
JB
519
520
1c393159
JB
521;; These opcodes are special in that they pack their argument into the
522;; opcode word.
523;;
b9598260 524(byte-defop 0 1 byte-stack-ref "for stack reference")
1c393159
JB
525(byte-defop 8 1 byte-varref "for variable reference")
526(byte-defop 16 -1 byte-varset "for setting a variable")
527(byte-defop 24 -1 byte-varbind "for binding a variable")
528(byte-defop 32 0 byte-call "for calling a function")
529(byte-defop 40 0 byte-unbind "for unbinding special bindings")
eb8c3be9 530;; codes 8-47 are consumed by the preceding opcodes
1c393159
JB
531
532;; unused: 48-55
533
534(byte-defop 56 -1 byte-nth)
535(byte-defop 57 0 byte-symbolp)
536(byte-defop 58 0 byte-consp)
537(byte-defop 59 0 byte-stringp)
538(byte-defop 60 0 byte-listp)
539(byte-defop 61 -1 byte-eq)
540(byte-defop 62 -1 byte-memq)
541(byte-defop 63 0 byte-not)
542(byte-defop 64 0 byte-car)
543(byte-defop 65 0 byte-cdr)
544(byte-defop 66 -1 byte-cons)
545(byte-defop 67 0 byte-list1)
546(byte-defop 68 -1 byte-list2)
547(byte-defop 69 -2 byte-list3)
548(byte-defop 70 -3 byte-list4)
549(byte-defop 71 0 byte-length)
550(byte-defop 72 -1 byte-aref)
551(byte-defop 73 -2 byte-aset)
552(byte-defop 74 0 byte-symbol-value)
553(byte-defop 75 0 byte-symbol-function) ; this was commented out
554(byte-defop 76 -1 byte-set)
555(byte-defop 77 -1 byte-fset) ; this was commented out
556(byte-defop 78 -1 byte-get)
557(byte-defop 79 -2 byte-substring)
558(byte-defop 80 -1 byte-concat2)
559(byte-defop 81 -2 byte-concat3)
560(byte-defop 82 -3 byte-concat4)
561(byte-defop 83 0 byte-sub1)
562(byte-defop 84 0 byte-add1)
563(byte-defop 85 -1 byte-eqlsign)
564(byte-defop 86 -1 byte-gtr)
565(byte-defop 87 -1 byte-lss)
566(byte-defop 88 -1 byte-leq)
567(byte-defop 89 -1 byte-geq)
568(byte-defop 90 -1 byte-diff)
569(byte-defop 91 0 byte-negate)
570(byte-defop 92 -1 byte-plus)
571(byte-defop 93 -1 byte-max)
572(byte-defop 94 -1 byte-min)
573(byte-defop 95 -1 byte-mult) ; v19 only
574(byte-defop 96 1 byte-point)
1c393159
JB
575(byte-defop 98 0 byte-goto-char)
576(byte-defop 99 0 byte-insert)
577(byte-defop 100 1 byte-point-max)
578(byte-defop 101 1 byte-point-min)
579(byte-defop 102 0 byte-char-after)
580(byte-defop 103 1 byte-following-char)
581(byte-defop 104 1 byte-preceding-char)
582(byte-defop 105 1 byte-current-column)
583(byte-defop 106 0 byte-indent-to)
584(byte-defop 107 0 byte-scan-buffer-OBSOLETE) ; no longer generated as of v18
585(byte-defop 108 1 byte-eolp)
586(byte-defop 109 1 byte-eobp)
587(byte-defop 110 1 byte-bolp)
588(byte-defop 111 1 byte-bobp)
589(byte-defop 112 1 byte-current-buffer)
590(byte-defop 113 0 byte-set-buffer)
78943c8a
RS
591(byte-defop 114 0 byte-save-current-buffer
592 "To make a binding to record the current buffer")
1c393159 593(byte-defop 115 0 byte-set-mark-OBSOLETE)
1c393159
JB
594
595;; These ops are new to v19
596(byte-defop 117 0 byte-forward-char)
597(byte-defop 118 0 byte-forward-word)
598(byte-defop 119 -1 byte-skip-chars-forward)
599(byte-defop 120 -1 byte-skip-chars-backward)
600(byte-defop 121 0 byte-forward-line)
601(byte-defop 122 0 byte-char-syntax)
602(byte-defop 123 -1 byte-buffer-substring)
603(byte-defop 124 -1 byte-delete-region)
604(byte-defop 125 -1 byte-narrow-to-region)
605(byte-defop 126 1 byte-widen)
606(byte-defop 127 0 byte-end-of-line)
607
608;; unused: 128
609
610;; These store their argument in the next two bytes
611(byte-defop 129 1 byte-constant2
612 "for reference to a constant with vector index >= byte-constant-limit")
613(byte-defop 130 0 byte-goto "for unconditional jump")
614(byte-defop 131 -1 byte-goto-if-nil "to pop value and jump if it's nil")
615(byte-defop 132 -1 byte-goto-if-not-nil "to pop value and jump if it's not nil")
616(byte-defop 133 -1 byte-goto-if-nil-else-pop
c5091f25 617 "to examine top-of-stack, jump and don't pop it if it's nil,
1c393159
JB
618otherwise pop it")
619(byte-defop 134 -1 byte-goto-if-not-nil-else-pop
c5091f25 620 "to examine top-of-stack, jump and don't pop it if it's non nil,
1c393159
JB
621otherwise pop it")
622
623(byte-defop 135 -1 byte-return "to pop a value and return it from `byte-code'")
624(byte-defop 136 -1 byte-discard "to discard one value from stack")
625(byte-defop 137 1 byte-dup "to duplicate the top of the stack")
626
627(byte-defop 138 0 byte-save-excursion
628 "to make a binding to record the buffer, point and mark")
1c393159
JB
629(byte-defop 140 0 byte-save-restriction
630 "to make a binding to record the current buffer clipping restrictions")
631(byte-defop 141 -1 byte-catch
632 "for catch. Takes, on stack, the tag and an expression for the body")
633(byte-defop 142 -1 byte-unwind-protect
634 "for unwind-protect. Takes, on stack, an expression for the unwind-action")
635
c5091f25 636;; For condition-case. Takes, on stack, the variable to bind,
52799cb8
RS
637;; an expression for the body, and a list of clauses.
638(byte-defop 143 -2 byte-condition-case)
1c393159 639
52799cb8
RS
640;; For entry to with-output-to-temp-buffer.
641;; Takes, on stack, the buffer name.
642;; Binds standard-output and does some other things.
643;; Returns with temp buffer on the stack in place of buffer name.
3e21b6a7 644;; (byte-defop 144 0 byte-temp-output-buffer-setup)
1c393159 645
52799cb8
RS
646;; For exit from with-output-to-temp-buffer.
647;; Expects the temp buffer on the stack underneath value to return.
648;; Pops them both, then pushes the value back on.
649;; Unbinds standard-output and makes the temp buffer visible.
3e21b6a7 650;; (byte-defop 145 -1 byte-temp-output-buffer-show)
1c393159
JB
651
652;; these ops are new to v19
52799cb8
RS
653
654;; To unbind back to the beginning of this frame.
69dc83fd 655;; Not used yet, but will be needed for tail-recursion elimination.
52799cb8 656(byte-defop 146 0 byte-unbind-all)
1c393159
JB
657
658;; these ops are new to v19
659(byte-defop 147 -2 byte-set-marker)
660(byte-defop 148 0 byte-match-beginning)
661(byte-defop 149 0 byte-match-end)
662(byte-defop 150 0 byte-upcase)
663(byte-defop 151 0 byte-downcase)
664(byte-defop 152 -1 byte-string=)
665(byte-defop 153 -1 byte-string<)
666(byte-defop 154 -1 byte-equal)
667(byte-defop 155 -1 byte-nthcdr)
668(byte-defop 156 -1 byte-elt)
669(byte-defop 157 -1 byte-member)
670(byte-defop 158 -1 byte-assq)
671(byte-defop 159 0 byte-nreverse)
672(byte-defop 160 -1 byte-setcar)
673(byte-defop 161 -1 byte-setcdr)
674(byte-defop 162 0 byte-car-safe)
675(byte-defop 163 0 byte-cdr-safe)
676(byte-defop 164 -1 byte-nconc)
677(byte-defop 165 -1 byte-quo)
678(byte-defop 166 -1 byte-rem)
679(byte-defop 167 0 byte-numberp)
680(byte-defop 168 0 byte-integerp)
681
3eac9910 682;; unused: 169-174
b9598260 683
1c393159
JB
684(byte-defop 175 nil byte-listN)
685(byte-defop 176 nil byte-concatN)
686(byte-defop 177 nil byte-insertN)
687
b9598260
SM
688(byte-defop 178 -1 byte-stack-set) ; stack offset in following one byte
689(byte-defop 179 -1 byte-stack-set2) ; stack offset in following two bytes
b9598260
SM
690
691;; if (following one byte & 0x80) == 0
692;; discard (following one byte & 0x7F) stack entries
693;; else
694;; discard (following one byte & 0x7F) stack entries _underneath_ the top of stack
695;; (that is, if the operand = 0x83, ... X Y Z T => ... T)
696(byte-defop 182 nil byte-discardN)
697;; `byte-discardN-preserve-tos' is a pseudo-op that gets turned into
698;; `byte-discardN' with the high bit in the operand set (by
699;; `byte-compile-lapcode').
700(defconst byte-discardN-preserve-tos byte-discardN)
701
702;; unused: 182-191
1c393159
JB
703
704(byte-defop 192 1 byte-constant "for reference to a constant")
705;; codes 193-255 are consumed by byte-constant.
706(defconst byte-constant-limit 64
707 "Exclusive maximum index usable in the `byte-constant' opcode.")
708
709(defconst byte-goto-ops '(byte-goto byte-goto-if-nil byte-goto-if-not-nil
710 byte-goto-if-nil-else-pop
711 byte-goto-if-not-nil-else-pop)
52799cb8 712 "List of byte-codes whose offset is a pc.")
1c393159
JB
713
714(defconst byte-goto-always-pop-ops '(byte-goto-if-nil byte-goto-if-not-nil))
715
1c393159
JB
716(byte-extrude-byte-code-vectors)
717\f
718;;; lapcode generator
3614fc84
GM
719;;
720;; the byte-compiler now does source -> lapcode -> bytecode instead of
721;; source -> bytecode, because it's a lot easier to make optimizations
722;; on lapcode than on bytecode.
723;;
724;; Elements of the lapcode list are of the form (<instruction> . <parameter>)
725;; where instruction is a symbol naming a byte-code instruction,
726;; and parameter is an argument to that instruction, if any.
727;;
728;; The instruction can be the pseudo-op TAG, which means that this position
729;; in the instruction stream is a target of a goto. (car PARAMETER) will be
730;; the PC for this location, and the whole instruction "(TAG pc)" will be the
731;; parameter for some goto op.
732;;
733;; If the operation is varbind, varref, varset or push-constant, then the
734;; parameter is (variable/constant . index_in_constant_vector).
735;;
736;; First, the source code is macroexpanded and optimized in various ways.
737;; Then the resultant code is compiled into lapcode. Another set of
738;; optimizations are then run over the lapcode. Then the variables and
739;; constants referenced by the lapcode are collected and placed in the
740;; constants-vector. (This happens now so that variables referenced by dead
741;; code don't consume space.) And finally, the lapcode is transformed into
742;; compacted byte-code.
743;;
744;; A distinction is made between variables and constants because the variable-
745;; referencing instructions are more sensitive to the variables being near the
746;; front of the constants-vector than the constant-referencing instructions.
747;; Also, this lets us notice references to free variables.
1c393159 748
b9598260
SM
749(defmacro byte-compile-push-bytecodes (&rest args)
750 "Push BYTE... onto BYTES, and increment PC by the number of bytes pushed.
751ARGS is of the form (BYTE... BYTES PC), where BYTES and PC are variable names.
752BYTES and PC are updated after evaluating all the arguments."
753 (let ((byte-exprs (butlast args 2))
754 (bytes-var (car (last args 2)))
755 (pc-var (car (last args))))
756 `(setq ,bytes-var ,(if (null (cdr byte-exprs))
b38b1ec0
SM
757 `(progn (assert (<= 0 ,(car byte-exprs)))
758 (cons ,@byte-exprs ,bytes-var))
759 `(nconc (list ,@(reverse byte-exprs)) ,bytes-var))
760 ,pc-var (+ ,(length byte-exprs) ,pc-var))))
b9598260
SM
761
762(defmacro byte-compile-push-bytecode-const2 (opcode const2 bytes pc)
763 "Push OPCODE and the two-byte constant CONST2 onto BYTES, and add 3 to PC.
764CONST2 may be evaulated multiple times."
765 `(byte-compile-push-bytecodes ,opcode (logand ,const2 255) (lsh ,const2 -8)
766 ,bytes ,pc))
767
1c393159
JB
768(defun byte-compile-lapcode (lap)
769 "Turns lapcode into bytecode. The lapcode is destroyed."
770 ;; Lapcode modifications: changes the ID of a tag to be the tag's PC.
771 (let ((pc 0) ; Program counter
772 op off ; Operation & offset
b9598260 773 opcode ; numeric value of OP
1c393159 774 (bytes '()) ; Put the output bytes here
b9598260
SM
775 (patchlist nil)) ; List of gotos to patch
776 (dolist (lap-entry lap)
777 (setq op (car lap-entry)
778 off (cdr lap-entry))
ce5b520a
SM
779 (cond
780 ((not (symbolp op))
781 (error "Non-symbolic opcode `%s'" op))
782 ((eq op 'TAG)
783 (setcar off pc))
784 ((null op)
785 ;; a no-op added by `byte-compile-delay-out'
786 (unless (zerop off)
787 (error
788 "Placeholder added by `byte-compile-delay-out' not filled in.")
789 ))
790 (t
791 (setq opcode
792 (if (eq op 'byte-discardN-preserve-tos)
793 ;; byte-discardN-preserve-tos is a pseudo op, which
794 ;; is actually the same as byte-discardN
795 ;; with a modified argument.
796 byte-discardN
797 (symbol-value op)))
798 (cond ((memq op byte-goto-ops)
799 ;; goto
800 (byte-compile-push-bytecodes opcode nil (cdr off) bytes pc)
801 (push bytes patchlist))
876c194c
SM
802 ((or (and (consp off)
803 ;; Variable or constant reference
804 (progn
805 (setq off (cdr off))
806 (eq op 'byte-constant)))
807 (and (eq op 'byte-constant) ;; 'byte-closed-var
808 (integerp off)))
ce5b520a
SM
809 ;; constant ref
810 (if (< off byte-constant-limit)
811 (byte-compile-push-bytecodes (+ byte-constant off)
812 bytes pc)
813 (byte-compile-push-bytecode-const2 byte-constant2 off
814 bytes pc)))
815 ((and (= opcode byte-stack-set)
816 (> off 255))
817 ;; Use the two-byte version of byte-stack-set if the
818 ;; offset is too large for the normal version.
819 (byte-compile-push-bytecode-const2 byte-stack-set2 off
820 bytes pc))
821 ((and (>= opcode byte-listN)
822 (< opcode byte-discardN))
823 ;; These insns all put their operand into one extra byte.
824 (byte-compile-push-bytecodes opcode off bytes pc))
825 ((= opcode byte-discardN)
b38b1ec0 826 ;; byte-discardN is weird in that it encodes a flag in the
ce5b520a
SM
827 ;; top bit of its one-byte argument. If the argument is
828 ;; too large to fit in 7 bits, the opcode can be repeated.
829 (let ((flag (if (eq op 'byte-discardN-preserve-tos) #x80 0)))
830 (while (> off #x7f)
831 (byte-compile-push-bytecodes opcode (logior #x7f flag) bytes pc)
832 (setq off (- off #x7f)))
833 (byte-compile-push-bytecodes opcode (logior off flag) bytes pc)))
834 ((null off)
835 ;; opcode that doesn't use OFF
836 (byte-compile-push-bytecodes opcode bytes pc))
3e21b6a7
SM
837 ((and (eq opcode byte-stack-ref) (eq off 0))
838 ;; (stack-ref 0) is really just another name for `dup'.
839 (debug) ;FIXME: When would this happen?
840 (byte-compile-push-bytecodes byte-dup bytes pc))
ce5b520a
SM
841 ;; The following three cases are for the special
842 ;; insns that encode their operand into 0, 1, or 2
843 ;; extra bytes depending on its magnitude.
844 ((< off 6)
845 (byte-compile-push-bytecodes (+ opcode off) bytes pc))
846 ((< off 256)
847 (byte-compile-push-bytecodes (+ opcode 6) off bytes pc))
848 (t
849 (byte-compile-push-bytecode-const2 (+ opcode 7) off
850 bytes pc))))))
1c393159 851 ;;(if (not (= pc (length bytes)))
52799cb8 852 ;; (error "Compiler error: pc mismatch - %s %s" pc (length bytes)))
b9598260
SM
853
854 ;; Patch tag PCs into absolute jumps
855 (dolist (bytes-tail patchlist)
856 (setq pc (caar bytes-tail)) ; Pick PC from goto's tag
857 (setcar (cdr bytes-tail) (logand pc 255))
858 (setcar bytes-tail (lsh pc -8))
859 ;; FIXME: Replace this by some workaround.
860 (if (> (car bytes) 255) (error "Bytecode overflow")))
861
da9e269f 862 (apply 'unibyte-string (nreverse bytes))))
1c393159
JB
863
864\f
a586093f
SM
865;;; compile-time evaluation
866
3f12e5bd
GM
867(defun byte-compile-cl-file-p (file)
868 "Return non-nil if FILE is one of the CL files."
869 (and (stringp file)
870 (string-match "^cl\\>" (file-name-nondirectory file))))
871
ea4b0ca3
SM
872(defun byte-compile-eval (form)
873 "Eval FORM and mark the functions defined therein.
6b61353c 874Each function's symbol gets added to `byte-compile-noruntime-functions'."
a586093f
SM
875 (let ((hist-orig load-history)
876 (hist-nil-orig current-load-list))
ea4b0ca3 877 (prog1 (eval form)
cf637a34 878 (when (byte-compile-warning-enabled-p 'noruntime)
a586093f
SM
879 (let ((hist-new load-history)
880 (hist-nil-new current-load-list))
ea4b0ca3
SM
881 ;; Go through load-history, look for newly loaded files
882 ;; and mark all the functions defined therein.
883 (while (and hist-new (not (eq hist-new hist-orig)))
d1a57439
RS
884 (let ((xs (pop hist-new))
885 old-autoloads)
ea4b0ca3 886 ;; Make sure the file was not already loaded before.
997011eb 887 (unless (or (assoc (car xs) hist-orig)
3f12e5bd
GM
888 ;; Don't give both the "noruntime" and
889 ;; "cl-functions" warning for the same function.
890 ;; FIXME This seems incorrect - these are two
891 ;; independent warnings. For example, you may be
892 ;; choosing to see the cl warnings but ignore them.
893 ;; You probably don't want to ignore noruntime in the
894 ;; same way.
895 (and (byte-compile-warning-enabled-p 'cl-functions)
896 (byte-compile-cl-file-p (car xs))))
ea4b0ca3
SM
897 (dolist (s xs)
898 (cond
d1a57439
RS
899 ((symbolp s)
900 (unless (memq s old-autoloads)
6b61353c 901 (push s byte-compile-noruntime-functions)))
d1a57439 902 ((and (consp s) (eq t (car s)))
6c2161c4 903 (push (cdr s) old-autoloads))
ea4b0ca3 904 ((and (consp s) (eq 'autoload (car s)))
6b61353c 905 (push (cdr s) byte-compile-noruntime-functions)))))))
ea4b0ca3 906 ;; Go through current-load-list for the locally defined funs.
d1a57439
RS
907 (let (old-autoloads)
908 (while (and hist-nil-new (not (eq hist-nil-new hist-nil-orig)))
909 (let ((s (pop hist-nil-new)))
910 (when (and (symbolp s) (not (memq s old-autoloads)))
6b61353c 911 (push s byte-compile-noruntime-functions))
d1a57439 912 (when (and (consp s) (eq t (car s)))
997011eb 913 (push (cdr s) old-autoloads)))))))
cf637a34 914 (when (byte-compile-warning-enabled-p 'cl-functions)
b8104a2b 915 (let ((hist-new load-history))
3f12e5bd
GM
916 ;; Go through load-history, looking for the cl files.
917 ;; Since new files are added at the start of load-history,
918 ;; we scan the new history until the tail matches the old.
919 (while (and (not byte-compile-cl-functions)
920 hist-new (not (eq hist-new hist-orig)))
921 ;; We used to check if the file had already been loaded,
922 ;; but it is better to check non-nil byte-compile-cl-functions.
923 (and (byte-compile-cl-file-p (car (pop hist-new)))
924 (byte-compile-find-cl-functions))))))))
a586093f 925
4795d1c7
RS
926(defun byte-compile-eval-before-compile (form)
927 "Evaluate FORM for `eval-and-compile'."
928 (let ((hist-nil-orig current-load-list))
929 (prog1 (eval form)
930 ;; (eval-and-compile (require 'cl) turns off warnings for cl functions.
3f12e5bd
GM
931 ;; FIXME Why does it do that - just as a hack?
932 ;; There are other ways to do this nowadays.
4795d1c7
RS
933 (let ((tem current-load-list))
934 (while (not (eq tem hist-nil-orig))
935 (when (equal (car tem) '(require . cl))
cf637a34 936 (byte-compile-disable-warning 'cl-functions))
4795d1c7 937 (setq tem (cdr tem)))))))
a586093f 938\f
1c393159
JB
939;;; byte compiler messages
940
d82e848c 941(defvar byte-compile-current-form nil)
d82e848c 942(defvar byte-compile-dest-file nil)
9985d391 943(defvar byte-compile-current-file nil)
ab5111e3 944(defvar byte-compile-current-group nil)
ccb3c8de 945(defvar byte-compile-current-buffer nil)
6a619620 946
22788fb8 947;; Log something that isn't a warning.
1c393159 948(defmacro byte-compile-log (format-string &rest args)
b88a41d0
SM
949 `(and
950 byte-optimize
951 (memq byte-optimize-log '(t source))
952 (let ((print-escape-newlines t)
953 (print-level 4)
954 (print-length 4))
955 (byte-compile-log-1
956 (format
957 ,format-string
958 ,@(mapcar
959 (lambda (x) (if (symbolp x) (list 'prin1-to-string x) x))
960 args))))))
1c393159 961
22788fb8
RS
962;; Log something that isn't a warning.
963(defun byte-compile-log-1 (string)
7847454a 964 (with-current-buffer byte-compile-log-buffer
997011eb
RS
965 (let ((inhibit-read-only t))
966 (goto-char (point-max))
967 (byte-compile-warning-prefix nil nil)
968 (cond (noninteractive
969 (message " %s" string))
970 (t
971 (insert (format "%s\n" string)))))))
1c393159 972
ccb3c8de
CW
973(defvar byte-compile-read-position nil
974 "Character position we began the last `read' from.")
975(defvar byte-compile-last-position nil
976 "Last known character position in the input.")
977
978;; copied from gnus-util.el
1fd592a0 979(defsubst byte-compile-delete-first (elt list)
ccb3c8de
CW
980 (if (eq (car list) elt)
981 (cdr list)
982 (let ((total list))
983 (while (and (cdr list)
984 (not (eq (cadr list) elt)))
985 (setq list (cdr list)))
986 (when (cdr list)
987 (setcdr list (cddr list)))
988 total)))
989
990;; The purpose of this function is to iterate through the
991;; `read-symbol-positions-list'. Each time we process, say, a
992;; function definition (`defun') we remove `defun' from
993;; `read-symbol-positions-list', and set `byte-compile-last-position'
994;; to that symbol's character position. Similarly, if we encounter a
995;; variable reference, like in (1+ foo), we remove `foo' from the
996;; list. If our current position is after the symbol's position, we
997;; assume we've already passed that point, and look for the next
6b8c2efc 998;; occurrence of the symbol.
4ec5239c
LH
999;;
1000;; This function should not be called twice for the same occurrence of
1001;; a symbol, and it should not be called for symbols generated by the
1002;; byte compiler itself; because rather than just fail looking up the
1003;; symbol, we may find an occurrence of the symbol further ahead, and
1004;; then `byte-compile-last-position' as advanced too far.
1005;;
6b8c2efc 1006;; So your're probably asking yourself: Isn't this function a
ccb3c8de
CW
1007;; gross hack? And the answer, of course, would be yes.
1008(defun byte-compile-set-symbol-position (sym &optional allow-previous)
1009 (when byte-compile-read-position
1fd592a0 1010 (let (last entry)
ccb3c8de 1011 (while (progn
0b46acbf
RS
1012 (setq last byte-compile-last-position
1013 entry (assq sym read-symbol-positions-list))
1014 (when entry
1015 (setq byte-compile-last-position
1016 (+ byte-compile-read-position (cdr entry))
1017 read-symbol-positions-list
1018 (byte-compile-delete-first
1019 entry read-symbol-positions-list)))
ccb3c8de
CW
1020 (or (and allow-previous (not (= last byte-compile-last-position)))
1021 (> last byte-compile-last-position)))))))
b8175fe6 1022
22788fb8
RS
1023(defvar byte-compile-last-warned-form nil)
1024(defvar byte-compile-last-logged-file nil)
1025
22788fb8 1026;; This is used as warning-prefix for the compiler.
4390021b 1027;; It is always called with the warnings buffer current.
22788fb8 1028(defun byte-compile-warning-prefix (level entry)
997011eb
RS
1029 (let* ((inhibit-read-only t)
1030 (dir default-directory)
4390021b
RS
1031 (file (cond ((stringp byte-compile-current-file)
1032 (format "%s:" (file-relative-name byte-compile-current-file dir)))
b8175fe6 1033 ((bufferp byte-compile-current-file)
1f006824 1034 (format "Buffer %s:"
b8175fe6
GM
1035 (buffer-name byte-compile-current-file)))
1036 (t "")))
1f006824 1037 (pos (if (and byte-compile-current-file
ccb3c8de
CW
1038 (integerp byte-compile-read-position))
1039 (with-current-buffer byte-compile-current-buffer
ea1cb2bd 1040 (format "%d:%d:"
b0aa2c65
RS
1041 (save-excursion
1042 (goto-char byte-compile-last-position)
1043 (1+ (count-lines (point-min) (point-at-bol))))
ccb3c8de
CW
1044 (save-excursion
1045 (goto-char byte-compile-last-position)
1046 (1+ (current-column)))))
b8175fe6 1047 ""))
4390021b
RS
1048 (form (if (eq byte-compile-current-form :end) "end of data"
1049 (or byte-compile-current-form "toplevel form"))))
1050 (when (or (and byte-compile-current-file
1051 (not (equal byte-compile-current-file
1052 byte-compile-last-logged-file)))
6b61353c 1053 (and byte-compile-current-form
4390021b
RS
1054 (not (eq byte-compile-current-form
1055 byte-compile-last-warned-form))))
22788fb8 1056 (insert (format "\nIn %s:\n" form)))
4390021b
RS
1057 (when level
1058 (insert (format "%s%s" file pos))))
cb3069bb 1059 (setq byte-compile-last-logged-file byte-compile-current-file
22788fb8
RS
1060 byte-compile-last-warned-form byte-compile-current-form)
1061 entry)
1c393159 1062
4390021b
RS
1063;; This no-op function is used as the value of warning-series
1064;; to tell inner calls to displaying-byte-compile-warnings
1065;; not to bind warning-series.
1066(defun byte-compile-warning-series (&rest ignore)
1067 nil)
1068
db283402 1069;; (compile-mode) will cause this to be loaded.
2c52d7a3 1070(declare-function compilation-forget-errors "compile" ())
db283402 1071
7847454a 1072;; Log the start of a file in `byte-compile-log-buffer', and mark it as done.
22788fb8 1073;; Return the position of the start of the page in the log buffer.
144b2637
RS
1074;; But do nothing in batch mode.
1075(defun byte-compile-log-file ()
4390021b 1076 (and (not (equal byte-compile-current-file byte-compile-last-logged-file))
cb3069bb 1077 (not noninteractive)
7847454a 1078 (with-current-buffer (get-buffer-create byte-compile-log-buffer)
ca96ae0b 1079 (goto-char (point-max))
997011eb
RS
1080 (let* ((inhibit-read-only t)
1081 (dir (and byte-compile-current-file
4390021b
RS
1082 (file-name-directory byte-compile-current-file)))
1083 (was-same (equal default-directory dir))
1084 pt)
1085 (when dir
1086 (unless was-same
1087 (insert (format "Leaving directory `%s'\n" default-directory))))
1088 (unless (bolp)
1089 (insert "\n"))
1090 (setq pt (point-marker))
1091 (if byte-compile-current-file
1092 (insert "\f\nCompiling "
1093 (if (stringp byte-compile-current-file)
1094 (concat "file " byte-compile-current-file)
1095 (concat "buffer " (buffer-name byte-compile-current-file)))
1096 " at " (current-time-string) "\n")
1097 (insert "\f\nCompiling no file at " (current-time-string) "\n"))
1098 (when dir
1099 (setq default-directory dir)
1100 (unless was-same
1101 (insert (format "Entering directory `%s'\n" default-directory))))
6b61353c
KH
1102 (setq byte-compile-last-logged-file byte-compile-current-file
1103 byte-compile-last-warned-form nil)
977f31f8 1104 ;; Do this after setting default-directory.
5c7ffa04 1105 (unless (derived-mode-p 'compilation-mode) (compilation-mode))
b88a41d0 1106 (compilation-forget-errors)
22788fb8
RS
1107 pt))))
1108
7847454a 1109;; Log a message STRING in `byte-compile-log-buffer'.
22788fb8
RS
1110;; Also log the current function and file if not already done.
1111(defun byte-compile-log-warning (string &optional fill level)
1112 (let ((warning-prefix-function 'byte-compile-warning-prefix)
6b61353c 1113 (warning-type-format "")
997011eb
RS
1114 (warning-fill-prefix (if fill " "))
1115 (inhibit-read-only t))
7847454a 1116 (display-warning 'bytecomp string level byte-compile-log-buffer)))
144b2637 1117
1c393159 1118(defun byte-compile-warn (format &rest args)
22788fb8 1119 "Issue a byte compiler warning; use (format FORMAT ARGS...) for message."
1c393159
JB
1120 (setq format (apply 'format format args))
1121 (if byte-compile-error-on-warn
1122 (error "%s" format) ; byte-compile-file catches and logs it
22788fb8
RS
1123 (byte-compile-log-warning format t :warning)))
1124
5791bedf
GM
1125(defun byte-compile-warn-obsolete (symbol)
1126 "Warn that SYMBOL (a variable or function) is obsolete."
1127 (when (byte-compile-warning-enabled-p 'obsolete)
1128 (let* ((funcp (get symbol 'byte-obsolete-info))
1129 (obsolete (or funcp (get symbol 'byte-obsolete-variable)))
1130 (instead (car obsolete))
1131 (asof (if funcp (nth 2 obsolete) (cdr obsolete))))
8480fc7c
GM
1132 (unless (and funcp (memq symbol byte-compile-not-obsolete-funcs))
1133 (byte-compile-warn "`%s' is an obsolete %s%s%s" symbol
1134 (if funcp "function" "variable")
1135 (if asof (concat " (as of Emacs " asof ")") "")
1136 (cond ((stringp instead)
1137 (concat "; " instead))
1138 (instead
1139 (format "; use `%s' instead." instead))
1140 (t ".")))))))
5791bedf 1141
0b030df7 1142(defun byte-compile-report-error (error-info)
22788fb8 1143 "Report Lisp error in compilation. ERROR-INFO is the error data."
ab94e6e7 1144 (setq byte-compiler-error-flag t)
22788fb8
RS
1145 (byte-compile-log-warning
1146 (error-message-string error-info)
1147 nil :error))
1c393159 1148\f
1c393159
JB
1149;;; sanity-checking arglists
1150
1151(defun byte-compile-fdefinition (name macro-p)
ced10a4c
SM
1152 ;; If a function has an entry saying (FUNCTION . t).
1153 ;; that means we know it is defined but we don't know how.
1154 ;; If a function has an entry saying (FUNCTION . nil),
1155 ;; that means treat it as not defined.
1c393159
JB
1156 (let* ((list (if macro-p
1157 byte-compile-macro-environment
5286a842 1158 byte-compile-function-environment))
1c393159
JB
1159 (env (cdr (assq name list))))
1160 (or env
1161 (let ((fn name))
1162 (while (and (symbolp fn)
1163 (fboundp fn)
1164 (or (symbolp (symbol-function fn))
1165 (consp (symbol-function fn))
1166 (and (not macro-p)
ed015bdd 1167 (byte-code-function-p (symbol-function fn)))))
1c393159 1168 (setq fn (symbol-function fn)))
9d28c33e
SM
1169 (let ((advertised (gethash (if (and (symbolp fn) (fboundp fn))
1170 ;; Could be a subr.
1171 (symbol-function fn)
1172 fn)
1173 advertised-signature-table t)))
ced10a4c
SM
1174 (cond
1175 ((listp advertised)
1176 (if macro-p
1177 `(macro lambda ,advertised)
1178 `(lambda ,advertised)))
1179 ((and (not macro-p) (byte-code-function-p fn)) fn)
1180 ((not (consp fn)) nil)
1181 ((eq 'macro (car fn)) (cdr fn))
1182 (macro-p nil)
1183 ((eq 'autoload (car fn)) nil)
1184 (t fn)))))))
1c393159
JB
1185
1186(defun byte-compile-arglist-signature (arglist)
e2abe5a1
SM
1187 (if (integerp arglist)
1188 ;; New style byte-code arglist.
1189 (cons (logand arglist 127) ;Mandatory.
1190 (if (zerop (logand arglist 128)) ;No &rest.
1191 (lsh arglist -8))) ;Nonrest.
1192 ;; Old style byte-code, or interpreted function.
1193 (let ((args 0)
1194 opts
1195 restp)
1196 (while arglist
1197 (cond ((eq (car arglist) '&optional)
1198 (or opts (setq opts 0)))
1199 ((eq (car arglist) '&rest)
1200 (if (cdr arglist)
1201 (setq restp t
1202 arglist nil)))
1203 (t
1204 (if opts
1205 (setq opts (1+ opts))
1c393159 1206 (setq args (1+ args)))))
e2abe5a1
SM
1207 (setq arglist (cdr arglist)))
1208 (cons args (if restp nil (if opts (+ args opts) args))))))
1c393159
JB
1209
1210
1211(defun byte-compile-arglist-signatures-congruent-p (old new)
1212 (not (or
1213 (> (car new) (car old)) ; requires more args now
a7acbbe4 1214 (and (null (cdr old)) ; took rest-args, doesn't any more
1c393159
JB
1215 (cdr new))
1216 (and (cdr new) (cdr old) ; can't take as many args now
1217 (< (cdr new) (cdr old)))
1218 )))
1219
1220(defun byte-compile-arglist-signature-string (signature)
1221 (cond ((null (cdr signature))
1222 (format "%d+" (car signature)))
1223 ((= (car signature) (cdr signature))
1224 (format "%d" (car signature)))
1225 (t (format "%d-%d" (car signature) (cdr signature)))))
1226
1227
52799cb8 1228;; Warn if the form is calling a function with the wrong number of arguments.
1c393159 1229(defun byte-compile-callargs-warn (form)
1c393159
JB
1230 (let* ((def (or (byte-compile-fdefinition (car form) nil)
1231 (byte-compile-fdefinition (car form) t)))
a7a7ddf1 1232 (sig (if (and def (not (eq def t)))
416d3588
GM
1233 (progn
1234 (and (eq (car-safe def) 'macro)
1235 (eq (car-safe (cdr-safe def)) 'lambda)
1236 (setq def (cdr def)))
1237 (byte-compile-arglist-signature
1238 (if (memq (car-safe def) '(declared lambda))
1239 (nth 1 def)
1240 (if (byte-code-function-p def)
1241 (aref def 0)
1242 '(&rest def)))))
ed62683d
DL
1243 (if (and (fboundp (car form))
1244 (subrp (symbol-function (car form))))
1245 (subr-arity (symbol-function (car form))))))
1c393159 1246 (ncall (length (cdr form))))
ed62683d
DL
1247 ;; Check many or unevalled from subr-arity.
1248 (if (and (cdr-safe sig)
1249 (not (numberp (cdr sig))))
1250 (setcdr sig nil))
1c393159 1251 (if sig
ccb3c8de 1252 (when (or (< ncall (car sig))
1c393159 1253 (and (cdr sig) (> ncall (cdr sig))))
ccb3c8de
CW
1254 (byte-compile-set-symbol-position (car form))
1255 (byte-compile-warn
1256 "%s called with %d argument%s, but %s %s"
1257 (car form) ncall
1258 (if (= 1 ncall) "" "s")
1259 (if (< ncall (car sig))
1260 "requires"
1261 "accepts only")
ba76e7fa 1262 (byte-compile-arglist-signature-string sig))))
6b61353c 1263 (byte-compile-format-warn form)
ba76e7fa
SM
1264 ;; Check to see if the function will be available at runtime
1265 ;; and/or remember its arity if it's unknown.
a7a7ddf1 1266 (or (and (or def (fboundp (car form))) ; might be a subr or autoload.
6b61353c 1267 (not (memq (car form) byte-compile-noruntime-functions)))
ba76e7fa
SM
1268 (eq (car form) byte-compile-current-form) ; ## this doesn't work
1269 ; with recursion.
1270 ;; It's a currently-undefined function.
1271 ;; Remember number of args in call.
1272 (let ((cons (assq (car form) byte-compile-unresolved-functions))
1273 (n (length (cdr form))))
1274 (if cons
1275 (or (memq n (cdr cons))
1276 (setcdr cons (cons n (cdr cons))))
977b50fb
SM
1277 (push (list (car form) n)
1278 byte-compile-unresolved-functions))))))
1c393159 1279
6b61353c
KH
1280(defun byte-compile-format-warn (form)
1281 "Warn if FORM is `format'-like with inconsistent args.
1282Applies if head of FORM is a symbol with non-nil property
1283`byte-compile-format-like' and first arg is a constant string.
1284Then check the number of format fields matches the number of
1285extra args."
1286 (when (and (symbolp (car form))
1287 (stringp (nth 1 form))
1288 (get (car form) 'byte-compile-format-like))
1289 (let ((nfields (with-temp-buffer
1290 (insert (nth 1 form))
b8104a2b 1291 (goto-char (point-min))
6b61353c
KH
1292 (let ((n 0))
1293 (while (re-search-forward "%." nil t)
1294 (unless (eq ?% (char-after (1+ (match-beginning 0))))
1295 (setq n (1+ n))))
1296 n)))
1297 (nargs (- (length form) 2)))
1298 (unless (= nargs nfields)
1299 (byte-compile-warn
1300 "`%s' called with %d args to fill %d format field(s)" (car form)
1301 nargs nfields)))))
1302
1303(dolist (elt '(format message error))
1304 (put elt 'byte-compile-format-like t))
1305
11efeb9b
RS
1306;; Warn if a custom definition fails to specify :group.
1307(defun byte-compile-nogroup-warn (form)
ab5111e3
SM
1308 (if (and (memq (car form) '(custom-declare-face custom-declare-variable))
1309 byte-compile-current-group)
1310 ;; The group will be provided implicitly.
1311 nil
1312 (let ((keyword-args (cdr (cdr (cdr (cdr form)))))
1313 (name (cadr form)))
1314 (or (not (eq (car-safe name) 'quote))
3ab6a7ae
SM
1315 (and (eq (car form) 'custom-declare-group)
1316 (equal name ''emacs))
1317 (plist-get keyword-args :group)
1318 (not (and (consp name) (eq (car name) 'quote)))
1319 (byte-compile-warn
1320 "%s for `%s' fails to specify containing group"
1321 (cdr (assq (car form)
ab5111e3
SM
1322 '((custom-declare-group . defgroup)
1323 (custom-declare-face . defface)
1324 (custom-declare-variable . defcustom))))
1325 (cadr name)))
1326 ;; Update the current group, if needed.
1327 (if (and byte-compile-current-file ;Only when byte-compiling a whole file.
1328 (eq (car form) 'custom-declare-group)
1329 (eq (car-safe name) 'quote))
1330 (setq byte-compile-current-group (cadr name))))))
11efeb9b 1331
52799cb8
RS
1332;; Warn if the function or macro is being redefined with a different
1333;; number of arguments.
1c393159 1334(defun byte-compile-arglist-warn (form macrop)
a9de04fa
SM
1335 (let* ((name (nth 1 form))
1336 (old (byte-compile-fdefinition name macrop)))
a7a7ddf1 1337 (if (and old (not (eq old t)))
416d3588
GM
1338 (progn
1339 (and (eq 'macro (car-safe old))
1340 (eq 'lambda (car-safe (cdr-safe old)))
1341 (setq old (cdr old)))
1342 (let ((sig1 (byte-compile-arglist-signature
b38b1ec0
SM
1343 (pcase old
1344 (`(lambda ,args . ,_) args)
1345 (`(closure ,_ ,_ ,args . ,_) args)
1346 ((pred byte-code-function-p) (aref old 0))
1347 (t '(&rest def)))))
416d3588
GM
1348 (sig2 (byte-compile-arglist-signature (nth 2 form))))
1349 (unless (byte-compile-arglist-signatures-congruent-p sig1 sig2)
a9de04fa 1350 (byte-compile-set-symbol-position name)
416d3588
GM
1351 (byte-compile-warn
1352 "%s %s used to take %s %s, now takes %s"
1353 (if (eq (car form) 'defun) "function" "macro")
a9de04fa 1354 name
416d3588
GM
1355 (byte-compile-arglist-signature-string sig1)
1356 (if (equal sig1 '(1 . 1)) "argument" "arguments")
1357 (byte-compile-arglist-signature-string sig2)))))
1c393159 1358 ;; This is the first definition. See if previous calls are compatible.
a9de04fa 1359 (let ((calls (assq name byte-compile-unresolved-functions))
1c393159 1360 nums sig min max)
a9de04fa
SM
1361 (when calls
1362 (when (and (symbolp name)
1363 (eq (get name 'byte-optimizer)
1364 'byte-compile-inline-expand))
1365 (byte-compile-warn "defsubst `%s' was used before it was defined"
1366 name))
1367 (setq sig (byte-compile-arglist-signature (nth 2 form))
1368 nums (sort (copy-sequence (cdr calls)) (function <))
1369 min (car nums)
1370 max (car (nreverse nums)))
1371 (when (or (< min (car sig))
1372 (and (cdr sig) (> max (cdr sig))))
1373 (byte-compile-set-symbol-position name)
1374 (byte-compile-warn
1375 "%s being defined to take %s%s, but was previously called with %s"
1376 name
1377 (byte-compile-arglist-signature-string sig)
1378 (if (equal sig '(1 . 1)) " arg" " args")
1379 (byte-compile-arglist-signature-string (cons min max))))
1380
1381 (setq byte-compile-unresolved-functions
1382 (delq calls byte-compile-unresolved-functions)))))))
1c393159 1383
95c997fa
RS
1384(defvar byte-compile-cl-functions nil
1385 "List of functions defined in CL.")
1386
3f12e5bd
GM
1387;; Can't just add this to cl-load-hook, because that runs just before
1388;; the forms from cl.el get added to load-history.
95c997fa
RS
1389(defun byte-compile-find-cl-functions ()
1390 (unless byte-compile-cl-functions
1391 (dolist (elt load-history)
3f12e5bd
GM
1392 (and (byte-compile-cl-file-p (car elt))
1393 (dolist (e (cdr elt))
1394 ;; Includes the cl-foo functions that cl autoloads.
1395 (when (memq (car-safe e) '(autoload defun))
1396 (push (cdr e) byte-compile-cl-functions)))))))
95c997fa 1397
4795d1c7
RS
1398(defun byte-compile-cl-warn (form)
1399 "Warn if FORM is a call of a function from the CL package."
95c997fa
RS
1400 (let ((func (car-safe form)))
1401 (if (and byte-compile-cl-functions
1402 (memq func byte-compile-cl-functions)
6b61353c 1403 ;; Aliases which won't have been expanded at this point.
4795d1c7
RS
1404 ;; These aren't all aliases of subrs, so not trivial to
1405 ;; avoid hardwiring the list.
1406 (not (memq func
9cb9a7bc
RS
1407 '(cl-block-wrapper cl-block-throw
1408 multiple-value-call nth-value
95c997fa 1409 copy-seq first second rest endp cl-member
d1a57439
RS
1410 ;; These are included in generated code
1411 ;; that can't be called except at compile time
1412 ;; or unless cl is loaded anyway.
1413 cl-defsubst-expand cl-struct-setf-expander
8f876842
RS
1414 ;; These would sometimes be warned about
1415 ;; but such warnings are never useful,
1416 ;; so don't warn about them.
118861df 1417 macroexpand cl-macroexpand-all
b38b1ec0 1418 cl-compiling-file))))
7a16788b 1419 (byte-compile-warn "function `%s' from cl package called at runtime"
4795d1c7
RS
1420 func)))
1421 form)
1422
a586093f 1423(defun byte-compile-print-syms (str1 strn syms)
ccb3c8de
CW
1424 (when syms
1425 (byte-compile-set-symbol-position (car syms) t))
b8175fe6
GM
1426 (cond ((and (cdr syms) (not noninteractive))
1427 (let* ((str strn)
1428 (L (length str))
1429 s)
1430 (while syms
1431 (setq s (symbol-name (pop syms))
1432 L (+ L (length s) 2))
1433 (if (< L (1- fill-column))
1434 (setq str (concat str " " s (and syms ",")))
1435 (setq str (concat str "\n " s (and syms ","))
1436 L (+ (length s) 4))))
1437 (byte-compile-warn "%s" str)))
1438 ((cdr syms)
1f006824 1439 (byte-compile-warn "%s %s"
b8175fe6
GM
1440 strn
1441 (mapconcat #'symbol-name syms ", ")))
1442
1443 (syms
1444 (byte-compile-warn str1 (car syms)))))
a586093f 1445
1f006824 1446;; If we have compiled any calls to functions which are not known to be
52799cb8
RS
1447;; defined, issue a warning enumerating them.
1448;; `unresolved' in the list `byte-compile-warnings' disables this.
1c393159 1449(defun byte-compile-warn-about-unresolved-functions ()
cf637a34 1450 (when (byte-compile-warning-enabled-p 'unresolved)
b8175fe6 1451 (let ((byte-compile-current-form :end)
a586093f
SM
1452 (noruntime nil)
1453 (unresolved nil))
1454 ;; Separate the functions that will not be available at runtime
1455 ;; from the truly unresolved ones.
1456 (dolist (f byte-compile-unresolved-functions)
1457 (setq f (car f))
1458 (if (fboundp f) (push f noruntime) (push f unresolved)))
1459 ;; Complain about the no-run-time functions
1460 (byte-compile-print-syms
b8175fe6
GM
1461 "the function `%s' might not be defined at runtime."
1462 "the following functions might not be defined at runtime:"
a586093f
SM
1463 noruntime)
1464 ;; Complain about the unresolved functions
1465 (byte-compile-print-syms
b8175fe6
GM
1466 "the function `%s' is not known to be defined."
1467 "the following functions are not known to be defined:"
a586093f 1468 unresolved)))
1c393159
JB
1469 nil)
1470
1471\f
582a857c 1472(defsubst byte-compile-const-symbol-p (symbol &optional any-value)
6c2161c4 1473 "Non-nil if SYMBOL is constant.
582a857c 1474If ANY-VALUE is nil, only return non-nil if the value of the symbol is the
6c2161c4 1475symbol itself."
1639b803 1476 (or (memq symbol '(nil t))
6c2161c4 1477 (keywordp symbol)
d988dbf6
SM
1478 (if any-value
1479 (or (memq symbol byte-compile-const-variables)
1480 ;; FIXME: We should provide a less intrusive way to find out
a9de04fa 1481 ;; if a variable is "constant".
d988dbf6
SM
1482 (and (boundp symbol)
1483 (condition-case nil
1484 (progn (set symbol (symbol-value symbol)) nil)
1485 (setting-constant t)))))))
1639b803 1486
1c393159 1487(defmacro byte-compile-constp (form)
c5091f25 1488 "Return non-nil if FORM is a constant."
1639b803
DL
1489 `(cond ((consp ,form) (eq (car ,form) 'quote))
1490 ((not (symbolp ,form)))
1491 ((byte-compile-const-symbol-p ,form))))
1c393159
JB
1492
1493(defmacro byte-compile-close-variables (&rest body)
876c194c 1494 (declare (debug t))
1c393159
JB
1495 (cons 'let
1496 (cons '(;;
1497 ;; Close over these variables to encapsulate the
1498 ;; compilation state
1499 ;;
1500 (byte-compile-macro-environment
1501 ;; Copy it because the compiler may patch into the
1502 ;; macroenvironment.
1503 (copy-alist byte-compile-initial-macro-environment))
1504 (byte-compile-function-environment nil)
1505 (byte-compile-bound-variables nil)
6c2161c4 1506 (byte-compile-const-variables nil)
1c393159
JB
1507 (byte-compile-free-references nil)
1508 (byte-compile-free-assignments nil)
1509 ;;
1510 ;; Close over these variables so that `byte-compiler-options'
1511 ;; can change them on a per-file basis.
1512 ;;
1513 (byte-compile-verbose byte-compile-verbose)
1514 (byte-optimize byte-optimize)
d82e848c
RS
1515 (byte-compile-dynamic byte-compile-dynamic)
1516 (byte-compile-dynamic-docstrings
1517 byte-compile-dynamic-docstrings)
52799cb8
RS
1518;; (byte-compile-generate-emacs19-bytecodes
1519;; byte-compile-generate-emacs19-bytecodes)
cf637a34 1520 (byte-compile-warnings byte-compile-warnings)
1c393159
JB
1521 )
1522 body)))
1523
1c393159 1524(defmacro displaying-byte-compile-warnings (&rest body)
876c194c 1525 (declare (debug t))
4390021b
RS
1526 `(let* ((--displaying-byte-compile-warnings-fn (lambda () ,@body))
1527 (warning-series-started
1528 (and (markerp warning-series)
1529 (eq (marker-buffer warning-series)
7847454a 1530 (get-buffer byte-compile-log-buffer)))))
95c997fa 1531 (byte-compile-find-cl-functions)
4390021b
RS
1532 (if (or (eq warning-series 'byte-compile-warning-series)
1533 warning-series-started)
1534 ;; warning-series does come from compilation,
1535 ;; so don't bind it, but maybe do set it.
1536 (let (tem)
1537 ;; Log the file name. Record position of that text.
1538 (setq tem (byte-compile-log-file))
1539 (unless warning-series-started
1540 (setq warning-series (or tem 'byte-compile-warning-series)))
1541 (if byte-compile-debug
1542 (funcall --displaying-byte-compile-warnings-fn)
1543 (condition-case error-info
1544 (funcall --displaying-byte-compile-warnings-fn)
1545 (error (byte-compile-report-error error-info)))))
1546 ;; warning-series does not come from compilation, so bind it.
1547 (let ((warning-series
1548 ;; Log the file name. Record position of that text.
1549 (or (byte-compile-log-file) 'byte-compile-warning-series)))
1550 (if byte-compile-debug
22788fb8 1551 (funcall --displaying-byte-compile-warnings-fn)
4390021b
RS
1552 (condition-case error-info
1553 (funcall --displaying-byte-compile-warnings-fn)
1554 (error (byte-compile-report-error error-info))))))))
1c393159 1555\f
fd5285f3 1556;;;###autoload
9742dbc0
RS
1557(defun byte-force-recompile (directory)
1558 "Recompile every `.el' file in DIRECTORY that already has a `.elc' file.
1559Files in subdirectories of DIRECTORY are processed also."
c0f43df5 1560 (interactive "DByte force recompile (directory): ")
9742dbc0
RS
1561 (byte-recompile-directory directory nil t))
1562
1c3b663f
GM
1563;; The `bytecomp-' prefix is applied to all local variables with
1564;; otherwise common names in this and similar functions for the sake
1565;; of the boundp test in byte-compile-variable-ref.
1566;; http://lists.gnu.org/archive/html/emacs-devel/2008-01/msg00237.html
1567;; http://lists.gnu.org/archive/html/bug-gnu-emacs/2008-02/msg00134.html
8480fc7c 1568;; Note that similar considerations apply to command-line-1 in startup.el.
9742dbc0 1569;;;###autoload
1c3b663f
GM
1570(defun byte-recompile-directory (bytecomp-directory &optional bytecomp-arg
1571 bytecomp-force)
1572 "Recompile every `.el' file in BYTECOMP-DIRECTORY that needs recompilation.
2b9c3b12 1573This happens when a `.elc' file exists but is older than the `.el' file.
1c3b663f 1574Files in subdirectories of BYTECOMP-DIRECTORY are processed also.
1c393159 1575
c4f2cabd 1576If the `.elc' file does not exist, normally this function *does not*
1c3b663f
GM
1577compile the corresponding `.el' file. However, if the prefix argument
1578BYTECOMP-ARG is 0, that means do compile all those files. A nonzero
1579BYTECOMP-ARG means ask the user, for each such `.el' file, whether to
1580compile it. A nonzero BYTECOMP-ARG also means ask about each subdirectory
1581before scanning it.
1582
1583If the third argument BYTECOMP-FORCE is non-nil, recompile every `.el' file
1584that already has a `.elc' file."
1c393159 1585 (interactive "DByte recompile directory: \nP")
1c3b663f
GM
1586 (if bytecomp-arg
1587 (setq bytecomp-arg (prefix-numeric-value bytecomp-arg)))
e27c3564
JB
1588 (if noninteractive
1589 nil
1590 (save-some-buffers)
ba901388 1591 (force-mode-line-update))
7847454a 1592 (with-current-buffer (get-buffer-create byte-compile-log-buffer)
1c3b663f 1593 (setq default-directory (expand-file-name bytecomp-directory))
977f31f8
RS
1594 ;; compilation-mode copies value of default-directory.
1595 (unless (eq major-mode 'compilation-mode)
1596 (compilation-mode))
1c3b663f 1597 (let ((bytecomp-directories (list default-directory))
4eb4926c
RS
1598 (default-directory default-directory)
1599 (skip-count 0)
1600 (fail-count 0)
1601 (file-count 0)
1602 (dir-count 0)
1603 last-dir)
1604 (displaying-byte-compile-warnings
1c3b663f
GM
1605 (while bytecomp-directories
1606 (setq bytecomp-directory (car bytecomp-directories))
1607 (message "Checking %s..." bytecomp-directory)
1608 (let ((bytecomp-files (directory-files bytecomp-directory))
1609 bytecomp-source bytecomp-dest)
1610 (dolist (bytecomp-file bytecomp-files)
1611 (setq bytecomp-source
1612 (expand-file-name bytecomp-file bytecomp-directory))
1613 (if (and (not (member bytecomp-file '("RCS" "CVS")))
1614 (not (eq ?\. (aref bytecomp-file 0)))
1615 (file-directory-p bytecomp-source)
1616 (not (file-symlink-p bytecomp-source)))
4eb4926c 1617 ;; This file is a subdirectory. Handle them differently.
1c3b663f
GM
1618 (when (or (null bytecomp-arg)
1619 (eq 0 bytecomp-arg)
1620 (y-or-n-p (concat "Check " bytecomp-source "? ")))
1621 (setq bytecomp-directories
1622 (nconc bytecomp-directories (list bytecomp-source))))
4eb4926c 1623 ;; It is an ordinary file. Decide whether to compile it.
1c3b663f
GM
1624 (if (and (string-match emacs-lisp-file-regexp bytecomp-source)
1625 (file-readable-p bytecomp-source)
1626 (not (auto-save-file-name-p bytecomp-source))
13639aab
GM
1627 (not (string-equal dir-locals-file
1628 (file-name-nondirectory
430e7297
JD
1629 bytecomp-source))))
1630 (progn (let ((bytecomp-res (byte-recompile-file
1631 bytecomp-source
1632 bytecomp-force bytecomp-arg)))
1c3b663f 1633 (cond ((eq bytecomp-res 'no-byte-compile)
4eb4926c 1634 (setq skip-count (1+ skip-count)))
1c3b663f 1635 ((eq bytecomp-res t)
4eb4926c 1636 (setq file-count (1+ file-count)))
1c3b663f 1637 ((eq bytecomp-res nil)
4eb4926c
RS
1638 (setq fail-count (1+ fail-count)))))
1639 (or noninteractive
1c3b663f
GM
1640 (message "Checking %s..." bytecomp-directory))
1641 (if (not (eq last-dir bytecomp-directory))
1642 (setq last-dir bytecomp-directory
4eb4926c
RS
1643 dir-count (1+ dir-count)))
1644 )))))
1c3b663f 1645 (setq bytecomp-directories (cdr bytecomp-directories))))
4eb4926c
RS
1646 (message "Done (Total of %d file%s compiled%s%s%s)"
1647 file-count (if (= file-count 1) "" "s")
1648 (if (> fail-count 0) (format ", %d failed" fail-count) "")
1649 (if (> skip-count 0) (format ", %d skipped" skip-count) "")
1c3b663f
GM
1650 (if (> dir-count 1)
1651 (format " in %d directories" dir-count) "")))))
1c393159 1652
fef3407e 1653(defvar no-byte-compile nil
2b9c3b12 1654 "Non-nil to prevent byte-compiling of Emacs Lisp code.
fef3407e
SM
1655This is normally set in local file variables at the end of the elisp file:
1656
ce5b520a 1657\;; Local Variables:\n;; no-byte-compile: t\n;; End: ") ;Backslash for compile-main.
631c8020 1658;;;###autoload(put 'no-byte-compile 'safe-local-variable 'booleanp)
fef3407e 1659
430e7297
JD
1660(defun byte-recompile-file (bytecomp-filename &optional bytecomp-force bytecomp-arg load)
1661 "Recompile BYTECOMP-FILENAME file if it needs recompilation.
1662This happens when its `.elc' file is older than itself.
1663
1664If the `.elc' file exists and is up-to-date, normally this
1665function *does not* compile BYTECOMP-FILENAME. However, if the
1666prefix argument BYTECOMP-FORCE is set, that means do compile
1667BYTECOMP-FILENAME even if the destination already exists and is
1668up-to-date.
1669
1670If the `.elc' file does not exist, normally this function *does
1671not* compile BYTECOMP-FILENAME. If BYTECOMP-ARG is 0, that means
1672compile the file even if it has never been compiled before.
1673A nonzero BYTECOMP-ARG means ask the user.
1674
1675If LOAD is set, `load' the file after compiling.
1676
1677The value returned is the value returned by `byte-compile-file',
1678or 'no-byte-compile if the file did not need recompilation."
1679 (interactive
1680 (let ((bytecomp-file buffer-file-name)
1681 (bytecomp-file-name nil)
1682 (bytecomp-file-dir nil))
1683 (and bytecomp-file
1684 (eq (cdr (assq 'major-mode (buffer-local-variables)))
1685 'emacs-lisp-mode)
1686 (setq bytecomp-file-name (file-name-nondirectory bytecomp-file)
1687 bytecomp-file-dir (file-name-directory bytecomp-file)))
1688 (list (read-file-name (if current-prefix-arg
1689 "Byte compile file: "
1690 "Byte recompile file: ")
1691 bytecomp-file-dir bytecomp-file-name nil)
1692 current-prefix-arg)))
1693 (let ((bytecomp-dest
1694 (byte-compile-dest-file bytecomp-filename))
1695 ;; Expand now so we get the current buffer's defaults
1696 (bytecomp-filename (expand-file-name bytecomp-filename)))
1697 (if (if (file-exists-p bytecomp-dest)
1698 ;; File was already compiled
1699 ;; Compile if forced to, or filename newer
1700 (or bytecomp-force
1701 (file-newer-than-file-p bytecomp-filename
1702 bytecomp-dest))
fa14dc18
NF
1703 (and bytecomp-arg
1704 (or (eq 0 bytecomp-arg)
1705 (y-or-n-p (concat "Compile "
1706 bytecomp-filename "? ")))))
430e7297
JD
1707 (progn
1708 (if (and noninteractive (not byte-compile-verbose))
feb5e60a 1709 (message "Compiling %s..." bytecomp-filename))
430e7297
JD
1710 (byte-compile-file bytecomp-filename load))
1711 (when load (load bytecomp-filename))
1712 'no-byte-compile)))
1713
fd5285f3 1714;;;###autoload
1c3b663f
GM
1715(defun byte-compile-file (bytecomp-filename &optional load)
1716 "Compile a file of Lisp code named BYTECOMP-FILENAME into a file of byte code.
1717The output file's name is generated by passing BYTECOMP-FILENAME to the
f279aaab 1718function `byte-compile-dest-file' (which see).
3614fc84 1719With prefix arg (noninteractively: 2nd arg), LOAD the file after compiling.
d90a41e8 1720The value is non-nil if there were no errors, nil if errors."
1c393159
JB
1721;; (interactive "fByte compile file: \nP")
1722 (interactive
1c3b663f
GM
1723 (let ((bytecomp-file buffer-file-name)
1724 (bytecomp-file-name nil)
1725 (bytecomp-file-dir nil))
1726 (and bytecomp-file
1c393159
JB
1727 (eq (cdr (assq 'major-mode (buffer-local-variables)))
1728 'emacs-lisp-mode)
1c3b663f
GM
1729 (setq bytecomp-file-name (file-name-nondirectory bytecomp-file)
1730 bytecomp-file-dir (file-name-directory bytecomp-file)))
52799cb8
RS
1731 (list (read-file-name (if current-prefix-arg
1732 "Byte compile and load file: "
1733 "Byte compile file: ")
1c3b663f 1734 bytecomp-file-dir bytecomp-file-name nil)
fd5285f3 1735 current-prefix-arg)))
1c393159 1736 ;; Expand now so we get the current buffer's defaults
1c3b663f 1737 (setq bytecomp-filename (expand-file-name bytecomp-filename))
1c393159
JB
1738
1739 ;; If we're compiling a file that's in a buffer and is modified, offer
1740 ;; to save it first.
1741 (or noninteractive
1c3b663f 1742 (let ((b (get-file-buffer (expand-file-name bytecomp-filename))))
1c393159 1743 (if (and b (buffer-modified-p b)
a586093f 1744 (y-or-n-p (format "Save buffer %s first? " (buffer-name b))))
008e2c2a 1745 (with-current-buffer b (save-buffer)))))
1c393159 1746
4390021b
RS
1747 ;; Force logging of the file name for each file compiled.
1748 (setq byte-compile-last-logged-file nil)
1c3b663f 1749 (let ((byte-compile-current-file bytecomp-filename)
ab5111e3 1750 (byte-compile-current-group nil)
dc14ae36 1751 (set-auto-coding-for-load t)
d82e848c
RS
1752 target-file input-buffer output-buffer
1753 byte-compile-dest-file)
1c3b663f 1754 (setq target-file (byte-compile-dest-file bytecomp-filename))
d82e848c 1755 (setq byte-compile-dest-file target-file)
ea1cb2bd 1756 (with-current-buffer
008e2c2a 1757 (setq input-buffer (get-buffer-create " *Compiler Input*"))
1c393159 1758 (erase-buffer)
7a28e3b1 1759 (setq buffer-file-coding-system nil)
746dd298 1760 ;; Always compile an Emacs Lisp file as multibyte
b92dd692 1761 ;; unless the file itself forces unibyte with -*-coding: raw-text;-*-
746dd298 1762 (set-buffer-multibyte t)
1c3b663f 1763 (insert-file-contents bytecomp-filename)
844da0ff
KH
1764 ;; Mimic the way after-insert-file-set-coding can make the
1765 ;; buffer unibyte when visiting this file.
7a28e3b1
RS
1766 (when (or (eq last-coding-system-used 'no-conversion)
1767 (eq (coding-system-type last-coding-system-used) 5))
1768 ;; For coding systems no-conversion and raw-text...,
1769 ;; edit the buffer as unibyte.
1770 (set-buffer-multibyte nil))
1c393159
JB
1771 ;; Run hooks including the uncompression hook.
1772 ;; If they change the file name, then change it for the output also.
14acf2f5
SM
1773 (letf ((buffer-file-name bytecomp-filename)
1774 ((default-value 'major-mode) 'emacs-lisp-mode)
1775 ;; Ignore unsafe local variables.
1776 ;; We only care about a few of them for our purposes.
1777 (enable-local-variables :safe)
1778 (enable-local-eval nil))
aa9addfa
RS
1779 ;; Arg of t means don't alter enable-local-variables.
1780 (normal-mode t)
1c3b663f 1781 (setq bytecomp-filename buffer-file-name))
cd891e68 1782 ;; Set the default directory, in case an eval-when-compile uses it.
1c3b663f 1783 (setq default-directory (file-name-directory bytecomp-filename)))
3614fc84
GM
1784 ;; Check if the file's local variables explicitly specify not to
1785 ;; compile this file.
fef3407e 1786 (if (with-current-buffer input-buffer no-byte-compile)
3614fc84 1787 (progn
6b61353c 1788 ;; (message "%s not compiled because of `no-byte-compile: %s'"
1c3b663f 1789 ;; (file-relative-name bytecomp-filename)
6b61353c
KH
1790 ;; (with-current-buffer input-buffer no-byte-compile))
1791 (when (file-exists-p target-file)
1792 (message "%s deleted because of `no-byte-compile: %s'"
1793 (file-relative-name target-file)
1794 (buffer-local-value 'no-byte-compile input-buffer))
1795 (condition-case nil (delete-file target-file) (error nil)))
82345a9a 1796 ;; We successfully didn't compile this file.
d90a41e8 1797 'no-byte-compile)
ccb3c8de 1798 (when byte-compile-verbose
1c3b663f 1799 (message "Compiling %s..." bytecomp-filename))
82345a9a
SM
1800 (setq byte-compiler-error-flag nil)
1801 ;; It is important that input-buffer not be current at this call,
1802 ;; so that the value of point set in input-buffer
1803 ;; within byte-compile-from-buffer lingers in that buffer.
4f6d5bf0
SM
1804 (setq output-buffer
1805 (save-current-buffer
1c3b663f 1806 (byte-compile-from-buffer input-buffer bytecomp-filename)))
82345a9a
SM
1807 (if byte-compiler-error-flag
1808 nil
ccb3c8de 1809 (when byte-compile-verbose
1c3b663f 1810 (message "Compiling %s...done" bytecomp-filename))
82345a9a
SM
1811 (kill-buffer input-buffer)
1812 (with-current-buffer output-buffer
1813 (goto-char (point-max))
1814 (insert "\n") ; aaah, unix.
82345a9a
SM
1815 (if (file-writable-p target-file)
1816 ;; We must disable any code conversion here.
9c524fcb
GM
1817 (let* ((coding-system-for-write 'no-conversion)
1818 ;; Write to a tempfile so that if another Emacs
1819 ;; process is trying to load target-file (eg in a
1820 ;; parallel bootstrap), it does not risk getting a
1821 ;; half-finished file. (Bug#4196)
1822 (tempfile (make-temp-name target-file))
1823 (kill-emacs-hook
1824 (cons (lambda () (ignore-errors (delete-file tempfile)))
1825 kill-emacs-hook)))
82345a9a
SM
1826 (if (memq system-type '(ms-dos 'windows-nt))
1827 (setq buffer-file-type t))
7eb662be 1828 (write-region (point-min) (point-max) tempfile nil 1)
0f34ae28
GM
1829 ;; This has the intentional side effect that any
1830 ;; hard-links to target-file continue to
1831 ;; point to the old file (this makes it possible
1832 ;; for installed files to share disk space with
1833 ;; the build tree, without causing problems when
1834 ;; emacs-lisp files in the build tree are
1835 ;; recompiled). Previously this was accomplished by
1836 ;; deleting target-file before writing it.
7eb662be
GM
1837 (rename-file tempfile target-file t)
1838 (message "Wrote %s" target-file))
82345a9a
SM
1839 ;; This is just to give a better error message than write-region
1840 (signal 'file-error
1841 (list "Opening output file"
1842 (if (file-exists-p target-file)
1843 "cannot overwrite file"
1844 "directory not writable or nonexistent")
7c2fb837 1845 target-file)))
82345a9a
SM
1846 (kill-buffer (current-buffer)))
1847 (if (and byte-compile-generate-call-tree
1848 (or (eq t byte-compile-generate-call-tree)
1c3b663f
GM
1849 (y-or-n-p (format "Report call tree for %s? "
1850 bytecomp-filename))))
82345a9a 1851 (save-excursion
1c3b663f 1852 (display-call-tree bytecomp-filename)))
82345a9a
SM
1853 (if load
1854 (load target-file))
1855 t))))
1c393159 1856
1c393159 1857;;; compiling a single function
fd5285f3 1858;;;###autoload
52799cb8 1859(defun compile-defun (&optional arg)
1c393159 1860 "Compile and evaluate the current top-level form.
6b61353c 1861Print the result in the echo area.
2b9c3b12 1862With argument ARG, insert value in current buffer after the form."
1c393159
JB
1863 (interactive "P")
1864 (save-excursion
1865 (end-of-defun)
1866 (beginning-of-defun)
1867 (let* ((byte-compile-current-file nil)
ccb3c8de
CW
1868 (byte-compile-current-buffer (current-buffer))
1869 (byte-compile-read-position (point))
1870 (byte-compile-last-position byte-compile-read-position)
1c393159 1871 (byte-compile-last-warned-form 'nothing)
ccb3c8de 1872 (value (eval
9cb9a7bc 1873 (let ((read-with-symbol-positions (current-buffer))
ccb3c8de
CW
1874 (read-symbol-positions-list nil))
1875 (displaying-byte-compile-warnings
1876 (byte-compile-sexp (read (current-buffer))))))))
1c393159
JB
1877 (cond (arg
1878 (message "Compiling from buffer... done.")
1879 (prin1 value (current-buffer))
1880 (insert "\n"))
1881 ((message "%s" (prin1-to-string value)))))))
1882
1883
a2b3fdbf 1884(defun byte-compile-from-buffer (bytecomp-inbuffer &optional bytecomp-filename)
8a5dd086 1885 ;; Filename is used for the loading-into-Emacs-18 error message.
a2b3fdbf
GM
1886 (let (bytecomp-outbuffer
1887 (byte-compile-current-buffer bytecomp-inbuffer)
ccb3c8de
CW
1888 (byte-compile-read-position nil)
1889 (byte-compile-last-position nil)
d82e848c
RS
1890 ;; Prevent truncation of flonums and lists as we read and print them
1891 (float-output-format nil)
1892 (case-fold-search nil)
1893 (print-length nil)
95e7d933 1894 (print-level nil)
74dfd056
RS
1895 ;; Prevent edebug from interfering when we compile
1896 ;; and put the output into a file.
ccb3c8de
CW
1897;; (edebug-all-defs nil)
1898;; (edebug-all-forms nil)
d82e848c
RS
1899 ;; Simulate entry to byte-compile-top-level
1900 (byte-compile-constants nil)
1901 (byte-compile-variables nil)
1902 (byte-compile-tag-number 0)
1903 (byte-compile-depth 0)
1904 (byte-compile-maxdepth 0)
1905 (byte-compile-output nil)
ccb3c8de 1906 ;; This allows us to get the positions of symbols read; it's
bf247b6e 1907 ;; new in Emacs 22.1.
a2b3fdbf 1908 (read-with-symbol-positions bytecomp-inbuffer)
ccb3c8de 1909 (read-symbol-positions-list nil)
d82e848c 1910 ;; #### This is bound in b-c-close-variables.
cf637a34 1911 ;; (byte-compile-warnings byte-compile-warnings)
d82e848c
RS
1912 )
1913 (byte-compile-close-variables
b8104a2b 1914 (with-current-buffer
a2b3fdbf 1915 (setq bytecomp-outbuffer (get-buffer-create " *Compiler Output*"))
08b59cd3 1916 (set-buffer-multibyte t)
d82e848c
RS
1917 (erase-buffer)
1918 ;; (emacs-lisp-mode)
96bcef2e 1919 (setq case-fold-search nil))
d82e848c 1920 (displaying-byte-compile-warnings
a2b3fdbf 1921 (with-current-buffer bytecomp-inbuffer
775adc51
GM
1922 (and bytecomp-filename
1923 (byte-compile-insert-header bytecomp-filename bytecomp-outbuffer))
b8104a2b 1924 (goto-char (point-min))
2cb63a7c
AM
1925 ;; Should we always do this? When calling multiple files, it
1926 ;; would be useful to delay this warning until all have been
1927 ;; compiled. A: Yes! b-c-u-f might contain dross from a
1928 ;; previous byte-compile.
1929 (setq byte-compile-unresolved-functions nil)
d82e848c
RS
1930
1931 ;; Compile the forms from the input buffer.
1932 (while (progn
1933 (while (progn (skip-chars-forward " \t\n\^l")
1934 (looking-at ";"))
1935 (forward-line 1))
1936 (not (eobp)))
ccb3c8de
CW
1937 (setq byte-compile-read-position (point)
1938 byte-compile-last-position byte-compile-read-position)
36e65f70 1939 (let* ((old-style-backquotes nil)
a2b3fdbf 1940 (form (read bytecomp-inbuffer)))
36e65f70
SM
1941 ;; Warn about the use of old-style backquotes.
1942 (when old-style-backquotes
1943 (byte-compile-warn "!! The file uses old-style backquotes !!
1944This functionality has been obsolete for more than 10 years already
1945and will be removed soon. See (elisp)Backquote in the manual."))
876c194c 1946 (byte-compile-toplevel-file-form form)))
d82e848c
RS
1947 ;; Compile pending forms at end of file.
1948 (byte-compile-flush-pending)
977f31f8
RS
1949 ;; Make warnings about unresolved functions
1950 ;; give the end of the file as their position.
1951 (setq byte-compile-last-position (point-max))
2cb63a7c 1952 (byte-compile-warn-about-unresolved-functions))
fb639443
RS
1953 ;; Fix up the header at the front of the output
1954 ;; if the buffer contains multibyte characters.
a2b3fdbf 1955 (and bytecomp-filename
775adc51
GM
1956 (with-current-buffer bytecomp-outbuffer
1957 (byte-compile-fix-header bytecomp-filename)))))
a2b3fdbf 1958 bytecomp-outbuffer))
8a5dd086 1959
775adc51
GM
1960(defun byte-compile-fix-header (filename)
1961 "If the current buffer has any multibyte characters, insert a version test."
1962 (when (< (point-max) (position-bytes (point-max)))
1963 (goto-char (point-min))
1964 ;; Find the comment that describes the version condition.
1965 (search-forward "\n;;; This file uses")
1966 (narrow-to-region (line-beginning-position) (point-max))
1967 ;; Find the first line of ballast semicolons.
1968 (search-forward ";;;;;;;;;;")
1969 (beginning-of-line)
1970 (narrow-to-region (point-min) (point))
1971 (let ((old-header-end (point))
1972 (minimum-version "23")
1973 delta)
1974 (delete-region (point-min) (point-max))
1975 (insert
1976 ";;; This file contains utf-8 non-ASCII characters,\n"
1977 ";;; and so cannot be loaded into Emacs 22 or earlier.\n"
1978 ;; Have to check if emacs-version is bound so that this works
1979 ;; in files loaded early in loadup.el.
1980 "(and (boundp 'emacs-version)\n"
1981 ;; If there is a name at the end of emacs-version,
1982 ;; don't try to check the version number.
1983 " (< (aref emacs-version (1- (length emacs-version))) ?A)\n"
1984 (format " (string-lessp emacs-version \"%s\")\n" minimum-version)
1985 " (error \"`"
1986 ;; prin1-to-string is used to quote backslashes.
1987 (substring (prin1-to-string (file-name-nondirectory filename))
1988 1 -1)
1989 (format "' was compiled for Emacs %s or later\"))\n\n"
1990 minimum-version))
1991 ;; Now compensate for any change in size, to make sure all
1992 ;; positions in the file remain valid.
1993 (setq delta (- (point-max) old-header-end))
1994 (goto-char (point-max))
1995 (widen)
1996 (delete-char delta))))
1997
1998(defun byte-compile-insert-header (filename outbuffer)
1999 "Insert a header at the start of OUTBUFFER.
2000Call from the source buffer."
2001 (let ((dynamic-docstrings byte-compile-dynamic-docstrings)
2002 (dynamic byte-compile-dynamic)
2003 (optimize byte-optimize))
2004 (with-current-buffer outbuffer
a5832373
RS
2005 (goto-char (point-min))
2006 ;; The magic number of .elc files is ";ELC", or 0x3B454C43. After
430d2ee2 2007 ;; that is the file-format version number (18, 19, 20, or 23) as a
a5832373
RS
2008 ;; byte, followed by some nulls. The primary motivation for doing
2009 ;; this is to get some binary characters up in the first line of
2010 ;; the file so that `diff' will simply say "Binary files differ"
2011 ;; instead of actually doing a diff of two .elc files. An extra
2012 ;; benefit is that you can add this to /etc/magic:
a5832373
RS
2013 ;; 0 string ;ELC GNU Emacs Lisp compiled file,
2014 ;; >4 byte x version %d
775adc51
GM
2015 (insert
2016 ";ELC" 23 "\000\000\000\n"
2017 ";;; Compiled by "
2018 (or (and (boundp 'user-mail-address) user-mail-address)
2019 (concat (user-login-name) "@" (system-name)))
2020 " on " (current-time-string) "\n"
2021 ";;; from file " filename "\n"
5fa9d1ec
GM
2022 ";;; in Emacs version " emacs-version "\n"
2023 ";;; with"
775adc51
GM
2024 (cond
2025 ((eq optimize 'source) " source-level optimization only")
2026 ((eq optimize 'byte) " byte-level optimization only")
2027 (optimize " all optimizations")
2028 (t "out optimization"))
2029 ".\n"
2030 (if dynamic ";;; Function definitions are lazy-loaded.\n"
2031 "")
2032 "\n;;; This file uses "
2033 (if dynamic-docstrings
2034 "dynamic docstrings, first added in Emacs 19.29"
2035 "opcodes that do not exist in Emacs 18")
2036 ".\n\n"
2037 ;; Note that byte-compile-fix-header may change this.
2038 ";;; This file does not contain utf-8 non-ASCII characters,\n"
2039 ";;; and so can be loaded in Emacs versions earlier than 23.\n\n"
2040 ;; Insert semicolons as ballast, so that byte-compile-fix-header
2041 ;; can delete them so as to keep the buffer positions
2042 ;; constant for the actual compiled code.
2043 ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n"
2044 ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\n\n"))))
1c393159 2045
a2b3fdbf
GM
2046;; Dynamically bound in byte-compile-from-buffer.
2047;; NB also used in cl.el and cl-macs.el.
2048(defvar bytecomp-outbuffer)
2049
1c393159
JB
2050(defun byte-compile-output-file-form (form)
2051 ;; writes the given form to the output buffer, being careful of docstrings
1e857121 2052 ;; in defun, defmacro, defvar, defvaralias, defconst, autoload and
36b7e523 2053 ;; custom-declare-variable because make-docfile is so amazingly stupid.
c36881cf
ER
2054 ;; defalias calls are output directly by byte-compile-file-form-defmumble;
2055 ;; it does not pay to first build the defalias in defmumble and then parse
2056 ;; it here.
876c194c
SM
2057 (if (and (memq (car-safe form) '(defun defmacro defvar defvaralias defconst
2058 autoload custom-declare-variable))
1c393159 2059 (stringp (nth 3 form)))
d82e848c 2060 (byte-compile-output-docform nil nil '("\n(" 3 ")") form nil
36b7e523 2061 (memq (car form)
1e857121
YM
2062 '(defvaralias autoload
2063 custom-declare-variable)))
1c393159 2064 (let ((print-escape-newlines t)
37c29340
KH
2065 (print-length nil)
2066 (print-level nil)
77308fd7 2067 (print-quoted t)
5e51de79 2068 (print-gensym t)
0e66b003
KH
2069 (print-circle ; handle circular data structures
2070 (not byte-compile-disable-print-circle)))
a2b3fdbf
GM
2071 (princ "\n" bytecomp-outbuffer)
2072 (prin1 form bytecomp-outbuffer)
1c393159
JB
2073 nil)))
2074
6c2161c4
SM
2075(defvar print-gensym-alist) ;Used before print-circle existed.
2076
d82e848c 2077(defun byte-compile-output-docform (preface name info form specindex quoted)
dac6f673
RS
2078 "Print a form with a doc string. INFO is (prefix doc-index postfix).
2079If PREFACE and NAME are non-nil, print them too,
2080before INFO and the FORM but after the doc string itself.
2081If SPECINDEX is non-nil, it is the index in FORM
2082of the function bytecode string. In that case,
2b9c3b12
JB
2083we output that argument and the following argument
2084\(the constants vector) together, for lazy loading.
dac6f673
RS
2085QUOTED says that we have to put a quote before the
2086list that represents a doc string reference.
1e857121 2087`defvaralias', `autoload' and `custom-declare-variable' need that."
dac6f673
RS
2088 ;; We need to examine byte-compile-dynamic-docstrings
2089 ;; in the input buffer (now current), not in the output buffer.
2090 (let ((dynamic-docstrings byte-compile-dynamic-docstrings))
a2b3fdbf 2091 (with-current-buffer bytecomp-outbuffer
9ec5dfe6
SM
2092 (let (position)
2093
2094 ;; Insert the doc string, and make it a comment with #@LENGTH.
2095 (and (>= (nth 1 info) 0)
2096 dynamic-docstrings
9ec5dfe6
SM
2097 (progn
2098 ;; Make the doc string start at beginning of line
2099 ;; for make-docfile's sake.
2100 (insert "\n")
2101 (setq position
2102 (byte-compile-output-as-comment
2103 (nth (nth 1 info) form) nil))
2104 (setq position (- (position-bytes position) (point-min) -1))
2105 ;; If the doc string starts with * (a user variable),
2106 ;; negate POSITION.
2107 (if (and (stringp (nth (nth 1 info) form))
2108 (> (length (nth (nth 1 info) form)) 0)
2109 (eq (aref (nth (nth 1 info) form) 0) ?*))
2110 (setq position (- position)))))
2111
2112 (if preface
2113 (progn
2114 (insert preface)
a2b3fdbf 2115 (prin1 name bytecomp-outbuffer)))
9ec5dfe6
SM
2116 (insert (car info))
2117 (let ((print-escape-newlines t)
2118 (print-quoted t)
2119 ;; For compatibility with code before print-circle,
2120 ;; use a cons cell to say that we want
2121 ;; print-gensym-alist not to be cleared
2122 ;; between calls to print functions.
2123 (print-gensym '(t))
2124 (print-circle ; handle circular data structures
2125 (not byte-compile-disable-print-circle))
2126 print-gensym-alist ; was used before print-circle existed.
2127 (print-continuous-numbering t)
2128 print-number-table
2129 (index 0))
a2b3fdbf 2130 (prin1 (car form) bytecomp-outbuffer)
9ec5dfe6
SM
2131 (while (setq form (cdr form))
2132 (setq index (1+ index))
2133 (insert " ")
2134 (cond ((and (numberp specindex) (= index specindex)
2135 ;; Don't handle the definition dynamically
2136 ;; if it refers (or might refer)
2137 ;; to objects already output
2138 ;; (for instance, gensyms in the arg list).
2139 (let (non-nil)
17870c01
SM
2140 (when (hash-table-p print-number-table)
2141 (maphash (lambda (k v) (if v (setq non-nil t)))
2142 print-number-table))
9ec5dfe6
SM
2143 (not non-nil)))
2144 ;; Output the byte code and constants specially
2145 ;; for lazy dynamic loading.
2146 (let ((position
2147 (byte-compile-output-as-comment
2148 (cons (car form) (nth 1 form))
2149 t)))
2150 (setq position (- (position-bytes position) (point-min) -1))
a2b3fdbf 2151 (princ (format "(#$ . %d) nil" position) bytecomp-outbuffer)
9ec5dfe6
SM
2152 (setq form (cdr form))
2153 (setq index (1+ index))))
2154 ((= index (nth 1 info))
2155 (if position
2156 (princ (format (if quoted "'(#$ . %d)" "(#$ . %d)")
2157 position)
a2b3fdbf 2158 bytecomp-outbuffer)
9ec5dfe6
SM
2159 (let ((print-escape-newlines nil))
2160 (goto-char (prog1 (1+ (point))
a2b3fdbf 2161 (prin1 (car form) bytecomp-outbuffer)))
9ec5dfe6
SM
2162 (insert "\\\n")
2163 (goto-char (point-max)))))
2164 (t
a2b3fdbf 2165 (prin1 (car form) bytecomp-outbuffer)))))
9ec5dfe6 2166 (insert (nth 2 info)))))
1c393159
JB
2167 nil)
2168
c2768569 2169(defun byte-compile-keep-pending (form &optional bytecomp-handler)
1c393159
JB
2170 (if (memq byte-optimize '(t source))
2171 (setq form (byte-optimize-form form t)))
c2768569 2172 (if bytecomp-handler
1c393159
JB
2173 (let ((for-effect t))
2174 ;; To avoid consing up monstrously large forms at load time, we split
2175 ;; the output regularly.
b4ff4a23
RS
2176 (and (memq (car-safe form) '(fset defalias))
2177 (nthcdr 300 byte-compile-output)
1c393159 2178 (byte-compile-flush-pending))
c2768569 2179 (funcall bytecomp-handler form)
1c393159
JB
2180 (if for-effect
2181 (byte-compile-discard)))
2182 (byte-compile-form form t))
2183 nil)
2184
2185(defun byte-compile-flush-pending ()
2186 (if byte-compile-output
2187 (let ((form (byte-compile-out-toplevel t 'file)))
2188 (cond ((eq (car-safe form) 'progn)
ed62683d 2189 (mapc 'byte-compile-output-file-form (cdr form)))
1c393159
JB
2190 (form
2191 (byte-compile-output-file-form form)))
2192 (setq byte-compile-constants nil
2193 byte-compile-variables nil
2194 byte-compile-depth 0
2195 byte-compile-maxdepth 0
2196 byte-compile-output nil))))
2197
876c194c
SM
2198;; byte-hunk-handlers cannot call this!
2199(defun byte-compile-toplevel-file-form (form)
2200 (let ((byte-compile-current-form nil)) ; close over this for warnings.
b9598260 2201 (setq form (macroexpand-all form byte-compile-macro-environment))
94d11cb5 2202 (if lexical-binding
295fb2ac 2203 (setq form (cconv-closure-convert form)))
876c194c
SM
2204 (byte-compile-file-form form)))
2205
2206;; byte-hunk-handlers can call this.
2207(defun byte-compile-file-form (form)
2208 (let (bytecomp-handler)
a9de04fa
SM
2209 (cond ((and (consp form)
2210 (symbolp (car form))
b9598260
SM
2211 (setq bytecomp-handler (get (car form) 'byte-hunk-handler)))
2212 (cond ((setq form (funcall bytecomp-handler form))
2213 (byte-compile-flush-pending)
2214 (byte-compile-output-file-form form))))
2215 (t
2216 (byte-compile-keep-pending form)))))
1c393159
JB
2217
2218;; Functions and variables with doc strings must be output separately,
2219;; so make-docfile can recognise them. Most other things can be output
2220;; as byte-code.
2221
1c393159
JB
2222(put 'autoload 'byte-hunk-handler 'byte-compile-file-form-autoload)
2223(defun byte-compile-file-form-autoload (form)
2224 (and (let ((form form))
2225 (while (if (setq form (cdr form)) (byte-compile-constp (car form))))
2226 (null form)) ;Constants only
2227 (eval (nth 5 form)) ;Macro
2228 (eval form)) ;Define the autoload.
c5091f25 2229 ;; Avoid undefined function warnings for the autoload.
cb4fb1d0 2230 (when (and (consp (nth 1 form))
c5091f25
DL
2231 (eq (car (nth 1 form)) 'quote)
2232 (consp (cdr (nth 1 form)))
2233 (symbolp (nth 1 (nth 1 form))))
cb4fb1d0
GM
2234 (push (cons (nth 1 (nth 1 form))
2235 (cons 'autoload (cdr (cdr form))))
2236 byte-compile-function-environment)
2237 ;; If an autoload occurs _before_ the first call to a function,
2238 ;; byte-compile-callargs-warn does not add an entry to
2239 ;; byte-compile-unresolved-functions. Here we mimic the logic
2240 ;; of byte-compile-callargs-warn so as not to warn if the
2241 ;; autoload comes _after_ the function call.
2242 ;; Alternatively, similar logic could go in
2243 ;; byte-compile-warn-about-unresolved-functions.
2244 (or (memq (nth 1 (nth 1 form)) byte-compile-noruntime-functions)
2245 (setq byte-compile-unresolved-functions
2246 (delq (assq (nth 1 (nth 1 form))
2247 byte-compile-unresolved-functions)
2248 byte-compile-unresolved-functions))))
1c393159
JB
2249 (if (stringp (nth 3 form))
2250 form
2251 ;; No doc string, so we can compile this as a normal form.
2252 (byte-compile-keep-pending form 'byte-compile-normal-call)))
2253
2254(put 'defvar 'byte-hunk-handler 'byte-compile-file-form-defvar)
2255(put 'defconst 'byte-hunk-handler 'byte-compile-file-form-defvar)
2256(defun byte-compile-file-form-defvar (form)
2257 (if (null (nth 3 form))
2258 ;; Since there is no doc string, we can compile this as a normal form,
2259 ;; and not do a file-boundary.
2260 (byte-compile-keep-pending form)
4f1e9960 2261 (when (and (symbolp (nth 1 form))
3fe6ef4e 2262 (not (string-match "[-*/:$]" (symbol-name (nth 1 form))))
4f1e9960 2263 (byte-compile-warning-enabled-p 'lexical))
7a16788b 2264 (byte-compile-warn "global/dynamic var `%s' lacks a prefix"
4f1e9960 2265 (nth 1 form)))
2aea6521
GM
2266 (push (nth 1 form) byte-compile-bound-variables)
2267 (if (eq (car form) 'defconst)
2268 (push (nth 1 form) byte-compile-const-variables))
1c393159
JB
2269 (cond ((consp (nth 2 form))
2270 (setq form (copy-sequence form))
2271 (setcar (cdr (cdr form))
2272 (byte-compile-top-level (nth 2 form) nil 'file))))
2273 form))
2274
b7c76a30
SM
2275(put 'define-abbrev-table 'byte-hunk-handler 'byte-compile-file-form-define-abbrev-table)
2276(defun byte-compile-file-form-define-abbrev-table (form)
2aea6521
GM
2277 (if (eq 'quote (car-safe (car-safe (cdr form))))
2278 (push (car-safe (cdr (cadr form))) byte-compile-bound-variables))
b7c76a30
SM
2279 (byte-compile-keep-pending form))
2280
8c731d3d
RS
2281(put 'custom-declare-variable 'byte-hunk-handler
2282 'byte-compile-file-form-custom-declare-variable)
2283(defun byte-compile-file-form-custom-declare-variable (form)
cf637a34 2284 (when (byte-compile-warning-enabled-p 'callargs)
fe33e7c8 2285 (byte-compile-nogroup-warn form))
2aea6521 2286 (push (nth 1 (nth 1 form)) byte-compile-bound-variables)
2546bcdd
SM
2287 ;; Don't compile the expression because it may be displayed to the user.
2288 ;; (when (eq (car-safe (nth 2 form)) 'quote)
2289 ;; ;; (nth 2 form) is meant to evaluate to an expression, so if we have the
2290 ;; ;; final value already, we can byte-compile it.
2291 ;; (setcar (cdr (nth 2 form))
2292 ;; (byte-compile-top-level (cadr (nth 2 form)) nil 'file)))
347a36bc
RS
2293 (let ((tail (nthcdr 4 form)))
2294 (while tail
2546bcdd
SM
2295 (unless (keywordp (car tail)) ;No point optimizing keywords.
2296 ;; Compile the keyword arguments.
2297 (setcar tail (byte-compile-top-level (car tail) nil 'file)))
347a36bc 2298 (setq tail (cdr tail))))
8c731d3d
RS
2299 form)
2300
997011eb
RS
2301(put 'require 'byte-hunk-handler 'byte-compile-file-form-require)
2302(defun byte-compile-file-form-require (form)
3f12e5bd
GM
2303 (let ((args (mapcar 'eval (cdr form)))
2304 (hist-orig load-history)
2305 hist-new)
997011eb 2306 (apply 'require args)
3f12e5bd
GM
2307 (when (byte-compile-warning-enabled-p 'cl-functions)
2308 ;; Detect (require 'cl) in a way that works even if cl is already loaded.
2309 (if (member (car args) '("cl" cl))
2310 (progn
2311 (byte-compile-warn "cl package required at runtime")
2312 (byte-compile-disable-warning 'cl-functions))
2313 ;; We may have required something that causes cl to be loaded, eg
2314 ;; the uncompiled version of a file that requires cl when compiling.
2315 (setq hist-new load-history)
2316 (while (and (not byte-compile-cl-functions)
2317 hist-new (not (eq hist-new hist-orig)))
2318 (and (byte-compile-cl-file-p (car (pop hist-new)))
2319 (byte-compile-find-cl-functions))))))
1c393159
JB
2320 (byte-compile-keep-pending form 'byte-compile-normal-call))
2321
2322(put 'progn 'byte-hunk-handler 'byte-compile-file-form-progn)
2323(put 'prog1 'byte-hunk-handler 'byte-compile-file-form-progn)
2324(put 'prog2 'byte-hunk-handler 'byte-compile-file-form-progn)
2325(defun byte-compile-file-form-progn (form)
ed62683d 2326 (mapc 'byte-compile-file-form (cdr form))
1c393159
JB
2327 ;; Return nil so the forms are not output twice.
2328 nil)
2329
cb4fb1d0
GM
2330(put 'with-no-warnings 'byte-hunk-handler
2331 'byte-compile-file-form-with-no-warnings)
2332(defun byte-compile-file-form-with-no-warnings (form)
2333 ;; cf byte-compile-file-form-progn.
2334 (let (byte-compile-warnings)
2335 (mapc 'byte-compile-file-form (cdr form))
2336 nil))
2337
1c393159
JB
2338;; This handler is not necessary, but it makes the output from dont-compile
2339;; and similar macros cleaner.
2340(put 'eval 'byte-hunk-handler 'byte-compile-file-form-eval)
2341(defun byte-compile-file-form-eval (form)
2342 (if (eq (car-safe (nth 1 form)) 'quote)
2343 (nth 1 (nth 1 form))
2344 (byte-compile-keep-pending form)))
2345
2346(put 'defun 'byte-hunk-handler 'byte-compile-file-form-defun)
2347(defun byte-compile-file-form-defun (form)
2348 (byte-compile-file-form-defmumble form nil))
2349
2350(put 'defmacro 'byte-hunk-handler 'byte-compile-file-form-defmacro)
2351(defun byte-compile-file-form-defmacro (form)
2352 (byte-compile-file-form-defmumble form t))
2353
e3a6b82f
SM
2354(defun byte-compile-defmacro-declaration (form)
2355 "Generate code for declarations in macro definitions.
2356Remove declarations from the body of the macro definition
2357by side-effects."
2358 (let ((tail (nthcdr 2 form))
2359 (res '()))
2360 (when (stringp (car (cdr tail)))
2361 (setq tail (cdr tail)))
2362 (while (and (consp (car (cdr tail)))
2363 (eq (car (car (cdr tail))) 'declare))
2364 (let ((declaration (car (cdr tail))))
2365 (setcdr tail (cdr (cdr tail)))
2366 (push `(if macro-declaration-function
2367 (funcall macro-declaration-function
2368 ',(car (cdr form)) ',declaration))
2369 res)))
2370 res))
2371
1c393159 2372(defun byte-compile-file-form-defmumble (form macrop)
a2b3fdbf
GM
2373 (let* ((bytecomp-name (car (cdr form)))
2374 (bytecomp-this-kind (if macrop 'byte-compile-macro-environment
1c393159 2375 'byte-compile-function-environment))
a2b3fdbf 2376 (bytecomp-that-kind (if macrop 'byte-compile-function-environment
1c393159 2377 'byte-compile-macro-environment))
a2b3fdbf
GM
2378 (bytecomp-this-one (assq bytecomp-name
2379 (symbol-value bytecomp-this-kind)))
2380 (bytecomp-that-one (assq bytecomp-name
2381 (symbol-value bytecomp-that-kind)))
1c393159
JB
2382 (byte-compile-free-references nil)
2383 (byte-compile-free-assignments nil))
a2b3fdbf 2384 (byte-compile-set-symbol-position bytecomp-name)
1c393159
JB
2385 ;; When a function or macro is defined, add it to the call tree so that
2386 ;; we can tell when functions are not used.
2387 (if byte-compile-generate-call-tree
a2b3fdbf 2388 (or (assq bytecomp-name byte-compile-call-tree)
1c393159 2389 (setq byte-compile-call-tree
a2b3fdbf 2390 (cons (list bytecomp-name nil nil) byte-compile-call-tree))))
1c393159 2391
a2b3fdbf 2392 (setq byte-compile-current-form bytecomp-name) ; for warnings
cf637a34 2393 (if (byte-compile-warning-enabled-p 'redefine)
1c393159
JB
2394 (byte-compile-arglist-warn form macrop))
2395 (if byte-compile-verbose
a2b3fdbf
GM
2396 ;; bytecomp-filename is from byte-compile-from-buffer.
2397 (message "Compiling %s... (%s)" (or bytecomp-filename "") (nth 1 form)))
2398 (cond (bytecomp-that-one
cf637a34 2399 (if (and (byte-compile-warning-enabled-p 'redefine)
52799cb8 2400 ;; don't warn when compiling the stubs in byte-run...
1c393159
JB
2401 (not (assq (nth 1 form)
2402 byte-compile-initial-macro-environment)))
2403 (byte-compile-warn
1d5c17c0 2404 "`%s' defined multiple times, as both function and macro"
1c393159 2405 (nth 1 form)))
a2b3fdbf
GM
2406 (setcdr bytecomp-that-one nil))
2407 (bytecomp-this-one
cf637a34 2408 (when (and (byte-compile-warning-enabled-p 'redefine)
1c393159 2409 ;; hack: don't warn when compiling the magic internal
52799cb8 2410 ;; byte-compiler macros in byte-run.el...
1c393159
JB
2411 (not (assq (nth 1 form)
2412 byte-compile-initial-macro-environment)))
1d5c17c0 2413 (byte-compile-warn "%s `%s' defined multiple times in this file"
ccb3c8de
CW
2414 (if macrop "macro" "function")
2415 (nth 1 form))))
a2b3fdbf
GM
2416 ((and (fboundp bytecomp-name)
2417 (eq (car-safe (symbol-function bytecomp-name))
1c393159 2418 (if macrop 'lambda 'macro)))
cf637a34 2419 (when (byte-compile-warning-enabled-p 'redefine)
1d5c17c0 2420 (byte-compile-warn "%s `%s' being redefined as a %s"
ccb3c8de
CW
2421 (if macrop "function" "macro")
2422 (nth 1 form)
2423 (if macrop "macro" "function")))
1c393159 2424 ;; shadow existing definition
a2b3fdbf
GM
2425 (set bytecomp-this-kind
2426 (cons (cons bytecomp-name nil)
2427 (symbol-value bytecomp-this-kind))))
1c393159
JB
2428 )
2429 (let ((body (nthcdr 3 form)))
ccb3c8de
CW
2430 (when (and (stringp (car body))
2431 (symbolp (car-safe (cdr-safe body)))
2432 (car-safe (cdr-safe body))
2433 (stringp (car-safe (cdr-safe (cdr-safe body)))))
2434 (byte-compile-set-symbol-position (nth 1 form))
2435 (byte-compile-warn "probable `\"' without `\\' in doc string of %s"
2436 (nth 1 form))))
6b8c2efc 2437
985b4686
GM
2438 ;; Generate code for declarations in macro definitions.
2439 ;; Remove declarations from the body of the macro definition.
2440 (when macrop
e3a6b82f
SM
2441 (dolist (decl (byte-compile-defmacro-declaration form))
2442 (prin1 decl bytecomp-outbuffer)))
6b8c2efc 2443
4ec5239c 2444 (let* ((new-one (byte-compile-lambda (nthcdr 2 form) t))
1c393159 2445 (code (byte-compile-byte-code-maker new-one)))
a2b3fdbf
GM
2446 (if bytecomp-this-one
2447 (setcdr bytecomp-this-one new-one)
2448 (set bytecomp-this-kind
2449 (cons (cons bytecomp-name new-one)
2450 (symbol-value bytecomp-this-kind))))
1c393159
JB
2451 (if (and (stringp (nth 3 form))
2452 (eq 'quote (car-safe code))
2453 (eq 'lambda (car-safe (nth 1 code))))
2454 (cons (car form)
a2b3fdbf 2455 (cons bytecomp-name (cdr (nth 1 code))))
d82e848c 2456 (byte-compile-flush-pending)
1c393159 2457 (if (not (stringp (nth 3 form)))
d82e848c
RS
2458 ;; No doc string. Provide -1 as the "doc string index"
2459 ;; so that no element will be treated as a doc string.
2460 (byte-compile-output-docform
e5c89ce9 2461 "\n(defalias '"
a2b3fdbf 2462 bytecomp-name
d82e848c
RS
2463 (cond ((atom code)
2464 (if macrop '(" '(macro . #[" -1 "])") '(" #[" -1 "]")))
2465 ((eq (car code) 'quote)
2466 (setq code new-one)
2467 (if macrop '(" '(macro " -1 ")") '(" '(" -1 ")")))
2468 ((if macrop '(" (cons 'macro (" -1 "))") '(" (" -1 ")"))))
2469 (append code nil)
2470 (and (atom code) byte-compile-dynamic
2471 1)
2472 nil)
1c393159 2473 ;; Output the form by hand, that's much simpler than having
c36881cf 2474 ;; b-c-output-file-form analyze the defalias.
1c393159 2475 (byte-compile-output-docform
e5c89ce9 2476 "\n(defalias '"
a2b3fdbf 2477 bytecomp-name
1c393159
JB
2478 (cond ((atom code)
2479 (if macrop '(" '(macro . #[" 4 "])") '(" #[" 4 "]")))
2480 ((eq (car code) 'quote)
2481 (setq code new-one)
2482 (if macrop '(" '(macro " 2 ")") '(" '(" 2 ")")))
2483 ((if macrop '(" (cons 'macro (" 5 "))") '(" (" 5 ")"))))
d82e848c
RS
2484 (append code nil)
2485 (and (atom code) byte-compile-dynamic
2486 1)
2487 nil))
a2b3fdbf 2488 (princ ")" bytecomp-outbuffer)
d82e848c
RS
2489 nil))))
2490
2491;; Print Lisp object EXP in the output file, inside a comment,
2492;; and return the file position it will have.
2493;; If QUOTED is non-nil, print with quoting; otherwise, print without quoting.
2494(defun byte-compile-output-as-comment (exp quoted)
2d5975fa 2495 (let ((position (point)))
a2b3fdbf 2496 (with-current-buffer bytecomp-outbuffer
9ec5dfe6
SM
2497
2498 ;; Insert EXP, and make it a comment with #@LENGTH.
2499 (insert " ")
2500 (if quoted
a2b3fdbf
GM
2501 (prin1 exp bytecomp-outbuffer)
2502 (princ exp bytecomp-outbuffer))
9ec5dfe6
SM
2503 (goto-char position)
2504 ;; Quote certain special characters as needed.
2505 ;; get_doc_string in doc.c does the unquoting.
2506 (while (search-forward "\^A" nil t)
2507 (replace-match "\^A\^A" t t))
2508 (goto-char position)
2509 (while (search-forward "\000" nil t)
2510 (replace-match "\^A0" t t))
2511 (goto-char position)
2512 (while (search-forward "\037" nil t)
2513 (replace-match "\^A_" t t))
2514 (goto-char (point-max))
2515 (insert "\037")
2516 (goto-char position)
2517 (insert "#@" (format "%d" (- (position-bytes (point-max))
2518 (position-bytes position))))
2519
2520 ;; Save the file position of the object.
2521 ;; Note we should add 1 to skip the space
2522 ;; that we inserted before the actual doc string,
2523 ;; and subtract 1 to convert from an 1-origin Emacs position
2524 ;; to a file position; they cancel.
2525 (setq position (point))
2526 (goto-char (point-max)))
d82e848c
RS
2527 position))
2528
1c393159
JB
2529
2530\f
fd5285f3 2531;;;###autoload
1c393159
JB
2532(defun byte-compile (form)
2533 "If FORM is a symbol, byte-compile its function definition.
2534If FORM is a lambda or a macro, byte-compile it as a function."
2535 (displaying-byte-compile-warnings
2536 (byte-compile-close-variables
2537 (let* ((fun (if (symbolp form)
2538 (and (fboundp form) (symbol-function form))
2539 form))
2540 (macro (eq (car-safe fun) 'macro)))
2541 (if macro
2542 (setq fun (cdr fun)))
2543 (cond ((eq (car-safe fun) 'lambda)
3e21b6a7 2544 ;; Expand macros.
94d11cb5
IK
2545 (setq fun
2546 (macroexpand-all fun
2547 byte-compile-initial-macro-environment))
2548 (if lexical-binding
295fb2ac 2549 (setq fun (cconv-closure-convert fun)))
3e21b6a7 2550 ;; Get rid of the `function' quote added by the `lambda' macro.
876c194c 2551 (if (eq (car-safe fun) 'function) (setq fun (cadr fun)))
1c393159
JB
2552 (setq fun (if macro
2553 (cons 'macro (byte-compile-lambda fun))
2554 (byte-compile-lambda fun)))
2555 (if (symbolp form)
c36881cf 2556 (defalias form fun)
1c393159
JB
2557 fun)))))))
2558
2559(defun byte-compile-sexp (sexp)
2560 "Compile and return SEXP."
2561 (displaying-byte-compile-warnings
2562 (byte-compile-close-variables
2563 (byte-compile-top-level sexp))))
2564
2565;; Given a function made by byte-compile-lambda, make a form which produces it.
2566(defun byte-compile-byte-code-maker (fun)
2567 (cond
1c393159
JB
2568 ;; ## atom is faster than compiled-func-p.
2569 ((atom fun) ; compiled function.
2570 ;; generate-emacs19-bytecodes must be on, otherwise byte-compile-lambda
2571 ;; would have produced a lambda.
469414a0 2572 fun)
1c393159 2573 ;; b-c-lambda didn't produce a compiled-function, so it's either a trivial
52799cb8 2574 ;; function, or this is Emacs 18, or generate-emacs19-bytecodes is off.
1c393159 2575 ((let (tmp)
d032d5e7 2576 ;; FIXME: can this happen?
1c393159
JB
2577 (if (and (setq tmp (assq 'byte-code (cdr-safe (cdr fun))))
2578 (null (cdr (memq tmp fun))))
2579 ;; Generate a make-byte-code call.
2580 (let* ((interactive (assq 'interactive (cdr (cdr fun)))))
2581 (nconc (list 'make-byte-code
2582 (list 'quote (nth 1 fun)) ;arglist
2583 (nth 1 tmp) ;bytes
2584 (nth 2 tmp) ;consts
2585 (nth 3 tmp)) ;depth
2586 (cond ((stringp (nth 2 fun))
2587 (list (nth 2 fun))) ;doc
2588 (interactive
2589 (list nil)))
2590 (cond (interactive
2591 (list (if (or (null (nth 1 interactive))
2592 (stringp (nth 1 interactive)))
2593 (nth 1 interactive)
2594 ;; Interactive spec is a list or a variable
2595 ;; (if it is correct).
2596 (list 'quote (nth 1 interactive))))))))
2597 ;; a non-compiled function (probably trivial)
2598 (list 'quote fun))))))
2599
2600;; Turn a function into an ordinary lambda. Needed for v18 files.
d032d5e7 2601(defun byte-compile-byte-code-unmake (function) ;FIXME: what is it?
1c393159
JB
2602 (if (consp function)
2603 function;;It already is a lambda.
2604 (setq function (append function nil)) ; turn it into a list
2605 (nconc (list 'lambda (nth 0 function))
2606 (and (nth 4 function) (list (nth 4 function)))
2607 (if (nthcdr 5 function)
2608 (list (cons 'interactive (if (nth 5 function)
2609 (nthcdr 5 function)))))
2610 (list (list 'byte-code
2611 (nth 1 function) (nth 2 function)
2612 (nth 3 function))))))
2613
2614
eadd6444
GM
2615(defun byte-compile-check-lambda-list (list)
2616 "Check lambda-list LIST for errors."
2617 (let (vars)
2618 (while list
2619 (let ((arg (car list)))
ccb3c8de
CW
2620 (when (symbolp arg)
2621 (byte-compile-set-symbol-position arg))
1f006824 2622 (cond ((or (not (symbolp arg))
6c2161c4 2623 (byte-compile-const-symbol-p arg t))
eadd6444
GM
2624 (error "Invalid lambda variable %s" arg))
2625 ((eq arg '&rest)
2626 (unless (cdr list)
2627 (error "&rest without variable name"))
2628 (when (cddr list)
2629 (error "Garbage following &rest VAR in lambda-list")))
2630 ((eq arg '&optional)
2631 (unless (cdr list)
2632 (error "Variable name missing after &optional")))
2633 ((memq arg vars)
e34fd2f2 2634 (byte-compile-warn "repeated variable %s in lambda-list" arg))
1f006824 2635 (t
eadd6444
GM
2636 (push arg vars))))
2637 (setq list (cdr list)))))
2638
2639
ce5b520a
SM
2640(defun byte-compile-arglist-vars (arglist)
2641 "Return a list of the variables in the lambda argument list ARGLIST."
2642 (remq '&rest (remq '&optional arglist)))
2643
2644(defun byte-compile-make-lambda-lexenv (form)
2645 "Return a new lexical environment for a lambda expression FORM."
2646 ;; See if this is a closure or not
2647 (let ((args (byte-compile-arglist-vars (cadr form))))
2648 (let ((lexenv nil))
2649 ;; Fill in the initial stack contents
2650 (let ((stackpos 0))
2651 ;; Add entries for each argument
2652 (dolist (arg args)
2653 (push (cons arg stackpos) lexenv)
2654 (setq stackpos (1+ stackpos)))
2655 ;; Return the new lexical environment
2656 lexenv))))
b9598260 2657
e2abe5a1
SM
2658(defun byte-compile-make-args-desc (arglist)
2659 (let ((mandatory 0)
2660 nonrest (rest 0))
2661 (while (and arglist (not (memq (car arglist) '(&optional &rest))))
2662 (setq mandatory (1+ mandatory))
2663 (setq arglist (cdr arglist)))
2664 (setq nonrest mandatory)
2665 (when (eq (car arglist) '&optional)
2666 (setq arglist (cdr arglist))
2667 (while (and arglist (not (eq (car arglist) '&rest)))
2668 (setq nonrest (1+ nonrest))
2669 (setq arglist (cdr arglist))))
2670 (when arglist
2671 (setq rest 1))
2672 (if (> mandatory 127)
2673 (byte-compile-report-error "Too many (>127) mandatory arguments")
2674 (logior mandatory
2675 (lsh nonrest 8)
2676 (lsh rest 7)))))
2677
1c393159
JB
2678;; Byte-compile a lambda-expression and return a valid function.
2679;; The value is usually a compiled function but may be the original
2680;; lambda-expression.
4ec5239c
LH
2681;; When ADD-LAMBDA is non-nil, the symbol `lambda' is added as head
2682;; of the list FUN and `byte-compile-set-symbol-position' is not called.
2683;; Use this feature to avoid calling `byte-compile-set-symbol-position'
2684;; for symbols generated by the byte compiler itself.
876c194c 2685(defun byte-compile-lambda (bytecomp-fun &optional add-lambda reserved-csts)
4ec5239c 2686 (if add-lambda
c2768569
GM
2687 (setq bytecomp-fun (cons 'lambda bytecomp-fun))
2688 (unless (eq 'lambda (car-safe bytecomp-fun))
2689 (error "Not a lambda list: %S" bytecomp-fun))
4ec5239c 2690 (byte-compile-set-symbol-position 'lambda))
c2768569
GM
2691 (byte-compile-check-lambda-list (nth 1 bytecomp-fun))
2692 (let* ((bytecomp-arglist (nth 1 bytecomp-fun))
1c393159 2693 (byte-compile-bound-variables
ce5b520a
SM
2694 (append (and (not lexical-binding)
2695 (byte-compile-arglist-vars bytecomp-arglist))
2696 byte-compile-bound-variables))
c2768569
GM
2697 (bytecomp-body (cdr (cdr bytecomp-fun)))
2698 (bytecomp-doc (if (stringp (car bytecomp-body))
d779e73c
SM
2699 (prog1 (car bytecomp-body)
2700 ;; Discard the doc string
2701 ;; unless it is the last element of the body.
2702 (if (cdr bytecomp-body)
2703 (setq bytecomp-body (cdr bytecomp-body))))))
c2768569 2704 (bytecomp-int (assq 'interactive bytecomp-body)))
6c2161c4 2705 ;; Process the interactive spec.
c2768569 2706 (when bytecomp-int
6c2161c4
SM
2707 (byte-compile-set-symbol-position 'interactive)
2708 ;; Skip (interactive) if it is in front (the most usual location).
c2768569
GM
2709 (if (eq bytecomp-int (car bytecomp-body))
2710 (setq bytecomp-body (cdr bytecomp-body)))
2711 (cond ((consp (cdr bytecomp-int))
2712 (if (cdr (cdr bytecomp-int))
6c2161c4 2713 (byte-compile-warn "malformed interactive spec: %s"
c2768569 2714 (prin1-to-string bytecomp-int)))
6b61353c
KH
2715 ;; If the interactive spec is a call to `list', don't
2716 ;; compile it, because `call-interactively' looks at the
2717 ;; args of `list'. Actually, compile it to get warnings,
2718 ;; but don't use the result.
d032d5e7
SM
2719 (let* ((form (nth 1 bytecomp-int))
2720 (newform (byte-compile-top-level form)))
6c2161c4
SM
2721 (while (memq (car-safe form) '(let let* progn save-excursion))
2722 (while (consp (cdr form))
2723 (setq form (cdr form)))
2724 (setq form (car form)))
d032d5e7
SM
2725 (if (and (eq (car-safe form) 'list)
2726 ;; The spec is evaled in callint.c in dynamic-scoping
2727 ;; mode, so just leaving the form unchanged would mean
2728 ;; it won't be eval'd in the right mode.
2729 (not lexical-binding))
2730 nil
2731 (setq bytecomp-int `(interactive ,newform)))))
c2768569 2732 ((cdr bytecomp-int)
6c2161c4 2733 (byte-compile-warn "malformed interactive spec: %s"
c2768569 2734 (prin1-to-string bytecomp-int)))))
6c2161c4 2735 ;; Process the body.
876c194c
SM
2736 (let* ((compiled
2737 (byte-compile-top-level (cons 'progn bytecomp-body) nil 'lambda
2738 ;; If doing lexical binding, push a new
2739 ;; lexical environment containing just the
2740 ;; args (since lambda expressions should be
2741 ;; closed by now).
2742 (and lexical-binding
2743 (byte-compile-make-lambda-lexenv
2744 bytecomp-fun))
2745 reserved-csts)))
6c2161c4 2746 ;; Build the actual byte-coded function.
e5c89ce9 2747 (if (eq 'byte-code (car-safe compiled))
ce5b520a 2748 (apply 'make-byte-code
e2abe5a1
SM
2749 (if lexical-binding
2750 (byte-compile-make-args-desc bytecomp-arglist)
2751 bytecomp-arglist)
2752 (append
2753 ;; byte-string, constants-vector, stack depth
2754 (cdr compiled)
2755 ;; optionally, the doc string.
2756 (cond (lexical-binding
2757 (require 'help-fns)
2758 (list (help-add-fundoc-usage
2759 bytecomp-doc bytecomp-arglist)))
2760 ((or bytecomp-doc bytecomp-int)
2761 (list bytecomp-doc)))
2762 ;; optionally, the interactive spec.
2763 (if bytecomp-int
2764 (list (nth 1 bytecomp-int)))))
1c393159 2765 (setq compiled
c2768569 2766 (nconc (if bytecomp-int (list bytecomp-int))
1c393159
JB
2767 (cond ((eq (car-safe compiled) 'progn) (cdr compiled))
2768 (compiled (list compiled)))))
c2768569
GM
2769 (nconc (list 'lambda bytecomp-arglist)
2770 (if (or bytecomp-doc (stringp (car compiled)))
2771 (cons bytecomp-doc (cond (compiled)
2772 (bytecomp-body (list nil))))
1c393159
JB
2773 compiled))))))
2774
b9598260
SM
2775(defun byte-compile-closure (form &optional add-lambda)
2776 (let ((code (byte-compile-lambda form add-lambda)))
ce5b520a
SM
2777 ;; A simple lambda is just a constant.
2778 (byte-compile-constant code)))
b9598260 2779
876c194c
SM
2780(defvar byte-compile-reserved-constants 0)
2781
1c393159
JB
2782(defun byte-compile-constants-vector ()
2783 ;; Builds the constants-vector from the current variables and constants.
2784 ;; This modifies the constants from (const . nil) to (const . offset).
2785 ;; To keep the byte-codes to look up the vector as short as possible:
2786 ;; First 6 elements are vars, as there are one-byte varref codes for those.
2787 ;; Next up to byte-constant-limit are constants, still with one-byte codes.
2788 ;; Next variables again, to get 2-byte codes for variable lookup.
2789 ;; The rest of the constants and variables need 3-byte byte-codes.
876c194c 2790 (let* ((i (1- byte-compile-reserved-constants))
1c393159
JB
2791 (rest (nreverse byte-compile-variables)) ; nreverse because the first
2792 (other (nreverse byte-compile-constants)) ; vars often are used most.
2793 ret tmp
2794 (limits '(5 ; Use the 1-byte varref codes,
2795 63 ; 1-constlim ; 1-byte byte-constant codes,
2796 255 ; 2-byte varref codes,
2797 65535)) ; 3-byte codes for the rest.
2798 limit)
2799 (while (or rest other)
2800 (setq limit (car limits))
876c194c
SM
2801 (while (and rest (< i limit))
2802 (cond
2803 ((numberp (car rest))
2804 (assert (< (car rest) byte-compile-reserved-constants)))
2805 ((setq tmp (assq (car (car rest)) ret))
2806 (setcdr (car rest) (cdr tmp)))
2807 (t
1c393159 2808 (setcdr (car rest) (setq i (1+ i)))
876c194c 2809 (setq ret (cons (car rest) ret))))
1c393159
JB
2810 (setq rest (cdr rest)))
2811 (setq limits (cdr limits)
2812 rest (prog1 other
2813 (setq other rest))))
2814 (apply 'vector (nreverse (mapcar 'car ret)))))
2815
2816;; Given an expression FORM, compile it and return an equivalent byte-code
2817;; expression (a call to the function byte-code).
876c194c
SM
2818(defun byte-compile-top-level (form &optional for-effect output-type
2819 lexenv reserved-csts)
1c393159
JB
2820 ;; OUTPUT-TYPE advises about how form is expected to be used:
2821 ;; 'eval or nil -> a single form,
2822 ;; 'progn or t -> a list of forms,
2823 ;; 'lambda -> body of a lambda,
2824 ;; 'file -> used at file-level.
285cdf4e
RS
2825 (let ((byte-compile-constants nil)
2826 (byte-compile-variables nil)
2827 (byte-compile-tag-number 0)
2828 (byte-compile-depth 0)
2829 (byte-compile-maxdepth 0)
876c194c
SM
2830 (byte-compile-lexical-environment lexenv)
2831 (byte-compile-reserved-constants (or reserved-csts 0))
285cdf4e 2832 (byte-compile-output nil))
b9598260
SM
2833 (if (memq byte-optimize '(t source))
2834 (setq form (byte-optimize-form form for-effect)))
2835 (while (and (eq (car-safe form) 'progn) (null (cdr (cdr form))))
2836 (setq form (nth 1 form)))
2837 (if (and (eq 'byte-code (car-safe form))
2838 (not (memq byte-optimize '(t byte)))
2839 (stringp (nth 1 form)) (vectorp (nth 2 form))
2840 (natnump (nth 3 form)))
2841 form
b38b1ec0 2842 ;; Set up things for a lexically-bound function.
b9598260
SM
2843 (when (and lexical-binding (eq output-type 'lambda))
2844 ;; See how many arguments there are, and set the current stack depth
b38b1ec0
SM
2845 ;; accordingly.
2846 (setq byte-compile-depth (length byte-compile-lexical-environment))
b9598260 2847 ;; If there are args, output a tag to record the initial
b38b1ec0 2848 ;; stack-depth for the optimizer.
b9598260 2849 (when (> byte-compile-depth 0)
ce5b520a 2850 (byte-compile-out-tag (byte-compile-make-tag))))
b9598260
SM
2851 ;; Now compile FORM
2852 (byte-compile-form form for-effect)
2853 (byte-compile-out-toplevel for-effect output-type))))
1c393159
JB
2854
2855(defun byte-compile-out-toplevel (&optional for-effect output-type)
2856 (if for-effect
2857 ;; The stack is empty. Push a value to be returned from (byte-code ..).
2858 (if (eq (car (car byte-compile-output)) 'byte-discard)
2859 (setq byte-compile-output (cdr byte-compile-output))
2860 (byte-compile-push-constant
2861 ;; Push any constant - preferably one which already is used, and
2862 ;; a number or symbol - ie not some big sequence. The return value
2863 ;; isn't returned, but it would be a shame if some textually large
2864 ;; constant was not optimized away because we chose to return it.
2865 (and (not (assq nil byte-compile-constants)) ; Nil is often there.
2866 (let ((tmp (reverse byte-compile-constants)))
ba76e7fa
SM
2867 (while (and tmp (not (or (symbolp (caar tmp))
2868 (numberp (caar tmp)))))
1c393159 2869 (setq tmp (cdr tmp)))
ba76e7fa 2870 (caar tmp))))))
1c393159
JB
2871 (byte-compile-out 'byte-return 0)
2872 (setq byte-compile-output (nreverse byte-compile-output))
2873 (if (memq byte-optimize '(t byte))
2874 (setq byte-compile-output
2875 (byte-optimize-lapcode byte-compile-output for-effect)))
1f006824 2876
1c393159
JB
2877 ;; Decompile trivial functions:
2878 ;; only constants and variables, or a single funcall except in lambdas.
2879 ;; Except for Lisp_Compiled objects, forms like (foo "hi")
2880 ;; are still quicker than (byte-code "..." [foo "hi"] 2).
2881 ;; Note that even (quote foo) must be parsed just as any subr by the
2882 ;; interpreter, so quote should be compiled into byte-code in some contexts.
2883 ;; What to leave uncompiled:
69dc83fd
KH
2884 ;; lambda -> never. we used to leave it uncompiled if the body was
2885 ;; a single atom, but that causes confusion if the docstring
2886 ;; uses the (file . pos) syntax. Besides, now that we have
2887 ;; the Lisp_Compiled type, the compiled form is faster.
1c393159
JB
2888 ;; eval -> atom, quote or (function atom atom atom)
2889 ;; progn -> as <<same-as-eval>> or (progn <<same-as-eval>> atom)
2890 ;; file -> as progn, but takes both quotes and atoms, and longer forms.
2891 (let (rest
2892 (maycall (not (eq output-type 'lambda))) ; t if we may make a funcall.
2893 tmp body)
2894 (cond
2895 ;; #### This should be split out into byte-compile-nontrivial-function-p.
69dc83fd
KH
2896 ((or (eq output-type 'lambda)
2897 (nthcdr (if (eq output-type 'file) 50 8) byte-compile-output)
1c393159
JB
2898 (assq 'TAG byte-compile-output) ; Not necessary, but speeds up a bit.
2899 (not (setq tmp (assq 'byte-return byte-compile-output)))
2900 (progn
2901 (setq rest (nreverse
2902 (cdr (memq tmp (reverse byte-compile-output)))))
2903 (while (cond
2904 ((memq (car (car rest)) '(byte-varref byte-constant))
2905 (setq tmp (car (cdr (car rest))))
469414a0
RS
2906 (if (if (eq (car (car rest)) 'byte-constant)
2907 (or (consp tmp)
2908 (and (symbolp tmp)
1639b803 2909 (not (byte-compile-const-symbol-p tmp)))))
469414a0
RS
2910 (if maycall
2911 (setq body (cons (list 'quote tmp) body)))
2912 (setq body (cons tmp body))))
1c393159
JB
2913 ((and maycall
2914 ;; Allow a funcall if at most one atom follows it.
2915 (null (nthcdr 3 rest))
2916 (setq tmp (get (car (car rest)) 'byte-opcode-invert))
2917 (or (null (cdr rest))
2918 (and (memq output-type '(file progn t))
2919 (cdr (cdr rest))
2920 (eq (car (nth 1 rest)) 'byte-discard)
2921 (progn (setq rest (cdr rest)) t))))
2922 (setq maycall nil) ; Only allow one real function call.
2923 (setq body (nreverse body))
2924 (setq body (list
2925 (if (and (eq tmp 'funcall)
2926 (eq (car-safe (car body)) 'quote))
2927 (cons (nth 1 (car body)) (cdr body))
2928 (cons tmp body))))
2929 (or (eq output-type 'file)
2930 (not (delq nil (mapcar 'consp (cdr (car body))))))))
2931 (setq rest (cdr rest)))
69dc83fd 2932 rest))
1c393159
JB
2933 (let ((byte-compile-vector (byte-compile-constants-vector)))
2934 (list 'byte-code (byte-compile-lapcode byte-compile-output)
2935 byte-compile-vector byte-compile-maxdepth)))
2936 ;; it's a trivial function
2937 ((cdr body) (cons 'progn (nreverse body)))
2938 ((car body)))))
2939
c2768569
GM
2940;; Given BYTECOMP-BODY, compile it and return a new body.
2941(defun byte-compile-top-level-body (bytecomp-body &optional for-effect)
2942 (setq bytecomp-body
2943 (byte-compile-top-level (cons 'progn bytecomp-body) for-effect t))
2944 (cond ((eq (car-safe bytecomp-body) 'progn)
2945 (cdr bytecomp-body))
2946 (bytecomp-body
2947 (list bytecomp-body))))
d97362d7 2948
a9de04fa
SM
2949;; Special macro-expander used during byte-compilation.
2950(defun byte-compile-macroexpand-declare-function (fn file &rest args)
2951 (push (cons fn
2952 (if (and (consp args) (listp (car args)))
2953 (list 'declared (car args))
7628b337 2954 t)) ; arglist not specified
d97362d7 2955 byte-compile-function-environment)
a342aca4
GM
2956 ;; We are stating that it _will_ be defined at runtime.
2957 (setq byte-compile-noruntime-functions
a9de04fa
SM
2958 (delq fn byte-compile-noruntime-functions))
2959 ;; Delegate the rest to the normal macro definition.
2960 (macroexpand `(declare-function ,fn ,file ,@args)))
d97362d7 2961
1c393159 2962\f
c5091f25 2963;; This is the recursive entry point for compiling each subform of an
1c393159
JB
2964;; expression.
2965;; If for-effect is non-nil, byte-compile-form will output a byte-discard
2966;; before terminating (ie no value will be left on the stack).
2967;; A byte-compile handler may, when for-effect is non-nil, choose output code
2968;; which does not leave a value on the stack, and then set for-effect to nil
2969;; (to prevent byte-compile-form from outputting the byte-discard).
2970;; If a handler wants to call another handler, it should do so via
2971;; byte-compile-form, or take extreme care to handle for-effect correctly.
2972;; (Use byte-compile-form-do-effect to reset the for-effect flag too.)
2973;;
2974(defun byte-compile-form (form &optional for-effect)
1c393159 2975 (cond ((not (consp form))
1639b803 2976 (cond ((or (not (symbolp form)) (byte-compile-const-symbol-p form))
0b46acbf
RS
2977 (when (symbolp form)
2978 (byte-compile-set-symbol-position form))
1c393159
JB
2979 (byte-compile-constant form))
2980 ((and for-effect byte-compile-delete-errors)
0b46acbf
RS
2981 (when (symbolp form)
2982 (byte-compile-set-symbol-position form))
1c393159 2983 (setq for-effect nil))
b9598260
SM
2984 (t
2985 (byte-compile-variable-ref form))))
1c393159 2986 ((symbolp (car form))
c2768569
GM
2987 (let* ((bytecomp-fn (car form))
2988 (bytecomp-handler (get bytecomp-fn 'byte-compile)))
2989 (when (byte-compile-const-symbol-p bytecomp-fn)
2990 (byte-compile-warn "`%s' called as a function" bytecomp-fn))
cf637a34 2991 (and (byte-compile-warning-enabled-p 'interactive-only)
c2768569 2992 (memq bytecomp-fn byte-compile-interactive-only-functions)
086af77c 2993 (byte-compile-warn "`%s' used from Lisp code\n\
c2768569 2994That command is designed for interactive use only" bytecomp-fn))
e0f57e65 2995 (if (and (fboundp (car form))
3e21b6a7 2996 (eq (car-safe (symbol-function (car form))) 'macro))
e0f57e65
SM
2997 (byte-compile-report-error
2998 (format "Forgot to expand macro %s" (car form))))
c2768569 2999 (if (and bytecomp-handler
67438f77
SM
3000 ;; Make sure that function exists. This is important
3001 ;; for CL compiler macros since the symbol may be
3002 ;; `cl-byte-compile-compiler-macro' but if CL isn't
3003 ;; loaded, this function doesn't exist.
b38b1ec0
SM
3004 (and (not (eq bytecomp-handler
3005 ;; Already handled by macroexpand-all.
3006 'cl-byte-compile-compiler-macro))
3007 (functionp bytecomp-handler)))
c2768569 3008 (funcall bytecomp-handler form)
4795d1c7 3009 (byte-compile-normal-call form))
cf637a34 3010 (if (byte-compile-warning-enabled-p 'cl-functions)
4795d1c7 3011 (byte-compile-cl-warn form))))
ed015bdd 3012 ((and (or (byte-code-function-p (car form))
1c393159
JB
3013 (eq (car-safe (car form)) 'lambda))
3014 ;; if the form comes out the same way it went in, that's
3015 ;; because it was malformed, and we couldn't unfold it.
3016 (not (eq form (setq form (byte-compile-unfold-lambda form)))))
3017 (byte-compile-form form for-effect)
3018 (setq for-effect nil))
3019 ((byte-compile-normal-call form)))
3020 (if for-effect
3021 (byte-compile-discard)))
3022
3023(defun byte-compile-normal-call (form)
876c194c
SM
3024 (when (and (byte-compile-warning-enabled-p 'callargs)
3025 (symbolp (car form)))
3026 (if (memq (car form)
3027 '(custom-declare-group custom-declare-variable
3028 custom-declare-face))
3029 (byte-compile-nogroup-warn form))
a9de04fa
SM
3030 (when (get (car form) 'byte-obsolete-info)
3031 (byte-compile-warn-obsolete (car form)))
876c194c 3032 (byte-compile-callargs-warn form))
1c393159
JB
3033 (if byte-compile-generate-call-tree
3034 (byte-compile-annotate-call-tree form))
86da2828 3035 (when (and for-effect (eq (car form) 'mapcar)
cf637a34 3036 (byte-compile-warning-enabled-p 'mapcar))
89c91fdb
GM
3037 (byte-compile-set-symbol-position 'mapcar)
3038 (byte-compile-warn
3039 "`mapcar' called for effect; use `mapc' or `dolist' instead"))
1c393159 3040 (byte-compile-push-constant (car form))
ed62683d 3041 (mapc 'byte-compile-form (cdr form)) ; wasteful, but faster.
1c393159
JB
3042 (byte-compile-out 'byte-call (length (cdr form))))
3043
b9598260
SM
3044(defun byte-compile-check-variable (var &optional binding)
3045 "Do various error checks before a use of the variable VAR.
3046If BINDING is non-nil, VAR is being bound."
3047 (when (symbolp var)
3048 (byte-compile-set-symbol-position var))
3049 (cond ((or (not (symbolp var)) (byte-compile-const-symbol-p var))
3050 (when (byte-compile-warning-enabled-p 'constants)
3051 (byte-compile-warn (if binding
3052 "attempt to let-bind %s `%s`"
3053 "variable reference to %s `%s'")
3054 (if (symbolp var) "constant" "nonvariable")
3055 (prin1-to-string var))))
3056 ((and (get var 'byte-obsolete-variable)
f43cb649 3057 (not (memq var byte-compile-not-obsolete-vars)))
b9598260
SM
3058 (byte-compile-warn-obsolete var))))
3059
3060(defsubst byte-compile-dynamic-variable-op (base-op var)
3061 (let ((tmp (assq var byte-compile-variables)))
6c2161c4 3062 (unless tmp
b9598260 3063 (setq tmp (list var))
6c2161c4 3064 (push tmp byte-compile-variables))
1c393159
JB
3065 (byte-compile-out base-op tmp)))
3066
b9598260
SM
3067(defun byte-compile-dynamic-variable-bind (var)
3068 "Generate code to bind the lexical variable VAR to the top-of-stack value."
3069 (byte-compile-check-variable var t)
ce5b520a 3070 (push var byte-compile-bound-variables)
b9598260
SM
3071 (byte-compile-dynamic-variable-op 'byte-varbind var))
3072
b9598260
SM
3073(defun byte-compile-variable-ref (var)
3074 "Generate code to push the value of the variable VAR on the stack."
3075 (byte-compile-check-variable var)
3076 (let ((lex-binding (assq var byte-compile-lexical-environment)))
3077 (if lex-binding
3078 ;; VAR is lexically bound
ce5b520a 3079 (byte-compile-stack-ref (cdr lex-binding))
b9598260
SM
3080 ;; VAR is dynamically bound
3081 (unless (or (not (byte-compile-warning-enabled-p 'free-vars))
3082 (boundp var)
3083 (memq var byte-compile-bound-variables)
3084 (memq var byte-compile-free-references))
876c194c 3085 (byte-compile-warn "reference to free variable `%S'" var)
b9598260
SM
3086 (push var byte-compile-free-references))
3087 (byte-compile-dynamic-variable-op 'byte-varref var))))
3088
3089(defun byte-compile-variable-set (var)
3090 "Generate code to set the variable VAR from the top-of-stack value."
3091 (byte-compile-check-variable var)
3092 (let ((lex-binding (assq var byte-compile-lexical-environment)))
3093 (if lex-binding
3094 ;; VAR is lexically bound
ce5b520a 3095 (byte-compile-stack-set (cdr lex-binding))
b9598260
SM
3096 ;; VAR is dynamically bound
3097 (unless (or (not (byte-compile-warning-enabled-p 'free-vars))
3098 (boundp var)
3099 (memq var byte-compile-bound-variables)
3100 (memq var byte-compile-free-assignments))
3101 (byte-compile-warn "assignment to free variable `%s'" var)
3102 (push var byte-compile-free-assignments))
3103 (byte-compile-dynamic-variable-op 'byte-varset var))))
3104
1c393159 3105(defmacro byte-compile-get-constant (const)
1639b803 3106 `(or (if (stringp ,const)
7fb4fa10
RS
3107 ;; In a string constant, treat properties as significant.
3108 (let (result)
3109 (dolist (elt byte-compile-constants)
3110 (if (equal-including-properties (car elt) ,const)
3111 (setq result elt)))
3112 result)
1639b803
DL
3113 (assq ,const byte-compile-constants))
3114 (car (setq byte-compile-constants
3115 (cons (list ,const) byte-compile-constants)))))
1c393159
JB
3116
3117;; Use this when the value of a form is a constant. This obeys for-effect.
3118(defun byte-compile-constant (const)
3119 (if for-effect
3120 (setq for-effect nil)
ccb3c8de
CW
3121 (when (symbolp const)
3122 (byte-compile-set-symbol-position const))
1c393159
JB
3123 (byte-compile-out 'byte-constant (byte-compile-get-constant const))))
3124
3125;; Use this for a constant that is not the value of its containing form.
3126;; This ignores for-effect.
3127(defun byte-compile-push-constant (const)
3128 (let ((for-effect nil))
3129 (inline (byte-compile-constant const))))
1c393159
JB
3130\f
3131;; Compile those primitive ordinary functions
3132;; which have special byte codes just for speed.
3133
3134(defmacro byte-defop-compiler (function &optional compile-handler)
9d28c33e
SM
3135 "Add a compiler-form for FUNCTION.
3136If function is a symbol, then the variable \"byte-SYMBOL\" must name
3137the opcode to be used. If function is a list, the first element
3138is the function and the second element is the bytecode-symbol.
3139The second element may be nil, meaning there is no opcode.
3140COMPILE-HANDLER is the function to use to compile this byte-op, or
3141may be the abbreviations 0, 1, 2, 3, 0-1, or 1-2.
3142If it is nil, then the handler is \"byte-compile-SYMBOL.\""
1c393159
JB
3143 (let (opcode)
3144 (if (symbolp function)
3145 (setq opcode (intern (concat "byte-" (symbol-name function))))
3146 (setq opcode (car (cdr function))
3147 function (car function)))
3148 (let ((fnform
3149 (list 'put (list 'quote function) ''byte-compile
3150 (list 'quote
3151 (or (cdr (assq compile-handler
3152 '((0 . byte-compile-no-args)
3153 (1 . byte-compile-one-arg)
3154 (2 . byte-compile-two-args)
3155 (3 . byte-compile-three-args)
3156 (0-1 . byte-compile-zero-or-one-arg)
3157 (1-2 . byte-compile-one-or-two-args)
3158 (2-3 . byte-compile-two-or-three-args)
3159 )))
3160 compile-handler
3161 (intern (concat "byte-compile-"
3162 (symbol-name function))))))))
3163 (if opcode
3164 (list 'progn fnform
3165 (list 'put (list 'quote function)
3166 ''byte-opcode (list 'quote opcode))
3167 (list 'put (list 'quote opcode)
3168 ''byte-opcode-invert (list 'quote function)))
3169 fnform))))
3170
1c393159
JB
3171(defmacro byte-defop-compiler-1 (function &optional compile-handler)
3172 (list 'byte-defop-compiler (list function nil) compile-handler))
3173
3174\f
3175(put 'byte-call 'byte-opcode-invert 'funcall)
3176(put 'byte-list1 'byte-opcode-invert 'list)
3177(put 'byte-list2 'byte-opcode-invert 'list)
3178(put 'byte-list3 'byte-opcode-invert 'list)
3179(put 'byte-list4 'byte-opcode-invert 'list)
3180(put 'byte-listN 'byte-opcode-invert 'list)
3181(put 'byte-concat2 'byte-opcode-invert 'concat)
3182(put 'byte-concat3 'byte-opcode-invert 'concat)
3183(put 'byte-concat4 'byte-opcode-invert 'concat)
3184(put 'byte-concatN 'byte-opcode-invert 'concat)
3185(put 'byte-insertN 'byte-opcode-invert 'insert)
3186
1c393159
JB
3187(byte-defop-compiler point 0)
3188;;(byte-defop-compiler mark 0) ;; obsolete
3189(byte-defop-compiler point-max 0)
3190(byte-defop-compiler point-min 0)
3191(byte-defop-compiler following-char 0)
3192(byte-defop-compiler preceding-char 0)
3193(byte-defop-compiler current-column 0)
3194(byte-defop-compiler eolp 0)
3195(byte-defop-compiler eobp 0)
3196(byte-defop-compiler bolp 0)
3197(byte-defop-compiler bobp 0)
3198(byte-defop-compiler current-buffer 0)
3199;;(byte-defop-compiler read-char 0) ;; obsolete
eef899a9
GM
3200(byte-defop-compiler widen 0)
3201(byte-defop-compiler end-of-line 0-1)
3202(byte-defop-compiler forward-char 0-1)
3203(byte-defop-compiler forward-line 0-1)
1c393159
JB
3204(byte-defop-compiler symbolp 1)
3205(byte-defop-compiler consp 1)
3206(byte-defop-compiler stringp 1)
3207(byte-defop-compiler listp 1)
3208(byte-defop-compiler not 1)
3209(byte-defop-compiler (null byte-not) 1)
3210(byte-defop-compiler car 1)
3211(byte-defop-compiler cdr 1)
3212(byte-defop-compiler length 1)
3213(byte-defop-compiler symbol-value 1)
3214(byte-defop-compiler symbol-function 1)
3215(byte-defop-compiler (1+ byte-add1) 1)
3216(byte-defop-compiler (1- byte-sub1) 1)
3217(byte-defop-compiler goto-char 1)
b8ae93ad 3218(byte-defop-compiler char-after 0-1)
1c393159
JB
3219(byte-defop-compiler set-buffer 1)
3220;;(byte-defop-compiler set-mark 1) ;; obsolete
eef899a9
GM
3221(byte-defop-compiler forward-word 0-1)
3222(byte-defop-compiler char-syntax 1)
3223(byte-defop-compiler nreverse 1)
3224(byte-defop-compiler car-safe 1)
3225(byte-defop-compiler cdr-safe 1)
3226(byte-defop-compiler numberp 1)
3227(byte-defop-compiler integerp 1)
3228(byte-defop-compiler skip-chars-forward 1-2)
3229(byte-defop-compiler skip-chars-backward 1-2)
1c393159
JB
3230(byte-defop-compiler eq 2)
3231(byte-defop-compiler memq 2)
3232(byte-defop-compiler cons 2)
3233(byte-defop-compiler aref 2)
3234(byte-defop-compiler set 2)
3235(byte-defop-compiler (= byte-eqlsign) 2)
3236(byte-defop-compiler (< byte-lss) 2)
3237(byte-defop-compiler (> byte-gtr) 2)
3238(byte-defop-compiler (<= byte-leq) 2)
3239(byte-defop-compiler (>= byte-geq) 2)
3240(byte-defop-compiler get 2)
3241(byte-defop-compiler nth 2)
3242(byte-defop-compiler substring 2-3)
eef899a9
GM
3243(byte-defop-compiler (move-marker byte-set-marker) 2-3)
3244(byte-defop-compiler set-marker 2-3)
3245(byte-defop-compiler match-beginning 1)
3246(byte-defop-compiler match-end 1)
3247(byte-defop-compiler upcase 1)
3248(byte-defop-compiler downcase 1)
3249(byte-defop-compiler string= 2)
3250(byte-defop-compiler string< 2)
3251(byte-defop-compiler (string-equal byte-string=) 2)
3252(byte-defop-compiler (string-lessp byte-string<) 2)
3253(byte-defop-compiler equal 2)
3254(byte-defop-compiler nthcdr 2)
3255(byte-defop-compiler elt 2)
3256(byte-defop-compiler member 2)
3257(byte-defop-compiler assq 2)
3258(byte-defop-compiler (rplaca byte-setcar) 2)
3259(byte-defop-compiler (rplacd byte-setcdr) 2)
3260(byte-defop-compiler setcar 2)
3261(byte-defop-compiler setcdr 2)
3262(byte-defop-compiler buffer-substring 2)
3263(byte-defop-compiler delete-region 2)
3264(byte-defop-compiler narrow-to-region 2)
3265(byte-defop-compiler (% byte-rem) 2)
1c393159
JB
3266(byte-defop-compiler aset 3)
3267
3268(byte-defop-compiler max byte-compile-associative)
3269(byte-defop-compiler min byte-compile-associative)
3270(byte-defop-compiler (+ byte-plus) byte-compile-associative)
eef899a9 3271(byte-defop-compiler (* byte-mult) byte-compile-associative)
1c393159 3272
eef899a9 3273;;####(byte-defop-compiler move-to-column 1)
1c393159
JB
3274(byte-defop-compiler-1 interactive byte-compile-noop)
3275
3276\f
3277(defun byte-compile-subr-wrong-args (form n)
ccb3c8de 3278 (byte-compile-set-symbol-position (car form))
1d5c17c0 3279 (byte-compile-warn "`%s' called with %d arg%s, but requires %s"
1c393159
JB
3280 (car form) (length (cdr form))
3281 (if (= 1 (length (cdr form))) "" "s") n)
3282 ;; get run-time wrong-number-of-args error.
3283 (byte-compile-normal-call form))
3284
3285(defun byte-compile-no-args (form)
3286 (if (not (= (length form) 1))
3287 (byte-compile-subr-wrong-args form "none")
3288 (byte-compile-out (get (car form) 'byte-opcode) 0)))
3289
3290(defun byte-compile-one-arg (form)
3291 (if (not (= (length form) 2))
3292 (byte-compile-subr-wrong-args form 1)
3293 (byte-compile-form (car (cdr form))) ;; Push the argument
3294 (byte-compile-out (get (car form) 'byte-opcode) 0)))
3295
3296(defun byte-compile-two-args (form)
3297 (if (not (= (length form) 3))
3298 (byte-compile-subr-wrong-args form 2)
3299 (byte-compile-form (car (cdr form))) ;; Push the arguments
3300 (byte-compile-form (nth 2 form))
3301 (byte-compile-out (get (car form) 'byte-opcode) 0)))
3302
3303(defun byte-compile-three-args (form)
3304 (if (not (= (length form) 4))
3305 (byte-compile-subr-wrong-args form 3)
3306 (byte-compile-form (car (cdr form))) ;; Push the arguments
3307 (byte-compile-form (nth 2 form))
3308 (byte-compile-form (nth 3 form))
3309 (byte-compile-out (get (car form) 'byte-opcode) 0)))
3310
3311(defun byte-compile-zero-or-one-arg (form)
3312 (let ((len (length form)))
3313 (cond ((= len 1) (byte-compile-one-arg (append form '(nil))))
3314 ((= len 2) (byte-compile-one-arg form))
3315 (t (byte-compile-subr-wrong-args form "0-1")))))
3316
3317(defun byte-compile-one-or-two-args (form)
3318 (let ((len (length form)))
3319 (cond ((= len 2) (byte-compile-two-args (append form '(nil))))
3320 ((= len 3) (byte-compile-two-args form))
3321 (t (byte-compile-subr-wrong-args form "1-2")))))
3322
3323(defun byte-compile-two-or-three-args (form)
3324 (let ((len (length form)))
3325 (cond ((= len 3) (byte-compile-three-args (append form '(nil))))
3326 ((= len 4) (byte-compile-three-args form))
3327 (t (byte-compile-subr-wrong-args form "2-3")))))
3328
3329(defun byte-compile-noop (form)
3330 (byte-compile-constant nil))
3331
b9598260
SM
3332(defun byte-compile-discard (&optional num preserve-tos)
3333 "Output byte codes to discard the NUM entries at the top of the stack (NUM defaults to 1).
3334If PRESERVE-TOS is non-nil, preserve the top-of-stack value, as if it were
3335popped before discarding the num values, and then pushed back again after
3336discarding."
3337 (if (and (null num) (not preserve-tos))
3338 ;; common case
3339 (byte-compile-out 'byte-discard)
3340 ;; general case
3341 (unless num
3342 (setq num 1))
3343 (when (and preserve-tos (> num 0))
3344 ;; Preserve the top-of-stack value by writing it directly to the stack
3345 ;; location which will be at the top-of-stack after popping.
3346 (byte-compile-stack-set (1- (- byte-compile-depth num)))
3347 ;; Now we actually discard one less value, since we want to keep
3348 ;; the eventual TOS
3349 (setq num (1- num)))
3350 (while (> num 0)
3351 (byte-compile-out 'byte-discard)
3352 (setq num (1- num)))))
3353
3354(defun byte-compile-stack-ref (stack-pos)
3355 "Output byte codes to push the value at position STACK-POS in the stack, on the top of the stack."
3e21b6a7
SM
3356 (let ((dist (- byte-compile-depth (1+ stack-pos))))
3357 (if (zerop dist)
3358 ;; A simple optimization
3359 (byte-compile-out 'byte-dup)
3360 ;; normal case
3361 (byte-compile-out 'byte-stack-ref dist))))
b9598260
SM
3362
3363(defun byte-compile-stack-set (stack-pos)
3364 "Output byte codes to store the top-of-stack value at position STACK-POS in the stack."
3e21b6a7 3365 (byte-compile-out 'byte-stack-set (- byte-compile-depth (1+ stack-pos))))
1c393159 3366
cb9336bd
SM
3367(byte-defop-compiler-1 internal-make-closure byte-compile-make-closure)
3368(byte-defop-compiler-1 internal-get-closed-var byte-compile-get-closed-var)
3369
3370(defconst byte-compile--env-var (make-symbol "env"))
3371
3372(defun byte-compile-make-closure (form)
876c194c
SM
3373 (if for-effect (setq for-effect nil)
3374 (let* ((vars (nth 1 form))
3375 (env (nth 2 form))
3376 (body (nthcdr 3 form))
3377 (fun
3378 (byte-compile-lambda `(lambda ,vars . ,body) nil (length env))))
3379 (assert (byte-code-function-p fun))
3380 (byte-compile-form `(make-byte-code
3381 ',(aref fun 0) ',(aref fun 1)
3382 (vconcat (vector . ,env) ',(aref fun 2))
3383 ,@(nthcdr 3 (mapcar (lambda (x) `',x) fun)))))))
3384
cb9336bd
SM
3385
3386(defun byte-compile-get-closed-var (form)
876c194c
SM
3387 (if for-effect (setq for-effect nil)
3388 (byte-compile-out 'byte-constant ;; byte-closed-var
3389 (nth 1 form))))
1c393159
JB
3390
3391;; Compile a function that accepts one or more args and is right-associative.
c0f43df5
RS
3392;; We do it by left-associativity so that the operations
3393;; are done in the same order as in interpreted code.
10809e0f
RS
3394;; We treat the one-arg case, as in (+ x), like (+ x 0).
3395;; in order to convert markers to numbers, and trigger expected errors.
1c393159
JB
3396(defun byte-compile-associative (form)
3397 (if (cdr form)
c0f43df5 3398 (let ((opcode (get (car form) 'byte-opcode))
24ae8da4
CY
3399 args)
3400 (if (and (< 3 (length form))
3401 (memq opcode (list (get '+ 'byte-opcode)
3402 (get '* 'byte-opcode))))
3403 ;; Don't use binary operations for > 2 operands, as that
3404 ;; may cause overflow/truncation in float operations.
3405 (byte-compile-normal-call form)
3406 (setq args (copy-sequence (cdr form)))
3407 (byte-compile-form (car args))
3408 (setq args (cdr args))
3409 (or args (setq args '(0)
3410 opcode (get '+ 'byte-opcode)))
3411 (dolist (arg args)
3412 (byte-compile-form arg)
3413 (byte-compile-out opcode 0))))
1c393159
JB
3414 (byte-compile-constant (eval form))))
3415
3416\f
3417;; more complicated compiler macros
3418
ec448ae2 3419(byte-defop-compiler char-before)
a746fb65
GM
3420(byte-defop-compiler backward-char)
3421(byte-defop-compiler backward-word)
1c393159
JB
3422(byte-defop-compiler list)
3423(byte-defop-compiler concat)
3424(byte-defop-compiler fset)
3425(byte-defop-compiler (indent-to-column byte-indent-to) byte-compile-indent-to)
3426(byte-defop-compiler indent-to)
3427(byte-defop-compiler insert)
3428(byte-defop-compiler-1 function byte-compile-function-form)
3429(byte-defop-compiler-1 - byte-compile-minus)
eef899a9
GM
3430(byte-defop-compiler (/ byte-quo) byte-compile-quo)
3431(byte-defop-compiler nconc)
1c393159 3432
ec448ae2
GM
3433(defun byte-compile-char-before (form)
3434 (cond ((= 2 (length form))
a746fb65
GM
3435 (byte-compile-form (list 'char-after (if (numberp (nth 1 form))
3436 (1- (nth 1 form))
3437 `(1- ,(nth 1 form))))))
3438 ((= 1 (length form))
3439 (byte-compile-form '(char-after (1- (point)))))
3440 (t (byte-compile-subr-wrong-args form "0-1"))))
3441
3442;; backward-... ==> forward-... with negated argument.
3443(defun byte-compile-backward-char (form)
3444 (cond ((= 2 (length form))
3445 (byte-compile-form (list 'forward-char (if (numberp (nth 1 form))
3446 (- (nth 1 form))
3447 `(- ,(nth 1 form))))))
3448 ((= 1 (length form))
3449 (byte-compile-form '(forward-char -1)))
3450 (t (byte-compile-subr-wrong-args form "0-1"))))
3451
3452(defun byte-compile-backward-word (form)
3453 (cond ((= 2 (length form))
3454 (byte-compile-form (list 'forward-word (if (numberp (nth 1 form))
3455 (- (nth 1 form))
3456 `(- ,(nth 1 form))))))
3457 ((= 1 (length form))
3458 (byte-compile-form '(forward-word -1)))
3459 (t (byte-compile-subr-wrong-args form "0-1"))))
ec448ae2 3460
1c393159
JB
3461(defun byte-compile-list (form)
3462 (let ((count (length (cdr form))))
3463 (cond ((= count 0)
3464 (byte-compile-constant nil))
3465 ((< count 5)
ed62683d 3466 (mapc 'byte-compile-form (cdr form))
1c393159
JB
3467 (byte-compile-out
3468 (aref [byte-list1 byte-list2 byte-list3 byte-list4] (1- count)) 0))
e5c89ce9 3469 ((< count 256)
ed62683d 3470 (mapc 'byte-compile-form (cdr form))
1c393159
JB
3471 (byte-compile-out 'byte-listN count))
3472 (t (byte-compile-normal-call form)))))
3473
3474(defun byte-compile-concat (form)
3475 (let ((count (length (cdr form))))
3476 (cond ((and (< 1 count) (< count 5))
ed62683d 3477 (mapc 'byte-compile-form (cdr form))
1c393159
JB
3478 (byte-compile-out
3479 (aref [byte-concat2 byte-concat3 byte-concat4] (- count 2))
3480 0))
3481 ;; Concat of one arg is not a no-op if arg is not a string.
3482 ((= count 0)
3483 (byte-compile-form ""))
e5c89ce9 3484 ((< count 256)
ed62683d 3485 (mapc 'byte-compile-form (cdr form))
1c393159
JB
3486 (byte-compile-out 'byte-concatN count))
3487 ((byte-compile-normal-call form)))))
3488
3489(defun byte-compile-minus (form)
24ae8da4
CY
3490 (let ((len (length form)))
3491 (cond
3492 ((= 1 len) (byte-compile-constant 0))
3493 ((= 2 len)
3494 (byte-compile-form (cadr form))
3495 (byte-compile-out 'byte-negate 0))
2b9c3b12 3496 ((= 3 len)
24ae8da4
CY
3497 (byte-compile-form (nth 1 form))
3498 (byte-compile-form (nth 2 form))
3499 (byte-compile-out 'byte-diff 0))
3500 ;; Don't use binary operations for > 2 operands, as that may
3501 ;; cause overflow/truncation in float operations.
3502 (t (byte-compile-normal-call form)))))
1c393159
JB
3503
3504(defun byte-compile-quo (form)
3505 (let ((len (length form)))
3506 (cond ((<= len 2)
3507 (byte-compile-subr-wrong-args form "2 or more"))
24ae8da4
CY
3508 ((= len 3)
3509 (byte-compile-two-args form))
1c393159 3510 (t
24ae8da4
CY
3511 ;; Don't use binary operations for > 2 operands, as that
3512 ;; may cause overflow/truncation in float operations.
3513 (byte-compile-normal-call form)))))
1c393159
JB
3514
3515(defun byte-compile-nconc (form)
3516 (let ((len (length form)))
3517 (cond ((= len 1)
3518 (byte-compile-constant nil))
3519 ((= len 2)
3520 ;; nconc of one arg is a noop, even if that arg isn't a list.
3521 (byte-compile-form (nth 1 form)))
3522 (t
3523 (byte-compile-form (car (setq form (cdr form))))
3524 (while (setq form (cdr form))
3525 (byte-compile-form (car form))
3526 (byte-compile-out 'byte-nconc 0))))))
3527
3528(defun byte-compile-fset (form)
3529 ;; warn about forms like (fset 'foo '(lambda () ...))
3530 ;; (where the lambda expression is non-trivial...)
3531 (let ((fn (nth 2 form))
3532 body)
3533 (if (and (eq (car-safe fn) 'quote)
3534 (eq (car-safe (setq fn (nth 1 fn))) 'lambda))
3535 (progn
3536 (setq body (cdr (cdr fn)))
3537 (if (stringp (car body)) (setq body (cdr body)))
3538 (if (eq 'interactive (car-safe (car body))) (setq body (cdr body)))
3539 (if (and (consp (car body))
3540 (not (eq 'byte-code (car (car body)))))
3541 (byte-compile-warn
1d5c17c0 3542 "A quoted lambda form is the second argument of `fset'. This is probably
1c393159
JB
3543 not what you want, as that lambda cannot be compiled. Consider using
3544 the syntax (function (lambda (...) ...)) instead.")))))
3545 (byte-compile-two-args form))
3546
1c393159
JB
3547;; (function foo) must compile like 'foo, not like (symbol-function 'foo).
3548;; Otherwise it will be incompatible with the interpreter,
3549;; and (funcall (function foo)) will lose with autoloads.
3550
3551(defun byte-compile-function-form (form)
b9598260
SM
3552 (if (symbolp (nth 1 form))
3553 (byte-compile-constant (nth 1 form))
3554 (byte-compile-closure (nth 1 form))))
1c393159
JB
3555
3556(defun byte-compile-indent-to (form)
3557 (let ((len (length form)))
3558 (cond ((= len 2)
3559 (byte-compile-form (car (cdr form)))
3560 (byte-compile-out 'byte-indent-to 0))
3561 ((= len 3)
3562 ;; no opcode for 2-arg case.
3563 (byte-compile-normal-call form))
3564 (t
3565 (byte-compile-subr-wrong-args form "1-2")))))
3566
3567(defun byte-compile-insert (form)
3568 (cond ((null (cdr form))
3569 (byte-compile-constant nil))
e5c89ce9 3570 ((<= (length form) 256)
ed62683d 3571 (mapc 'byte-compile-form (cdr form))
1c393159
JB
3572 (if (cdr (cdr form))
3573 (byte-compile-out 'byte-insertN (length (cdr form)))
3574 (byte-compile-out 'byte-insert 0)))
3575 ((memq t (mapcar 'consp (cdr (cdr form))))
3576 (byte-compile-normal-call form))
3577 ;; We can split it; there is no function call after inserting 1st arg.
3578 (t
3579 (while (setq form (cdr form))
3580 (byte-compile-form (car form))
3581 (byte-compile-out 'byte-insert 0)
3582 (if (cdr form)
3583 (byte-compile-discard))))))
3584
1c393159
JB
3585\f
3586(byte-defop-compiler-1 setq)
3587(byte-defop-compiler-1 setq-default)
3588(byte-defop-compiler-1 quote)
1c393159
JB
3589
3590(defun byte-compile-setq (form)
c2768569
GM
3591 (let ((bytecomp-args (cdr form)))
3592 (if bytecomp-args
3593 (while bytecomp-args
3594 (byte-compile-form (car (cdr bytecomp-args)))
3595 (or for-effect (cdr (cdr bytecomp-args))
1c393159 3596 (byte-compile-out 'byte-dup 0))
b9598260 3597 (byte-compile-variable-set (car bytecomp-args))
c2768569 3598 (setq bytecomp-args (cdr (cdr bytecomp-args))))
1c393159
JB
3599 ;; (setq), with no arguments.
3600 (byte-compile-form nil for-effect))
3601 (setq for-effect nil)))
3602
3603(defun byte-compile-setq-default (form)
9ae0c310
SM
3604 (setq form (cdr form))
3605 (if (> (length form) 2)
3606 (let ((setters ()))
3607 (while (consp form)
3608 (push `(setq-default ,(pop form) ,(pop form)) setters))
3609 (byte-compile-form (cons 'progn (nreverse setters))))
3610 (let ((var (car form)))
3611 (and (or (not (symbolp var))
3612 (byte-compile-const-symbol-p var t))
3613 (byte-compile-warning-enabled-p 'constants)
3614 (byte-compile-warn
3615 "variable assignment to %s `%s'"
3616 (if (symbolp var) "constant" "nonvariable")
3617 (prin1-to-string var)))
3618 (byte-compile-normal-call `(set-default ',var ,@(cdr form))))))
3619
3620(byte-defop-compiler-1 set-default)
3621(defun byte-compile-set-default (form)
3622 (let ((varexp (car-safe (cdr-safe form))))
3623 (if (eq (car-safe varexp) 'quote)
3624 ;; If the varexp is constant, compile it as a setq-default
3625 ;; so we get more warnings.
3626 (byte-compile-setq-default `(setq-default ,(car-safe (cdr varexp))
3627 ,@(cddr form)))
3628 (byte-compile-normal-call form))))
1c393159
JB
3629
3630(defun byte-compile-quote (form)
3631 (byte-compile-constant (car (cdr form))))
1c393159
JB
3632\f
3633;;; control structures
3634
c2768569
GM
3635(defun byte-compile-body (bytecomp-body &optional for-effect)
3636 (while (cdr bytecomp-body)
3637 (byte-compile-form (car bytecomp-body) t)
3638 (setq bytecomp-body (cdr bytecomp-body)))
3639 (byte-compile-form (car bytecomp-body) for-effect))
1c393159 3640
c2768569
GM
3641(defsubst byte-compile-body-do-effect (bytecomp-body)
3642 (byte-compile-body bytecomp-body for-effect)
1c393159
JB
3643 (setq for-effect nil))
3644
52799cb8 3645(defsubst byte-compile-form-do-effect (form)
1c393159
JB
3646 (byte-compile-form form for-effect)
3647 (setq for-effect nil))
3648
3649(byte-defop-compiler-1 inline byte-compile-progn)
3650(byte-defop-compiler-1 progn)
3651(byte-defop-compiler-1 prog1)
3652(byte-defop-compiler-1 prog2)
3653(byte-defop-compiler-1 if)
3654(byte-defop-compiler-1 cond)
3655(byte-defop-compiler-1 and)
3656(byte-defop-compiler-1 or)
3657(byte-defop-compiler-1 while)
3658(byte-defop-compiler-1 funcall)
1c393159 3659(byte-defop-compiler-1 let)
b38b1ec0 3660(byte-defop-compiler-1 let* byte-compile-let)
1c393159
JB
3661
3662(defun byte-compile-progn (form)
3663 (byte-compile-body-do-effect (cdr form)))
3664
3665(defun byte-compile-prog1 (form)
3666 (byte-compile-form-do-effect (car (cdr form)))
3667 (byte-compile-body (cdr (cdr form)) t))
3668
3669(defun byte-compile-prog2 (form)
3670 (byte-compile-form (nth 1 form) t)
3671 (byte-compile-form-do-effect (nth 2 form))
3672 (byte-compile-body (cdr (cdr (cdr form))) t))
3673
3674(defmacro byte-compile-goto-if (cond discard tag)
1639b803
DL
3675 `(byte-compile-goto
3676 (if ,cond
3677 (if ,discard 'byte-goto-if-not-nil 'byte-goto-if-not-nil-else-pop)
3678 (if ,discard 'byte-goto-if-nil 'byte-goto-if-nil-else-pop))
3679 ,tag))
1c393159 3680
70f41945
DN
3681;; Return the list of items in CONDITION-PARAM that match PRED-LIST.
3682;; Only return items that are not in ONLY-IF-NOT-PRESENT.
516b3653
JB
3683(defun byte-compile-find-bound-condition (condition-param
3684 pred-list
70f41945
DN
3685 &optional only-if-not-present)
3686 (let ((result nil)
3687 (nth-one nil)
516b3653 3688 (cond-list
70f41945
DN
3689 (if (memq (car-safe condition-param) pred-list)
3690 ;; The condition appears by itself.
3691 (list condition-param)
3692 ;; If the condition is an `and', look for matches among the
3693 ;; `and' arguments.
3694 (when (eq 'and (car-safe condition-param))
3695 (cdr condition-param)))))
516b3653 3696
70f41945
DN
3697 (dolist (crt cond-list)
3698 (when (and (memq (car-safe crt) pred-list)
3699 (eq 'quote (car-safe (setq nth-one (nth 1 crt))))
3700 ;; Ignore if the symbol is already on the unresolved
3701 ;; list.
3702 (not (assq (nth 1 nth-one) ; the relevant symbol
3703 only-if-not-present)))
3704 (push (nth 1 (nth 1 crt)) result)))
3705 result))
3706
6b61353c
KH
3707(defmacro byte-compile-maybe-guarded (condition &rest body)
3708 "Execute forms in BODY, potentially guarded by CONDITION.
82a726b4 3709CONDITION is a variable whose value is a test in an `if' or `cond'.
d6dc41d5
GM
3710BODY is the code to compile in the first arm of the if or the body of
3711the cond clause. If CONDITION's value is of the form (fboundp 'foo)
ad50a502 3712or (boundp 'foo), the relevant warnings from BODY about foo's
8480fc7c 3713being undefined (or obsolete) will be suppressed.
82a726b4 3714
b2e948ee 3715If CONDITION's value is (not (featurep 'emacs)) or (featurep 'xemacs),
ad50a502 3716that suppresses all warnings during execution of BODY."
6b61353c 3717 (declare (indent 1) (debug t))
516b3653
JB
3718 `(let* ((fbound-list (byte-compile-find-bound-condition
3719 ,condition (list 'fboundp)
70f41945 3720 byte-compile-unresolved-functions))
516b3653 3721 (bound-list (byte-compile-find-bound-condition
70f41945 3722 ,condition (list 'boundp 'default-boundp)))
6b61353c
KH
3723 ;; Maybe add to the bound list.
3724 (byte-compile-bound-variables
ce5b520a 3725 (append bound-list byte-compile-bound-variables)))
82a726b4 3726 (unwind-protect
8480fc7c
GM
3727 ;; If things not being bound at all is ok, so must them being obsolete.
3728 ;; Note that we add to the existing lists since Tramp (ab)uses
3729 ;; this feature.
3730 (let ((byte-compile-not-obsolete-vars
3731 (append byte-compile-not-obsolete-vars bound-list))
3732 (byte-compile-not-obsolete-funcs
3733 (append byte-compile-not-obsolete-funcs fbound-list)))
3734 ,@body)
82a726b4 3735 ;; Maybe remove the function symbol from the unresolved list.
70f41945
DN
3736 (dolist (fbound fbound-list)
3737 (when fbound
82a726b4
RS
3738 (setq byte-compile-unresolved-functions
3739 (delq (assq fbound byte-compile-unresolved-functions)
70f41945 3740 byte-compile-unresolved-functions)))))))
6b61353c 3741
1c393159
JB
3742(defun byte-compile-if (form)
3743 (byte-compile-form (car (cdr form)))
b8234c84
DL
3744 ;; Check whether we have `(if (fboundp ...' or `(if (boundp ...'
3745 ;; and avoid warnings about the relevent symbols in the consequent.
6b61353c
KH
3746 (let ((clause (nth 1 form))
3747 (donetag (byte-compile-make-tag)))
b8234c84
DL
3748 (if (null (nthcdr 3 form))
3749 ;; No else-forms
3750 (progn
3751 (byte-compile-goto-if nil for-effect donetag)
6b61353c 3752 (byte-compile-maybe-guarded clause
b8234c84 3753 (byte-compile-form (nth 2 form) for-effect))
b8234c84
DL
3754 (byte-compile-out-tag donetag))
3755 (let ((elsetag (byte-compile-make-tag)))
3756 (byte-compile-goto 'byte-goto-if-nil elsetag)
6b61353c
KH
3757 (byte-compile-maybe-guarded clause
3758 (byte-compile-form (nth 2 form) for-effect))
b8234c84
DL
3759 (byte-compile-goto 'byte-goto donetag)
3760 (byte-compile-out-tag elsetag)
300f994a
RS
3761 (byte-compile-maybe-guarded (list 'not clause)
3762 (byte-compile-body (cdr (cdr (cdr form))) for-effect))
b8234c84 3763 (byte-compile-out-tag donetag))))
1c393159
JB
3764 (setq for-effect nil))
3765
3766(defun byte-compile-cond (clauses)
3767 (let ((donetag (byte-compile-make-tag))
3768 nexttag clause)
3769 (while (setq clauses (cdr clauses))
3770 (setq clause (car clauses))
3771 (cond ((or (eq (car clause) t)
3772 (and (eq (car-safe (car clause)) 'quote)
3773 (car-safe (cdr-safe (car clause)))))
3774 ;; Unconditional clause
3775 (setq clause (cons t clause)
3776 clauses nil))
3777 ((cdr clauses)
3778 (byte-compile-form (car clause))
3779 (if (null (cdr clause))
3780 ;; First clause is a singleton.
3781 (byte-compile-goto-if t for-effect donetag)
82a726b4
RS
3782 (setq nexttag (byte-compile-make-tag))
3783 (byte-compile-goto 'byte-goto-if-nil nexttag)
3784 (byte-compile-maybe-guarded (car clause)
3785 (byte-compile-body (cdr clause) for-effect))
3786 (byte-compile-goto 'byte-goto donetag)
3787 (byte-compile-out-tag nexttag)))))
1c393159 3788 ;; Last clause
6b61353c
KH
3789 (let ((guard (car clause)))
3790 (and (cdr clause) (not (eq guard t))
3791 (progn (byte-compile-form guard)
3792 (byte-compile-goto-if nil for-effect donetag)
3793 (setq clause (cdr clause))))
3794 (byte-compile-maybe-guarded guard
3795 (byte-compile-body-do-effect clause)))
1c393159
JB
3796 (byte-compile-out-tag donetag)))
3797
3798(defun byte-compile-and (form)
3799 (let ((failtag (byte-compile-make-tag))
c2768569
GM
3800 (bytecomp-args (cdr form)))
3801 (if (null bytecomp-args)
1c393159 3802 (byte-compile-form-do-effect t)
c2768569 3803 (byte-compile-and-recursion bytecomp-args failtag))))
8877fa6f 3804
83b0af6e 3805;; Handle compilation of a nontrivial `and' call.
8877fa6f
RS
3806;; We use tail recursion so we can use byte-compile-maybe-guarded.
3807(defun byte-compile-and-recursion (rest failtag)
3808 (if (cdr rest)
3809 (progn
3810 (byte-compile-form (car rest))
1c393159 3811 (byte-compile-goto-if nil for-effect failtag)
8877fa6f
RS
3812 (byte-compile-maybe-guarded (car rest)
3813 (byte-compile-and-recursion (cdr rest) failtag)))
3814 (byte-compile-form-do-effect (car rest))
3815 (byte-compile-out-tag failtag)))
1c393159
JB
3816
3817(defun byte-compile-or (form)
3818 (let ((wintag (byte-compile-make-tag))
c2768569
GM
3819 (bytecomp-args (cdr form)))
3820 (if (null bytecomp-args)
1c393159 3821 (byte-compile-form-do-effect nil)
c2768569 3822 (byte-compile-or-recursion bytecomp-args wintag))))
83b0af6e
RS
3823
3824;; Handle compilation of a nontrivial `or' call.
3825;; We use tail recursion so we can use byte-compile-maybe-guarded.
3826(defun byte-compile-or-recursion (rest wintag)
3827 (if (cdr rest)
3828 (progn
3829 (byte-compile-form (car rest))
1c393159 3830 (byte-compile-goto-if t for-effect wintag)
83b0af6e
RS
3831 (byte-compile-maybe-guarded (list 'not (car rest))
3832 (byte-compile-or-recursion (cdr rest) wintag)))
3833 (byte-compile-form-do-effect (car rest))
3834 (byte-compile-out-tag wintag)))
1c393159
JB
3835
3836(defun byte-compile-while (form)
3837 (let ((endtag (byte-compile-make-tag))
ce5b520a 3838 (looptag (byte-compile-make-tag)))
1c393159
JB
3839 (byte-compile-out-tag looptag)
3840 (byte-compile-form (car (cdr form)))
3841 (byte-compile-goto-if nil for-effect endtag)
3842 (byte-compile-body (cdr (cdr form)) t)
3843 (byte-compile-goto 'byte-goto looptag)
3844 (byte-compile-out-tag endtag)
3845 (setq for-effect nil)))
3846
3847(defun byte-compile-funcall (form)
ed62683d 3848 (mapc 'byte-compile-form (cdr form))
1c393159
JB
3849 (byte-compile-out 'byte-call (length (cdr (cdr form)))))
3850
b9598260
SM
3851\f
3852;; let binding
3853
ce5b520a 3854(defun byte-compile-push-binding-init (clause)
b9598260 3855 "Emit byte-codes to push the initialization value for CLAUSE on the stack.
ce5b520a
SM
3856Return the offset in the form (VAR . OFFSET)."
3857 (let* ((var (if (consp clause) (car clause) clause)))
3858 ;; We record the stack position even of dynamic bindings and
3859 ;; variables in non-stack lexical environments; we'll put
3860 ;; them in the proper place below.
3861 (prog1 (cons var byte-compile-depth)
b9598260 3862 (if (consp clause)
ce5b520a
SM
3863 (byte-compile-form (cadr clause))
3864 (byte-compile-push-constant nil)))))
3865
3866(defun byte-compile-not-lexical-var-p (var)
b38b1ec0
SM
3867 (or (not (symbolp var))
3868 (special-variable-p var)
ce5b520a
SM
3869 (memq var byte-compile-bound-variables)
3870 (memq var '(nil t))
3871 (keywordp var)))
3872
3873(defun byte-compile-bind (var init-lexenv)
3874 "Emit byte-codes to bind VAR and update `byte-compile-lexical-environment'.
3875INIT-LEXENV should be a lexical-environment alist describing the
3876positions of the init value that have been pushed on the stack.
3877Return non-nil if the TOS value was popped."
3878 ;; The presence of lexical bindings mean that we may have to
b38b1ec0
SM
3879 ;; juggle things on the stack, to move them to TOS for
3880 ;; dynamic binding.
ce5b520a
SM
3881 (cond ((not (byte-compile-not-lexical-var-p var))
3882 ;; VAR is a simple stack-allocated lexical variable
3883 (push (assq var init-lexenv)
3884 byte-compile-lexical-environment)
3885 nil)
3886 ((eq var (caar init-lexenv))
3887 ;; VAR is dynamic and is on the top of the
3888 ;; stack, so we can just bind it like usual
3889 (byte-compile-dynamic-variable-bind var)
3890 t)
3891 (t
3892 ;; VAR is dynamic, but we have to get its
3893 ;; value out of the middle of the stack
3894 (let ((stack-pos (cdr (assq var init-lexenv))))
3895 (byte-compile-stack-ref stack-pos)
3896 (byte-compile-dynamic-variable-bind var)
3897 ;; Now we have to store nil into its temporary
3898 ;; stack position to avoid problems with GC
3899 (byte-compile-push-constant nil)
3900 (byte-compile-stack-set stack-pos))
3901 nil)))
3902
3903(defun byte-compile-unbind (clauses init-lexenv
3904 &optional preserve-body-value)
3905 "Emit byte-codes to unbind the variables bound by CLAUSES.
3906CLAUSES is a `let'-style variable binding list. INIT-LEXENV should be a
3907lexical-environment alist describing the positions of the init value that
3908have been pushed on the stack. If PRESERVE-BODY-VALUE is true,
3909then an additional value on the top of the stack, above any lexical binding
3910slots, is preserved, so it will be on the top of the stack after all
3911binding slots have been popped."
3912 ;; Unbind dynamic variables
3913 (let ((num-dynamic-bindings 0))
3914 (dolist (clause clauses)
3915 (unless (assq (if (consp clause) (car clause) clause)
3916 byte-compile-lexical-environment)
3917 (setq num-dynamic-bindings (1+ num-dynamic-bindings))))
3918 (unless (zerop num-dynamic-bindings)
3919 (byte-compile-out 'byte-unbind num-dynamic-bindings)))
3920 ;; Pop lexical variables off the stack, possibly preserving the
3921 ;; return value of the body.
3922 (when init-lexenv
3923 ;; INIT-LEXENV contains all init values left on the stack
3924 (byte-compile-discard (length init-lexenv) preserve-body-value)))
1c393159
JB
3925
3926(defun byte-compile-let (form)
b9598260 3927 "Generate code for the `let' form FORM."
b38b1ec0
SM
3928 (let ((clauses (cadr form))
3929 (init-lexenv nil))
3930 (when (eq (car form) 'let)
3931 ;; First compute the binding values in the old scope.
3932 (dolist (var clauses)
3933 (push (byte-compile-push-binding-init var) init-lexenv)))
3934 ;; New scope.
3935 (let ((byte-compile-bound-variables byte-compile-bound-variables)
ce5b520a 3936 (byte-compile-lexical-environment byte-compile-lexical-environment))
b38b1ec0
SM
3937 ;; Bind the variables.
3938 ;; For `let', do it in reverse order, because it makes no
3939 ;; semantic difference, but it is a lot more efficient since the
3940 ;; values are now in reverse order on the stack.
3941 (dolist (var (if (eq (car form) 'let) (reverse clauses) clauses))
3942 (unless (eq (car form) 'let)
3943 (push (byte-compile-push-binding-init var) init-lexenv))
3944 (let ((var (if (consp var) (car var) var)))
3945 (cond ((null lexical-binding)
3946 ;; If there are no lexical bindings, we can do things simply.
3947 (byte-compile-dynamic-variable-bind var))
3948 ((byte-compile-bind var init-lexenv)
3949 (pop init-lexenv)))))
ce5b520a 3950 ;; Emit the body.
b38b1ec0
SM
3951 (let ((init-stack-depth byte-compile-depth))
3952 (byte-compile-body-do-effect (cdr (cdr form)))
3953 ;; Unbind the variables.
3954 (if lexical-binding
3955 ;; Unbind both lexical and dynamic variables.
3956 (progn
3957 (assert (or (eq byte-compile-depth init-stack-depth)
3958 (eq byte-compile-depth (1+ init-stack-depth))))
3959 (byte-compile-unbind clauses init-lexenv (> byte-compile-depth
3960 init-stack-depth)))
3961 ;; Unbind dynamic variables.
3962 (byte-compile-out 'byte-unbind (length clauses)))))))
1c393159 3963
b9598260 3964\f
1c393159
JB
3965
3966(byte-defop-compiler-1 /= byte-compile-negated)
3967(byte-defop-compiler-1 atom byte-compile-negated)
3968(byte-defop-compiler-1 nlistp byte-compile-negated)
3969
3970(put '/= 'byte-compile-negated-op '=)
3971(put 'atom 'byte-compile-negated-op 'consp)
3972(put 'nlistp 'byte-compile-negated-op 'listp)
3973
3974(defun byte-compile-negated (form)
3975 (byte-compile-form-do-effect (byte-compile-negation-optimizer form)))
3976
3977;; Even when optimization is off, /= is optimized to (not (= ...)).
3978(defun byte-compile-negation-optimizer (form)
3979 ;; an optimizer for forms where <form1> is less efficient than (not <form2>)
ccb3c8de 3980 (byte-compile-set-symbol-position (car form))
1c393159
JB
3981 (list 'not
3982 (cons (or (get (car form) 'byte-compile-negated-op)
3983 (error
52799cb8 3984 "Compiler error: `%s' has no `byte-compile-negated-op' property"
1c393159
JB
3985 (car form)))
3986 (cdr form))))
b9598260 3987
1c393159
JB
3988\f
3989;;; other tricky macro-like special-forms
3990
3991(byte-defop-compiler-1 catch)
3992(byte-defop-compiler-1 unwind-protect)
3993(byte-defop-compiler-1 condition-case)
3994(byte-defop-compiler-1 save-excursion)
f3e472b0 3995(byte-defop-compiler-1 save-current-buffer)
1c393159 3996(byte-defop-compiler-1 save-restriction)
6e8d0db7 3997(byte-defop-compiler-1 track-mouse)
1c393159
JB
3998
3999(defun byte-compile-catch (form)
4000 (byte-compile-form (car (cdr form)))
d779e73c
SM
4001 (pcase (cddr form)
4002 (`(:fun-body ,f)
4003 (byte-compile-form `(list 'funcall ,f)))
4004 (body
4005 (byte-compile-push-constant
4006 (byte-compile-top-level (cons 'progn body) for-effect))))
1c393159
JB
4007 (byte-compile-out 'byte-catch 0))
4008
4009(defun byte-compile-unwind-protect (form)
d779e73c
SM
4010 (pcase (cddr form)
4011 (`(:fun-body ,f)
4012 (byte-compile-form `(list (list 'funcall ,f))))
4013 (handlers
4014 (byte-compile-push-constant
4015 (byte-compile-top-level-body handlers t))))
1c393159
JB
4016 (byte-compile-out 'byte-unwind-protect 0)
4017 (byte-compile-form-do-effect (car (cdr form)))
4018 (byte-compile-out 'byte-unbind 1))
4019
6e8d0db7 4020(defun byte-compile-track-mouse (form)
d7846e08 4021 (byte-compile-form
d779e73c
SM
4022 (pcase form
4023 (`(,_ :fun-body ,f) `(eval (list 'track-mouse (list 'funcall ,f))))
4024 (_ `(eval '(track-mouse ,@(byte-compile-top-level-body (cdr form))))))))
6e8d0db7 4025
1c393159
JB
4026(defun byte-compile-condition-case (form)
4027 (let* ((var (nth 1 form))
ce5b520a
SM
4028 (fun-bodies (eq var :fun-body))
4029 (byte-compile-bound-variables
4030 (if (and var (not fun-bodies))
4031 (cons var byte-compile-bound-variables)
4032 byte-compile-bound-variables)))
ccb3c8de
CW
4033 (byte-compile-set-symbol-position 'condition-case)
4034 (unless (symbolp var)
4035 (byte-compile-warn
1d5c17c0 4036 "`%s' is not a variable-name or nil (in condition-case)" var))
d779e73c 4037 (if fun-bodies (setq var (make-symbol "err")))
1c393159 4038 (byte-compile-push-constant var)
d779e73c
SM
4039 (if fun-bodies
4040 (byte-compile-form `(list 'funcall ,(nth 2 form)))
4041 (byte-compile-push-constant
4042 (byte-compile-top-level (nth 2 form) for-effect)))
4043 (let ((compiled-clauses
4044 (mapcar
4045 (lambda (clause)
4046 (let ((condition (car clause)))
4047 (cond ((not (or (symbolp condition)
4048 (and (listp condition)
4049 (let ((ok t))
4050 (dolist (sym condition)
4051 (if (not (symbolp sym))
4052 (setq ok nil)))
4053 ok))))
4054 (byte-compile-warn
4055 "`%S' is not a condition name or list of such (in condition-case)"
4056 condition))
4057 ;; (not (or (eq condition 't)
4058 ;; (and (stringp (get condition 'error-message))
4059 ;; (consp (get condition
4060 ;; 'error-conditions)))))
4061 ;; (byte-compile-warn
4062 ;; "`%s' is not a known condition name
4063 ;; (in condition-case)"
4064 ;; condition))
4065 )
4066 (if fun-bodies
4067 `(list ',condition (list 'funcall ,(cadr clause) ',var))
4068 (cons condition
4069 (byte-compile-top-level-body
4070 (cdr clause) for-effect)))))
4071 (cdr (cdr (cdr form))))))
4072 (if fun-bodies
4073 (byte-compile-form `(list ,@compiled-clauses))
4074 (byte-compile-push-constant compiled-clauses)))
1c393159
JB
4075 (byte-compile-out 'byte-condition-case 0)))
4076
4077
4078(defun byte-compile-save-excursion (form)
62a258a7
SM
4079 (if (and (eq 'set-buffer (car-safe (car-safe (cdr form))))
4080 (byte-compile-warning-enabled-p 'suspicious))
3ab4308b 4081 (byte-compile-warn "`save-excursion' defeated by `set-buffer'"))
1c393159
JB
4082 (byte-compile-out 'byte-save-excursion 0)
4083 (byte-compile-body-do-effect (cdr form))
4084 (byte-compile-out 'byte-unbind 1))
4085
4086(defun byte-compile-save-restriction (form)
4087 (byte-compile-out 'byte-save-restriction 0)
4088 (byte-compile-body-do-effect (cdr form))
4089 (byte-compile-out 'byte-unbind 1))
4090
f3e472b0
RS
4091(defun byte-compile-save-current-buffer (form)
4092 (byte-compile-out 'byte-save-current-buffer 0)
4093 (byte-compile-body-do-effect (cdr form))
4094 (byte-compile-out 'byte-unbind 1))
1c393159
JB
4095\f
4096;;; top-level forms elsewhere
4097
4098(byte-defop-compiler-1 defun)
4099(byte-defop-compiler-1 defmacro)
4100(byte-defop-compiler-1 defvar)
4101(byte-defop-compiler-1 defconst byte-compile-defvar)
4102(byte-defop-compiler-1 autoload)
4103(byte-defop-compiler-1 lambda byte-compile-lambda-form)
4104
4105(defun byte-compile-defun (form)
4106 ;; This is not used for file-level defuns with doc strings.
ccb3c8de
CW
4107 (if (symbolp (car form))
4108 (byte-compile-set-symbol-position (car form))
4109 (byte-compile-set-symbol-position 'defun)
eadd6444 4110 (error "defun name must be a symbol, not %s" (car form)))
b9598260
SM
4111 (let ((for-effect nil))
4112 (byte-compile-push-constant 'defalias)
4113 (byte-compile-push-constant (nth 1 form))
4114 (byte-compile-closure (cdr (cdr form)) t))
4115 (byte-compile-out 'byte-call 2))
1c393159
JB
4116
4117(defun byte-compile-defmacro (form)
4118 ;; This is not used for file-level defmacros with doc strings.
a9de04fa
SM
4119 (byte-compile-body-do-effect
4120 (let ((decls (byte-compile-defmacro-declaration form))
4121 (code (byte-compile-byte-code-maker
4122 (byte-compile-lambda (cdr (cdr form)) t))))
4123 `((defalias ',(nth 1 form)
4124 ,(if (eq (car-safe code) 'make-byte-code)
4125 `(cons 'macro ,code)
4126 `'(macro . ,(eval code))))
4127 ,@decls
4128 ',(nth 1 form)))))
1c393159
JB
4129
4130(defun byte-compile-defvar (form)
4131 ;; This is not used for file-level defvar/consts with doc strings.
4f1e9960 4132 (when (and (symbolp (nth 1 form))
3fe6ef4e 4133 (not (string-match "[-*/:$]" (symbol-name (nth 1 form))))
4f1e9960 4134 (byte-compile-warning-enabled-p 'lexical))
7a16788b 4135 (byte-compile-warn "global/dynamic var `%s' lacks a prefix"
4f1e9960 4136 (nth 1 form)))
1bc20d83
GM
4137 (let ((fun (nth 0 form))
4138 (var (nth 1 form))
1c393159
JB
4139 (value (nth 2 form))
4140 (string (nth 3 form)))
ccb3c8de 4141 (byte-compile-set-symbol-position fun)
6c2161c4
SM
4142 (when (or (> (length form) 4)
4143 (and (eq fun 'defconst) (null (cddr form))))
d0e07261
SM
4144 (let ((ncall (length (cdr form))))
4145 (byte-compile-warn
1d5c17c0 4146 "`%s' called with %d argument%s, but %s %s"
d0e07261
SM
4147 fun ncall
4148 (if (= 1 ncall) "" "s")
4149 (if (< ncall 2) "requires" "accepts only")
4150 "2-3")))
2aea6521
GM
4151 (push var byte-compile-bound-variables)
4152 (if (eq fun 'defconst)
4153 (push var byte-compile-const-variables))
1c393159 4154 (byte-compile-body-do-effect
1bc20d83
GM
4155 (list
4156 ;; Put the defined variable in this library's load-history entry
4157 ;; just as a real defvar would, but only in top-level forms.
3614fc84 4158 (when (and (cddr form) (null byte-compile-current-form))
b9598260 4159 `(setq current-load-list (cons ',var current-load-list)))
1bc20d83
GM
4160 (when (> (length form) 3)
4161 (when (and string (not (stringp string)))
0028351d
GM
4162 (byte-compile-warn "third arg to `%s %s' is not a string: %s"
4163 fun var string))
1bc20d83 4164 `(put ',var 'variable-documentation ,string))
fef3407e 4165 (if (cddr form) ; `value' provided
8480fc7c 4166 (let ((byte-compile-not-obsolete-vars (list var)))
6b61353c
KH
4167 (if (eq fun 'defconst)
4168 ;; `defconst' sets `var' unconditionally.
4169 (let ((tmp (make-symbol "defconst-tmp-var")))
4170 `(funcall '(lambda (,tmp) (defconst ,var ,tmp))
4171 ,value))
4172 ;; `defvar' sets `var' only when unbound.
4173 `(if (not (default-boundp ',var)) (setq-default ,var ,value))))
6c2161c4
SM
4174 (when (eq fun 'defconst)
4175 ;; This will signal an appropriate error at runtime.
a9de04fa 4176 `(eval ',form)))
1bc20d83 4177 `',var))))
1c393159
JB
4178
4179(defun byte-compile-autoload (form)
ccb3c8de 4180 (byte-compile-set-symbol-position 'autoload)
1c393159
JB
4181 (and (byte-compile-constp (nth 1 form))
4182 (byte-compile-constp (nth 5 form))
4183 (eval (nth 5 form)) ; macro-p
4184 (not (fboundp (eval (nth 1 form))))
4185 (byte-compile-warn
c5091f25 4186 "The compiler ignores `autoload' except at top level. You should
1c393159
JB
4187 probably put the autoload of the macro `%s' at top-level."
4188 (eval (nth 1 form))))
4189 (byte-compile-normal-call form))
4190
c5091f25 4191;; Lambdas in valid places are handled as special cases by various code.
1c393159
JB
4192;; The ones that remain are errors.
4193(defun byte-compile-lambda-form (form)
ccb3c8de 4194 (byte-compile-set-symbol-position 'lambda)
1c393159
JB
4195 (error "`lambda' used as function name is invalid"))
4196
5286a842 4197;; Compile normally, but deal with warnings for the function being defined.
977b50fb
SM
4198(put 'defalias 'byte-hunk-handler 'byte-compile-file-form-defalias)
4199(defun byte-compile-file-form-defalias (form)
5286a842
RS
4200 (if (and (consp (cdr form)) (consp (nth 1 form))
4201 (eq (car (nth 1 form)) 'quote)
4202 (consp (cdr (nth 1 form)))
a7a7ddf1
RS
4203 (symbolp (nth 1 (nth 1 form))))
4204 (let ((constant
4205 (and (consp (nthcdr 2 form))
4206 (consp (nth 2 form))
4207 (eq (car (nth 2 form)) 'quote)
4208 (consp (cdr (nth 2 form)))
4209 (symbolp (nth 1 (nth 2 form))))))
6c2161c4 4210 (byte-compile-defalias-warn (nth 1 (nth 1 form)))
977b50fb
SM
4211 (push (cons (nth 1 (nth 1 form))
4212 (if constant (nth 1 (nth 2 form)) t))
4213 byte-compile-function-environment)))
a2b3fdbf 4214 ;; We used to just do: (byte-compile-normal-call form)
b7a5a208
SM
4215 ;; But it turns out that this fails to optimize the code.
4216 ;; So instead we now do the same as what other byte-hunk-handlers do,
4217 ;; which is to call back byte-compile-file-form and then return nil.
4218 ;; Except that we can't just call byte-compile-file-form since it would
4219 ;; call us right back.
4220 (byte-compile-keep-pending form)
4221 ;; Return nil so the form is not output twice.
4222 nil)
5286a842
RS
4223
4224;; Turn off warnings about prior calls to the function being defalias'd.
4225;; This could be smarter and compare those calls with
4226;; the function it is being aliased to.
6c2161c4 4227(defun byte-compile-defalias-warn (new)
5286a842
RS
4228 (let ((calls (assq new byte-compile-unresolved-functions)))
4229 (if calls
4230 (setq byte-compile-unresolved-functions
4231 (delq calls byte-compile-unresolved-functions)))))
3c9dc1cf
RS
4232
4233(byte-defop-compiler-1 with-no-warnings byte-compile-no-warnings)
4234(defun byte-compile-no-warnings (form)
4235 (let (byte-compile-warnings)
a4f66531 4236 (byte-compile-form (cons 'progn (cdr form)))))
01e4a4fa
SM
4237
4238;; Warn about misuses of make-variable-buffer-local.
49fec531
SM
4239(byte-defop-compiler-1 make-variable-buffer-local
4240 byte-compile-make-variable-buffer-local)
01e4a4fa 4241(defun byte-compile-make-variable-buffer-local (form)
15ce9dcf 4242 (if (and (eq (car-safe (car-safe (cdr-safe form))) 'quote)
cf637a34 4243 (byte-compile-warning-enabled-p 'make-local))
01e4a4fa
SM
4244 (byte-compile-warn
4245 "`make-variable-buffer-local' should be called at toplevel"))
4246 (byte-compile-normal-call form))
4247(put 'make-variable-buffer-local
4248 'byte-hunk-handler 'byte-compile-form-make-variable-buffer-local)
4249(defun byte-compile-form-make-variable-buffer-local (form)
4250 (byte-compile-keep-pending form 'byte-compile-normal-call))
4251
1c393159
JB
4252\f
4253;;; tags
4254
4255;; Note: Most operations will strip off the 'TAG, but it speeds up
4256;; optimization to have the 'TAG as a part of the tag.
4257;; Tags will be (TAG . (tag-number . stack-depth)).
4258(defun byte-compile-make-tag ()
4259 (list 'TAG (setq byte-compile-tag-number (1+ byte-compile-tag-number))))
4260
4261
4262(defun byte-compile-out-tag (tag)
4263 (setq byte-compile-output (cons tag byte-compile-output))
4264 (if (cdr (cdr tag))
4265 (progn
4266 ;; ## remove this someday
4267 (and byte-compile-depth
b38b1ec0
SM
4268 (not (= (cdr (cdr tag)) byte-compile-depth))
4269 (error "Compiler bug: depth conflict at tag %d" (car (cdr tag))))
1c393159
JB
4270 (setq byte-compile-depth (cdr (cdr tag))))
4271 (setcdr (cdr tag) byte-compile-depth)))
4272
4273(defun byte-compile-goto (opcode tag)
6c2161c4 4274 (push (cons opcode tag) byte-compile-output)
1c393159
JB
4275 (setcdr (cdr tag) (if (memq opcode byte-goto-always-pop-ops)
4276 (1- byte-compile-depth)
4277 byte-compile-depth))
4278 (setq byte-compile-depth (and (not (eq opcode 'byte-goto))
4279 (1- byte-compile-depth))))
4280
b9598260
SM
4281(defun byte-compile-stack-adjustment (op operand)
4282 "Return the amount by which an operation adjusts the stack.
4283OP and OPERAND are as passed to `byte-compile-out'."
4284 (if (memq op '(byte-call byte-discardN byte-discardN-preserve-tos))
4285 ;; For calls, OPERAND is the number of args, so we pop OPERAND + 1
4286 ;; elements, and the push the result, for a total of -OPERAND.
4287 ;; For discardN*, of course, we just pop OPERAND elements.
4288 (- operand)
4289 (or (aref byte-stack+-info (symbol-value op))
4290 ;; Ops with a nil entry in `byte-stack+-info' are byte-codes
4291 ;; that take OPERAND values off the stack and push a result, for
4292 ;; a total of 1 - OPERAND
4293 (- 1 operand))))
4294
4295(defun byte-compile-out (op &optional operand)
4296 (push (cons op operand) byte-compile-output)
4297 (if (eq op 'byte-return)
4298 ;; This is actually an unnecessary case, because there should be no
4299 ;; more ops behind byte-return.
4300 (setq byte-compile-depth nil)
4301 (setq byte-compile-depth
4302 (+ byte-compile-depth (byte-compile-stack-adjustment op operand)))
4303 (setq byte-compile-maxdepth (max byte-compile-depth byte-compile-maxdepth))
4304 ;;(if (< byte-compile-depth 0) (error "Compiler error: stack underflow"))
4305 ))
4306
4307(defun byte-compile-delay-out (&optional stack-used stack-adjust)
4308 "Add a placeholder to the output, which can be used to later add byte-codes.
4309Return a position tag that can be passed to `byte-compile-delayed-out'
4310to add the delayed byte-codes. STACK-USED is the maximum amount of
4311stack-spaced used by the delayed byte-codes (defaulting to 0), and
4312STACK-ADJUST is the amount by which the later-added code will adjust the
4313stack (defaulting to 0); the byte-codes added later _must_ adjust the
4314stack by this amount! If STACK-ADJUST is 0, then it's not necessary to
4315actually add anything later; the effect as if nothing was added at all."
4316 ;; We just add a no-op to `byte-compile-output', and return a pointer to
4317 ;; the tail of the list; `byte-compile-delayed-out' uses list surgery
4318 ;; to add the byte-codes.
4319 (when stack-used
4320 (setq byte-compile-maxdepth
4321 (max byte-compile-depth (+ byte-compile-depth (or stack-used 0)))))
4322 (when stack-adjust
4323 (setq byte-compile-depth
4324 (+ byte-compile-depth stack-adjust)))
4325 (push (cons nil (or stack-adjust 0)) byte-compile-output))
4326
4327(defun byte-compile-delayed-out (position op &optional operand)
4328 "Add at POSITION the byte-operation OP, with optional numeric arg OPERAND.
4329POSITION should a position returned by `byte-compile-delay-out'.
4330Return a new position, which can be used to add further operations."
4331 (unless (null (caar position))
4332 (error "Bad POSITION arg to `byte-compile-delayed-out'"))
4333 ;; This is kind of like `byte-compile-out', but we splice into the list
4334 ;; where POSITION is. We don't bother updating `byte-compile-maxdepth'
4335 ;; because that was already done by `byte-compile-delay-out', but we do
4336 ;; update the relative operand stored in the no-op marker currently at
4337 ;; POSITION; since we insert before that marker, this means that if the
4338 ;; caller doesn't insert a sequence of byte-codes that matches the expected
4339 ;; operand passed to `byte-compile-delay-out', then the nop will still have
4340 ;; a non-zero operand when `byte-compile-lapcode' is called, which will
4341 ;; cause an error to be signaled.
4342
4343 ;; Adjust the cumulative stack-adjustment stored in the cdr of the no-op
4344 (setcdr (car position)
4345 (- (cdar position) (byte-compile-stack-adjustment op operand)))
4346 ;; Add the new operation onto the list tail at POSITION
4347 (setcdr position (cons (cons op operand) (cdr position)))
4348 position)
1c393159
JB
4349
4350\f
4351;;; call tree stuff
4352
4353(defun byte-compile-annotate-call-tree (form)
4354 (let (entry)
4355 ;; annotate the current call
4356 (if (setq entry (assq (car form) byte-compile-call-tree))
4357 (or (memq byte-compile-current-form (nth 1 entry)) ;callers
4358 (setcar (cdr entry)
4359 (cons byte-compile-current-form (nth 1 entry))))
4360 (setq byte-compile-call-tree
4361 (cons (list (car form) (list byte-compile-current-form) nil)
4362 byte-compile-call-tree)))
4363 ;; annotate the current function
4364 (if (setq entry (assq byte-compile-current-form byte-compile-call-tree))
4365 (or (memq (car form) (nth 2 entry)) ;called
4366 (setcar (cdr (cdr entry))
4367 (cons (car form) (nth 2 entry))))
4368 (setq byte-compile-call-tree
4369 (cons (list byte-compile-current-form nil (list (car form)))
4370 byte-compile-call-tree)))
4371 ))
4372
52799cb8
RS
4373;; Renamed from byte-compile-report-call-tree
4374;; to avoid interfering with completion of byte-compile-file.
fd5285f3 4375;;;###autoload
52799cb8
RS
4376(defun display-call-tree (&optional filename)
4377 "Display a call graph of a specified file.
4378This lists which functions have been called, what functions called
4379them, and what functions they call. The list includes all functions
4380whose definitions have been compiled in this Emacs session, as well as
4381all functions called by those functions.
1c393159 4382
52799cb8
RS
4383The call graph does not include macros, inline functions, or
4384primitives that the byte-code interpreter knows about directly \(eq,
4385cons, etc.\).
1c393159
JB
4386
4387The call tree also lists those functions which are not known to be called
52799cb8
RS
4388\(that is, to which no calls have been compiled\), and which cannot be
4389invoked interactively."
1c393159
JB
4390 (interactive)
4391 (message "Generating call tree...")
4392 (with-output-to-temp-buffer "*Call-Tree*"
4393 (set-buffer "*Call-Tree*")
4394 (erase-buffer)
47cf9d3a 4395 (message "Generating call tree... (sorting on %s)"
1c393159
JB
4396 byte-compile-call-tree-sort)
4397 (insert "Call tree for "
4398 (cond ((null byte-compile-current-file) (or filename "???"))
4399 ((stringp byte-compile-current-file)
4400 byte-compile-current-file)
4401 (t (buffer-name byte-compile-current-file)))
4402 " sorted on "
4403 (prin1-to-string byte-compile-call-tree-sort)
4404 ":\n\n")
4405 (if byte-compile-call-tree-sort
4406 (setq byte-compile-call-tree
4407 (sort byte-compile-call-tree
4408 (cond ((eq byte-compile-call-tree-sort 'callers)
4409 (function (lambda (x y) (< (length (nth 1 x))
4410 (length (nth 1 y))))))
4411 ((eq byte-compile-call-tree-sort 'calls)
4412 (function (lambda (x y) (< (length (nth 2 x))
4413 (length (nth 2 y))))))
4414 ((eq byte-compile-call-tree-sort 'calls+callers)
4415 (function (lambda (x y) (< (+ (length (nth 1 x))
4416 (length (nth 2 x)))
4417 (+ (length (nth 1 y))
4418 (length (nth 2 y)))))))
4419 ((eq byte-compile-call-tree-sort 'name)
4420 (function (lambda (x y) (string< (car x)
4421 (car y)))))
52799cb8 4422 (t (error "`byte-compile-call-tree-sort': `%s' - unknown sort mode"
1c393159
JB
4423 byte-compile-call-tree-sort))))))
4424 (message "Generating call tree...")
4425 (let ((rest byte-compile-call-tree)
4426 (b (current-buffer))
4427 f p
4428 callers calls)
4429 (while rest
4430 (prin1 (car (car rest)) b)
4431 (setq callers (nth 1 (car rest))
4432 calls (nth 2 (car rest)))
4433 (insert "\t"
4434 (cond ((not (fboundp (setq f (car (car rest)))))
4435 (if (null f)
4436 " <top level>";; shouldn't insert nil then, actually -sk
4437 " <not defined>"))
4438 ((subrp (setq f (symbol-function f)))
4439 " <subr>")
4440 ((symbolp f)
4441 (format " ==> %s" f))
ed015bdd 4442 ((byte-code-function-p f)
1c393159
JB
4443 "<compiled function>")
4444 ((not (consp f))
4445 "<malformed function>")
4446 ((eq 'macro (car f))
ed015bdd 4447 (if (or (byte-code-function-p (cdr f))
1c393159
JB
4448 (assq 'byte-code (cdr (cdr (cdr f)))))
4449 " <compiled macro>"
4450 " <macro>"))
4451 ((assq 'byte-code (cdr (cdr f)))
4452 "<compiled lambda>")
4453 ((eq 'lambda (car f))
4454 "<function>")
4455 (t "???"))
4456 (format " (%d callers + %d calls = %d)"
4457 ;; Does the optimizer eliminate common subexpressions?-sk
4458 (length callers)
4459 (length calls)
4460 (+ (length callers) (length calls)))
4461 "\n")
4462 (if callers
4463 (progn
4464 (insert " called by:\n")
4465 (setq p (point))
4466 (insert " " (if (car callers)
4467 (mapconcat 'symbol-name callers ", ")
4468 "<top level>"))
4469 (let ((fill-prefix " "))
78bba1c8
TTN
4470 (fill-region-as-paragraph p (point)))
4471 (unless (= 0 (current-column))
4472 (insert "\n"))))
1c393159
JB
4473 (if calls
4474 (progn
4475 (insert " calls:\n")
4476 (setq p (point))
4477 (insert " " (mapconcat 'symbol-name calls ", "))
4478 (let ((fill-prefix " "))
78bba1c8
TTN
4479 (fill-region-as-paragraph p (point)))
4480 (unless (= 0 (current-column))
4481 (insert "\n"))))
1c393159
JB
4482 (setq rest (cdr rest)))
4483
4484 (message "Generating call tree...(finding uncalled functions...)")
4485 (setq rest byte-compile-call-tree)
416d3588 4486 (let (uncalled def)
1c393159
JB
4487 (while rest
4488 (or (nth 1 (car rest))
416d3588
GM
4489 (null (setq f (caar rest)))
4490 (progn
4491 (setq def (byte-compile-fdefinition f t))
4492 (and (eq (car-safe def) 'macro)
4493 (eq (car-safe (cdr-safe def)) 'lambda)
4494 (setq def (cdr def)))
4495 (functionp def))
4496 (progn
4497 (setq def (byte-compile-fdefinition f nil))
4498 (and (eq (car-safe def) 'macro)
4499 (eq (car-safe (cdr-safe def)) 'lambda)
4500 (setq def (cdr def)))
4501 (commandp def))
1c393159
JB
4502 (setq uncalled (cons f uncalled)))
4503 (setq rest (cdr rest)))
4504 (if uncalled
4505 (let ((fill-prefix " "))
4506 (insert "Noninteractive functions not known to be called:\n ")
4507 (setq p (point))
4508 (insert (mapconcat 'symbol-name (nreverse uncalled) ", "))
416d3588
GM
4509 (fill-region-as-paragraph p (point))))))
4510 (message "Generating call tree...done.")))
1c393159
JB
4511
4512\f
814c447f 4513;;;###autoload
7e7d0f8b
RS
4514(defun batch-byte-compile-if-not-done ()
4515 "Like `byte-compile-file' but doesn't recompile if already up to date.
4516Use this from the command line, with `-batch';
4517it won't work in an interactive Emacs."
4518 (batch-byte-compile t))
4519
1c393159
JB
4520;;; by crl@newton.purdue.edu
4521;;; Only works noninteractively.
fd5285f3 4522;;;###autoload
7e7d0f8b 4523(defun batch-byte-compile (&optional noforce)
52799cb8
RS
4524 "Run `byte-compile-file' on the files remaining on the command line.
4525Use this from the command line, with `-batch';
4526it won't work in an interactive Emacs.
4527Each file is processed even if an error occurred previously.
7e7d0f8b
RS
4528For example, invoke \"emacs -batch -f batch-byte-compile $emacs/ ~/*.el\".
4529If NOFORCE is non-nil, don't recompile a file that seems to be
4530already up-to-date."
1c393159
JB
4531 ;; command-line-args-left is what is left of the command line (from startup.el)
4532 (defvar command-line-args-left) ;Avoid 'free variable' warning
4533 (if (not noninteractive)
52799cb8 4534 (error "`batch-byte-compile' is to be used only with -batch"))
c2768569 4535 (let ((bytecomp-error nil))
1c393159
JB
4536 (while command-line-args-left
4537 (if (file-directory-p (expand-file-name (car command-line-args-left)))
7e7d0f8b 4538 ;; Directory as argument.
1c3b663f
GM
4539 (let ((bytecomp-files (directory-files (car command-line-args-left)))
4540 bytecomp-source bytecomp-dest)
4541 (dolist (bytecomp-file bytecomp-files)
4542 (if (and (string-match emacs-lisp-file-regexp bytecomp-file)
4543 (not (auto-save-file-name-p bytecomp-file))
4544 (setq bytecomp-source
4545 (expand-file-name bytecomp-file
4546 (car command-line-args-left)))
4547 (setq bytecomp-dest (byte-compile-dest-file
4548 bytecomp-source))
4549 (file-exists-p bytecomp-dest)
4550 (file-newer-than-file-p bytecomp-source bytecomp-dest))
4551 (if (null (batch-byte-compile-file bytecomp-source))
c2768569 4552 (setq bytecomp-error t)))))
7e7d0f8b
RS
4553 ;; Specific file argument
4554 (if (or (not noforce)
1c3b663f
GM
4555 (let* ((bytecomp-source (car command-line-args-left))
4556 (bytecomp-dest (byte-compile-dest-file bytecomp-source)))
4557 (or (not (file-exists-p bytecomp-dest))
4558 (file-newer-than-file-p bytecomp-source bytecomp-dest))))
7e7d0f8b 4559 (if (null (batch-byte-compile-file (car command-line-args-left)))
c2768569 4560 (setq bytecomp-error t))))
1c393159 4561 (setq command-line-args-left (cdr command-line-args-left)))
c2768569 4562 (kill-emacs (if bytecomp-error 1 0))))
1c393159 4563
1c3b663f 4564(defun batch-byte-compile-file (bytecomp-file)
6b61353c 4565 (if debug-on-error
1c3b663f 4566 (byte-compile-file bytecomp-file)
6b61353c 4567 (condition-case err
1c3b663f 4568 (byte-compile-file bytecomp-file)
6b61353c
KH
4569 (file-error
4570 (message (if (cdr err)
4571 ">>Error occurred processing %s: %s (%s)"
d09b1c02 4572 ">>Error occurred processing %s: %s")
1c3b663f 4573 bytecomp-file
6b61353c
KH
4574 (get (car err) 'error-message)
4575 (prin1-to-string (cdr err)))
1c3b663f
GM
4576 (let ((bytecomp-destfile (byte-compile-dest-file bytecomp-file)))
4577 (if (file-exists-p bytecomp-destfile)
4578 (delete-file bytecomp-destfile)))
6b61353c
KH
4579 nil)
4580 (error
4581 (message (if (cdr err)
4582 ">>Error occurred processing %s: %s (%s)"
1c393159 4583 ">>Error occurred processing %s: %s")
1c3b663f 4584 bytecomp-file
6b61353c
KH
4585 (get (car err) 'error-message)
4586 (prin1-to-string (cdr err)))
4587 nil))))
1c393159 4588
49fec531
SM
4589(defun byte-compile-refresh-preloaded ()
4590 "Reload any Lisp file that was changed since Emacs was dumped.
4591Use with caution."
4592 (let* ((argv0 (car command-line-args))
4593 (emacs-file (executable-find argv0)))
4594 (if (not (and emacs-file (file-executable-p emacs-file)))
4595 (message "Can't find %s to refresh preloaded Lisp files" argv0)
4596 (dolist (f (reverse load-history))
4597 (setq f (car f))
4598 (if (string-match "elc\\'" f) (setq f (substring f 0 -1)))
4599 (when (and (file-readable-p f)
d032d5e7
SM
4600 (file-newer-than-file-p f emacs-file)
4601 ;; Don't reload the source version of the files below
4602 ;; because that causes subsequent byte-compilation to
4603 ;; be a lot slower and need a higher max-lisp-eval-depth,
4604 ;; so it can cause recompilation to fail.
4605 (not (member (file-name-nondirectory f)
4606 '("pcase.el" "bytecomp.el" "macroexp.el"
4607 "cconv.el" "byte-opt.el"))))
49fec531
SM
4608 (message "Reloading stale %s" (file-name-nondirectory f))
4609 (condition-case nil
4610 (load f 'noerror nil 'nosuffix)
4611 ;; Probably shouldn't happen, but in case of an error, it seems
4612 ;; at least as useful to ignore it as it is to stop compilation.
4613 (error nil)))))))
4614
e9681c45 4615;;;###autoload
6f8e3590 4616(defun batch-byte-recompile-directory (&optional arg)
4f6d5bf0 4617 "Run `byte-recompile-directory' on the dirs remaining on the command line.
79c6071d 4618Must be used only with `-batch', and kills Emacs on completion.
defe3b41
EZ
4619For example, invoke `emacs -batch -f batch-byte-recompile-directory .'.
4620
4621Optional argument ARG is passed as second argument ARG to
516b3653 4622`byte-recompile-directory'; see there for its possible values
defe3b41 4623and corresponding effects."
e27c3564
JB
4624 ;; command-line-args-left is what is left of the command line (startup.el)
4625 (defvar command-line-args-left) ;Avoid 'free variable' warning
4626 (if (not noninteractive)
4627 (error "batch-byte-recompile-directory is to be used only with -batch"))
4628 (or command-line-args-left
4629 (setq command-line-args-left '(".")))
4630 (while command-line-args-left
6f8e3590 4631 (byte-recompile-directory (car command-line-args-left) arg)
e27c3564
JB
4632 (setq command-line-args-left (cdr command-line-args-left)))
4633 (kill-emacs 0))
4634
1c393159 4635(provide 'byte-compile)
200503bb 4636(provide 'bytecomp)
1c393159
JB
4637
4638\f
4639;;; report metering (see the hacks in bytecode.c)
4640
08d21785 4641(defvar byte-code-meter)
52799cb8 4642(defun byte-compile-report-ops ()
5a972c36
GM
4643 (or (boundp 'byte-metering-on)
4644 (error "You must build Emacs with -DBYTE_CODE_METER to use this"))
52799cb8
RS
4645 (with-output-to-temp-buffer "*Meter*"
4646 (set-buffer "*Meter*")
4647 (let ((i 0) n op off)
4648 (while (< i 256)
4649 (setq n (aref (aref byte-code-meter 0) i)
4650 off nil)
4651 (if t ;(not (zerop n))
4652 (progn
4653 (setq op i)
4654 (setq off nil)
4655 (cond ((< op byte-nth)
4656 (setq off (logand op 7))
4657 (setq op (logand op 248)))
4658 ((>= op byte-constant)
4659 (setq off (- op byte-constant)
4660 op byte-constant)))
4661 (setq op (aref byte-code-vector op))
4662 (insert (format "%-4d" i))
4663 (insert (symbol-name op))
4664 (if off (insert " [" (int-to-string off) "]"))
4665 (indent-to 40)
4666 (insert (int-to-string n) "\n")))
4667 (setq i (1+ i))))))
1c393159
JB
4668\f
4669;; To avoid "lisp nesting exceeds max-lisp-eval-depth" when bytecomp compiles
4670;; itself, compile some of its most used recursive functions (at load time).
4671;;
4672(eval-when-compile
591655c7
SM
4673 (or (byte-code-function-p (symbol-function 'byte-compile-form))
4674 (assq 'byte-code (symbol-function 'byte-compile-form))
4675 (let ((byte-optimize nil) ; do it fast
4676 (byte-compile-warnings nil))
86da2828
GM
4677 (mapc (lambda (x)
4678 (or noninteractive (message "compiling %s..." x))
4679 (byte-compile x)
4680 (or noninteractive (message "compiling %s...done" x)))
4681 '(byte-compile-normal-call
4682 byte-compile-form
4683 byte-compile-body
4684 ;; Inserted some more than necessary, to speed it up.
4685 byte-compile-top-level
4686 byte-compile-out-toplevel
4687 byte-compile-constant
4688 byte-compile-variable-ref))))
591655c7 4689 nil)
fd5285f3 4690
3433c43f
DL
4691(run-hooks 'bytecomp-load-hook)
4692
fd5285f3 4693;;; bytecomp.el ends here