428
|
1 ;;; bytecomp-runtime.el --- byte-compiler support for inlining
|
|
2
|
|
3 ;; Copyright (C) 1992, 1997 Free Software Foundation, Inc.
|
771
|
4 ;; Copyright (C) 2002 Ben Wing.
|
428
|
5
|
|
6 ;; Author: Jamie Zawinski <jwz@jwz.org>
|
|
7 ;; Author: Hallvard Furuseth <hbf@ulrik.uio.no>
|
|
8 ;; Maintainer: XEmacs Development Team
|
|
9 ;; Keywords: internal, dumped
|
|
10
|
|
11 ;; This file is part of XEmacs.
|
|
12
|
|
13 ;; XEmacs is free software; you can redistribute it and/or modify it
|
|
14 ;; under the terms of the GNU General Public License as published by
|
|
15 ;; the Free Software Foundation; either version 2, or (at your option)
|
|
16 ;; any later version.
|
|
17
|
|
18 ;; XEmacs is distributed in the hope that it will be useful, but
|
|
19 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
21 ;; General Public License for more details.
|
|
22
|
|
23 ;; You should have received a copy of the GNU General Public License
|
|
24 ;; along with XEmacs; see the file COPYING. If not, write to the
|
|
25 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
26 ;; Boston, MA 02111-1307, USA.
|
|
27
|
|
28 ;;; Synched up with: FSF 19.30.
|
|
29
|
|
30 ;;; Commentary:
|
|
31
|
|
32 ;; This file is dumped with XEmacs.
|
|
33
|
|
34 ;; The code in this file should always be loaded, because it defines things
|
|
35 ;; like "defsubst" which should work interpreted as well. The code in
|
|
36 ;; bytecomp.el and byte-optimize.el can be loaded as needed.
|
|
37
|
|
38 ;; interface to selectively inlining functions.
|
|
39 ;; This only happens when source-code optimization is turned on.
|
|
40
|
|
41 ;;; Code:
|
|
42
|
|
43 ;; Redefined in byte-optimize.el.
|
|
44 ;; This is not documented--it's not clear that we should promote it.
|
|
45 (fset 'inline 'progn)
|
|
46 (put 'inline 'lisp-indent-hook 0)
|
|
47
|
|
48
|
|
49 ;;; Interface to inline functions.
|
|
50
|
|
51 ;; FSF comments the next two out, but I see no reason to do so. --ben
|
|
52 (defmacro proclaim-inline (&rest fns)
|
|
53 "Cause the named functions to be open-coded when called from compiled code.
|
|
54 They will only be compiled open-coded when `byte-optimize' is true."
|
|
55 (cons 'eval-and-compile
|
|
56 (apply
|
|
57 'nconc
|
|
58 (mapcar
|
|
59 #'(lambda (x)
|
|
60 `((or (memq (get ',x 'byte-optimizer)
|
|
61 '(nil byte-compile-inline-expand))
|
|
62 (error
|
|
63 "%s already has a byte-optimizer, can't make it inline"
|
|
64 ',x))
|
|
65 (put ',x 'byte-optimizer 'byte-compile-inline-expand)))
|
|
66 fns))))
|
|
67
|
|
68
|
|
69 (defmacro proclaim-notinline (&rest fns)
|
|
70 "Cause the named functions to no longer be open-coded."
|
|
71 (cons 'eval-and-compile
|
|
72 (apply
|
|
73 'nconc
|
|
74 (mapcar
|
|
75 #'(lambda (x)
|
|
76 `((if (eq (get ',x 'byte-optimizer)
|
|
77 'byte-compile-inline-expand)
|
|
78 (put ',x 'byte-optimizer nil))))
|
|
79 fns))))
|
|
80
|
|
81 ;; This has a special byte-hunk-handler in bytecomp.el.
|
|
82 (defmacro defsubst (name arglist &rest body)
|
|
83 "Define an inline function. The syntax is just like that of `defun'."
|
|
84 (or (memq (get name 'byte-optimizer)
|
|
85 '(nil byte-compile-inline-expand))
|
|
86 (error "`%s' is a primitive" name))
|
|
87 (list 'prog1
|
|
88 (cons 'defun (cons name (cons arglist body)))
|
|
89 (list 'proclaim-inline name)))
|
|
90 ; Instead of the above line, FSF has this:
|
|
91 ; (list 'eval-and-compile
|
|
92 ; (list 'put (list 'quote name)
|
|
93 ; ''byte-optimizer ''byte-compile-inline-expand))))
|
|
94
|
|
95 (defun make-obsolete (fn new)
|
|
96 "Make the byte-compiler warn that FUNCTION is obsolete.
|
|
97 The warning will say that NEW should be used instead.
|
|
98 If NEW is a string, that is the `use instead' message."
|
|
99 (interactive "aMake function obsolete: \nxObsoletion replacement: ")
|
|
100 (let ((handler (get fn 'byte-compile)))
|
|
101 (if (eq 'byte-compile-obsolete handler)
|
|
102 (setcar (get fn 'byte-obsolete-info) new)
|
|
103 (put fn 'byte-obsolete-info (cons new handler))
|
|
104 (put fn 'byte-compile 'byte-compile-obsolete)))
|
|
105 fn)
|
|
106
|
|
107 (defun make-obsolete-variable (var new)
|
|
108 "Make the byte-compiler warn that VARIABLE is obsolete,
|
|
109 and NEW should be used instead. If NEW is a string, then that is the
|
|
110 `use instead' message."
|
|
111 (interactive
|
|
112 (list
|
|
113 (let ((str (completing-read "Make variable obsolete: " obarray 'boundp t)))
|
|
114 (if (equal str "") (error ""))
|
|
115 (intern str))
|
|
116 (car (read-from-string (read-string "Obsoletion replacement: ")))))
|
|
117 (put var 'byte-obsolete-variable new)
|
|
118 var)
|
|
119
|
|
120 ;; By overwhelming demand, we separate out truly obsolete symbols from
|
|
121 ;; those that are present for GNU Emacs compatibility.
|
|
122 (defun make-compatible (fn new)
|
|
123 "Make the byte-compiler know that FUNCTION is provided for compatibility.
|
|
124 The warning will say that NEW should be used instead.
|
|
125 If NEW is a string, that is the `use instead' message."
|
|
126 (interactive "aMake function compatible: \nxCompatible replacement: ")
|
|
127 (let ((handler (get fn 'byte-compile)))
|
|
128 (if (eq 'byte-compile-compatible handler)
|
|
129 (setcar (get fn 'byte-compatible-info) new)
|
|
130 (put fn 'byte-compatible-info (cons new handler))
|
|
131 (put fn 'byte-compile 'byte-compile-compatible)))
|
|
132 fn)
|
|
133
|
|
134 (defun make-compatible-variable (var new)
|
|
135 "Make the byte-compiler know that VARIABLE is provided for compatibility.
|
|
136 and NEW should be used instead. If NEW is a string, then that is the
|
|
137 `use instead' message."
|
|
138 (interactive
|
|
139 (list
|
|
140 (let ((str (completing-read "Make variable compatible: "
|
|
141 obarray 'boundp t)))
|
|
142 (if (equal str "") (error ""))
|
|
143 (intern str))
|
|
144 (car (read-from-string (read-string "Compatible replacement: ")))))
|
|
145 (put var 'byte-compatible-variable new)
|
|
146 var)
|
|
147
|
|
148 (put 'dont-compile 'lisp-indent-hook 0)
|
|
149 (defmacro dont-compile (&rest body)
|
|
150 "Like `progn', but the body always runs interpreted (not compiled).
|
|
151 If you think you need this, you're probably making a mistake somewhere."
|
|
152 (list 'eval (list 'quote (if (cdr body) (cons 'progn body) (car body)))))
|
|
153
|
|
154
|
|
155 ;;; interface to evaluating things at compile time and/or load time
|
|
156 ;;; these macro must come after any uses of them in this file, as their
|
|
157 ;;; definition in the file overrides the magic definitions on the
|
|
158 ;;; byte-compile-macro-environment.
|
|
159
|
|
160 (put 'eval-when-compile 'lisp-indent-hook 0)
|
|
161 (defmacro eval-when-compile (&rest body)
|
|
162 "Like `progn', but evaluates the body at compile time.
|
|
163 The result of the body appears to the compiler as a quoted constant."
|
|
164 ;; Not necessary because we have it in b-c-initial-macro-environment
|
|
165 ;; (list 'quote (eval (cons 'progn body)))
|
|
166 (cons 'progn body))
|
|
167
|
|
168 (put 'eval-and-compile 'lisp-indent-hook 0)
|
|
169 (defmacro eval-and-compile (&rest body)
|
|
170 "Like `progn', but evaluates the body at compile time and at load time."
|
|
171 ;; Remember, it's magic.
|
|
172 (cons 'progn body))
|
|
173
|
|
174 ;;; From Emacs 20.
|
|
175 (put 'eval-when-feature 'lisp-indent-hook 1)
|
|
176 (defmacro eval-when-feature (feature &rest body)
|
|
177 "Run the body forms when FEATURE is featurep, be it now or later.
|
|
178 Called (eval-when-feature (FEATURE [. FILENAME]) BODYFORMS...).
|
|
179 If (featurep 'FEATURE), evals now; otherwise adds an elt to
|
|
180 `after-load-alist' (which see), using FEATURE as filename if FILENAME is nil."
|
|
181 (let ((file (or (cdr feature) (symbol-name (car feature)))))
|
|
182 `(let ((bodythunk #'(lambda () ,@body)))
|
|
183 (if (featurep ',(car feature))
|
|
184 (funcall bodythunk)
|
|
185 (setq after-load-alist (cons '(,file . (list 'lambda '() bodythunk))
|
|
186 after-load-alist))))))
|
502
|
187
|
|
188
|
|
189
|
|
190 ;;; Functions to cleanly eliminate warnings about undefined functions
|
|
191 ;;; or variables when the code knows what it's doing. These macros DO
|
|
192 ;;; NOT rely on any byte-compiler changes, and thus can be copied into
|
|
193 ;;; a package and used within it.
|
|
194
|
|
195 ;; NOTE: As a result of the above requirement, the macros rely on
|
|
196 ;; "tricks" to get the warnings suppressed. A cleaner way, of course,
|
|
197 ;; would be to extend the byte compiler to provide a proper interface.
|
|
198
|
|
199 ;; #### Should we require an unquoted symbol rather than a quoted one,
|
|
200 ;; as we currently do? The quoting gets no generality, as `eval' is
|
|
201 ;; called at compile time. But most functions and macros want quoted
|
|
202 ;; arguments, and I find it extremely confusing to deal with cases
|
|
203 ;; such as `throw' requiring a quoted argument but `block' an unquoted
|
|
204 ;; one.
|
|
205
|
|
206 (put 'with-boundp 'lisp-indent-function 1)
|
771
|
207 (defmacro with-boundp (variables &rest body)
|
|
208 "Evaluate BODY, but do not issue bytecomp warnings about VARIABLES undefined.
|
|
209 VARIABLES can be a symbol or a list of symbols and must be quoted. When
|
|
210 compiling this file, the warnings `reference to free variable VARIABLE' and
|
|
211 `assignment to free variable VARIABLE' will not occur anywhere in BODY, for
|
|
212 any of the listed variables. This is a clean way to avoid such warnings.
|
776
|
213
|
|
214 See also `if-boundp', `when-boundp', and `and-boundp' (ways to
|
|
215 conditionalize on a variable being bound and avoid warnings),
|
|
216 `declare-boundp' (issue a variable call without warnings), and
|
|
217 `globally-declare-boundp' (avoid warnings throughout a file about a
|
|
218 variable)."
|
771
|
219 (setq variables (eval variables))
|
|
220 (unless (consp variables)
|
|
221 (setq variables (list variables)))
|
502
|
222 `(progn
|
771
|
223 (declare (special ,@variables))
|
502
|
224 ,@body))
|
|
225
|
|
226 (put 'if-boundp 'lisp-indent-function 2)
|
771
|
227 (defmacro if-boundp (variable then &rest else)
|
|
228 "Equivalent to (if (boundp VARIABLE) THEN ELSE) but handles bytecomp warnings.
|
|
229 VARIABLE should be a quoted symbol. When compiling this file, the warnings
|
|
230 `reference to free variable VARIABLE' and `assignment to free variable
|
|
231 VARIABLE' will not occur anywhere in the if-statement. This is a clean way
|
776
|
232 to avoid such warnings. See also `with-boundp' and friends."
|
771
|
233 `(with-boundp ,variable
|
|
234 (if (boundp ,variable) ,then ,@else)))
|
502
|
235
|
771
|
236 (put 'when-boundp 'lisp-indent-function 1)
|
|
237 (defmacro when-boundp (variable &rest body)
|
|
238 "Equivalent to (when (boundp VARIABLE) BODY) but handles bytecomp warnings.
|
|
239 VARIABLE should be a quoted symbol. When compiling this file, the warnings
|
|
240 `reference to free variable VARIABLE' and `assignment to free variable
|
|
241 VARIABLE' will not occur anywhere in the when-statement. This is a clean
|
776
|
242 way to avoid such warnings. See also `with-boundp' and friends."
|
771
|
243 `(with-boundp ,variable
|
|
244 (when (boundp ,variable) ,@body)))
|
|
245
|
776
|
246 (put 'and-boundp 'lisp-indent-function 1)
|
|
247 (defmacro and-boundp (variable &rest args)
|
|
248 "Equivalent to (and (boundp VARIABLE) ARGS) but handles bytecomp warnings.
|
|
249 VARIABLE should be a quoted symbol. When compiling this file, the warnings
|
|
250 `reference to free variable VARIABLE' and `assignment to free variable
|
|
251 VARIABLE' will not occur anywhere in the and-statement. This is a clean
|
|
252 way to avoid such warnings. See also `with-boundp' and friends."
|
|
253 `(with-boundp ,variable
|
|
254 (and (boundp ,variable) ,@args)))
|
|
255
|
771
|
256 (defmacro declare-boundp (variable)
|
|
257 "Evaluate VARIABLE without bytecomp warnings about the symbol.
|
|
258
|
502
|
259 Sample usage is
|
|
260
|
|
261 (declare-boundp gpm-minor-mode)
|
|
262
|
|
263 which is equivalent to
|
|
264
|
771
|
265 (with-boundp 'gpm-minor-mode
|
776
|
266 gpm-minor-mode)
|
|
267
|
|
268 See also `with-boundp' and friends."
|
771
|
269 `(with-boundp ',variable ,variable))
|
502
|
270
|
771
|
271 (defmacro globally-declare-boundp (variables)
|
|
272 "Declare that all free uses of VARIABLES in this file are valid.
|
|
273 VARIABLES can be a symbol or a list of symbols and must be quoted.
|
502
|
274
|
771
|
275 When compiling this file, the warnings `reference to free variable
|
|
276 VARIABLE' and `assignment to free variable VARIABLE' will not occur
|
|
277 regardless of where references to VARIABLE occur in the file.
|
502
|
278
|
776
|
279 In general, you should *NOT* use this; use `with-boundp' or its friends to
|
|
280 wrap individual uses, as necessary. That way, you're more likely to
|
|
281 remember to put in the explicit checks for the variable's existence that
|
|
282 are usually necessary. However, `globally-declare-boundp' is better in
|
|
283 some circumstances, such as when writing an ELisp package that makes
|
|
284 integral use of optionally-compiled-in functionality (typically, an
|
|
285 interface onto a system library) and checks for the existence of the
|
|
286 functionality at some entry point to the package. See
|
|
287 `globally-declare-fboundp' for more information."
|
771
|
288 (setq variables (eval variables))
|
|
289 (if (not (consp variables))
|
|
290 (setq variables (list variables)))
|
502
|
291 `(progn
|
|
292 ;; (defvar FOO) has no side effects.
|
771
|
293 ,@(mapcar #'(lambda (sym) `(defvar ,sym)) variables)))
|
502
|
294
|
|
295 (defun byte-compile-with-fboundp (form)
|
|
296 (byte-compile-form (cons 'progn (cdr (cdr form))))
|
|
297 ;; Unfortunately, byte-compile-unresolved-functions is used not only
|
|
298 ;; for unresolved-function warnings, but also in connection with the
|
|
299 ;; following warnings:
|
|
300
|
|
301 ;; "defsubst %s was used before it was defined"
|
|
302 ;; "%s being defined to take %s%s, but was previously called with %s"
|
|
303
|
|
304 ;; By hacking byte-compile-unresolved-functions like this, we
|
|
305 ;; effectively disable these warnings. But code should not be using
|
|
306 ;; `with-fboundp' with a function defined later on in the same
|
|
307 ;; file, so this is not a big deal.
|
|
308
|
|
309 (let ((symbols (eval (car (cdr form)))))
|
|
310 (unless (consp symbols)
|
|
311 (setq symbols (list symbols)))
|
|
312 (setq symbols (mapcar #'(lambda (sym) (cons sym nil)) symbols))
|
|
313 (setq byte-compile-unresolved-functions
|
|
314 (set-difference byte-compile-unresolved-functions symbols
|
|
315 :key #'car))
|
|
316 ))
|
|
317
|
|
318 ;; EEEEEEEEVIL hack. We need to create our own byte-compilation
|
|
319 ;; method so that the proper variables are bound while compilation
|
|
320 ;; takes place (which is when the warnings get noticed and batched
|
|
321 ;; up). What we really want to do is make `with-fboundp' a macro
|
|
322 ;; that simply `progn's its BODY; but GOD DAMN IT, macros can't have
|
|
323 ;; their own byte-compilation methods! So we make `with-fboundp' a
|
|
324 ;; macro calling `with-fboundp-1', which is cleverly aliased to
|
|
325 ;; progn. This way we can put a byte-compilation method on
|
|
326 ;; `with-fboundp-1', and when interpreting, progn will duly skip
|
|
327 ;; the first, quoted argument, i.e. the symbol name. (We could make
|
|
328 ;; `with-fboundp-1' a regular function, but then we'd have to thunk
|
|
329 ;; BODY and eval it at runtime. We could probably just do this using
|
|
330 ;; (apply 'progn BODY), but the existing method is more obviously
|
|
331 ;; guaranteed to work.)
|
|
332 ;;
|
|
333 ;; In defense, cl-macs.el does a very similar thing with
|
|
334 ;; `cl-block-wrapper'.
|
|
335
|
|
336 (put 'with-fboundp-1 'byte-compile 'byte-compile-with-fboundp)
|
|
337 (defalias 'with-fboundp-1 'progn)
|
|
338
|
|
339 (put 'with-fboundp 'lisp-indent-function 1)
|
771
|
340 (defmacro with-fboundp (functions &rest body)
|
|
341 "Evaluate BODY, but do not issue bytecomp warnings about FUNCTIONS undefined.
|
|
342 FUNCTIONS can be a symbol or a list of symbols and must be quoted. When
|
|
343 compiling this file, the warning `the function FUNCTION is not known to be
|
|
344 defined' will not occur anywhere in BODY, for any of the listed functions.
|
776
|
345 This is a clean way to avoid such warnings.
|
|
346
|
|
347 See also `if-fboundp', `when-fboundp', and `and-fboundp' (ways to
|
|
348 conditionalize on a function being bound and avoid warnings),
|
|
349 `declare-fboundp' (issue a function call without warnings), and
|
|
350 `globally-declare-fboundp' (avoid warnings throughout a file about a
|
|
351 function)."
|
771
|
352 `(with-fboundp-1 ,functions ,@body))
|
502
|
353
|
|
354 (put 'if-fboundp 'lisp-indent-function 2)
|
771
|
355 (defmacro if-fboundp (function then &rest else)
|
|
356 "Equivalent to (if (fboundp FUNCTION) THEN ELSE) but handles bytecomp warnings.
|
|
357 FUNCTION should be a quoted symbol. When compiling this file, the warning
|
|
358 `the function FUNCTION is not known to be defined' will not occur anywhere
|
|
359 in the if-statement. This is a clean way to avoid such warnings. See also
|
776
|
360 `with-fboundp' and friends."
|
771
|
361 `(with-fboundp ,function
|
|
362 (if (fboundp ,function) ,then ,@else)))
|
|
363
|
|
364 (put 'when-fboundp 'lisp-indent-function 1)
|
|
365 (defmacro when-fboundp (function &rest body)
|
|
366 "Equivalent to (when (fboundp FUNCTION) BODY) but handles bytecomp warnings.
|
|
367 FUNCTION should be a quoted symbol. When compiling this file, the warning
|
|
368 `the function FUNCTION is not known to be defined' will not occur anywhere
|
776
|
369 in the when-statement. This is a clean way to avoid such warnings. See also
|
|
370 `with-fboundp' and friends."
|
771
|
371 `(with-fboundp ,function
|
|
372 (when (fboundp ,function) ,@body)))
|
502
|
373
|
776
|
374 (put 'and-fboundp 'lisp-indent-function 1)
|
|
375 (defmacro and-fboundp (function &rest args)
|
|
376 "Equivalent to (and (fboundp FUNCTION) ARGS) but handles bytecomp warnings.
|
|
377 FUNCTION should be a quoted symbol. When compiling this file, the warning
|
|
378 `the function FUNCTION is not known to be defined' will not occur anywhere
|
|
379 in the and-statement. This is a clean way to avoid such warnings. See also
|
|
380 `with-fboundp' and friends."
|
|
381 `(with-fboundp ,function
|
|
382 (and (fboundp ,function) ,@args)))
|
|
383
|
502
|
384 (defmacro declare-fboundp (form)
|
|
385 "Execute FORM (a function call) without bytecomp warnings about the call.
|
|
386 Sample usage is
|
|
387
|
|
388 (declare-fboundp (x-keysym-on-keyboard-sans-modifiers-p 'backspace))
|
|
389
|
|
390 which is equivalent to
|
|
391
|
|
392 (with-fboundp 'x-keysym-on-keyboard-sans-modifiers-p
|
776
|
393 (x-keysym-on-keyboard-sans-modifiers-p 'backspace))
|
|
394
|
|
395 See also `with-fboundp' and friends."
|
502
|
396 `(with-fboundp ',(car form) ,form))
|
|
397
|
771
|
398 (defmacro globally-declare-fboundp (functions)
|
|
399 "Declare that all calls to function FUNCTIONS in this file are valid.
|
|
400 FUNCTIONS can be a symbol or a list of symbols and must be quoted.
|
502
|
401
|
771
|
402 When compiling this file, the warning `the function FUNCTION is not known
|
|
403 to be defined' will not occur regardless of where calls to FUNCTION occur
|
|
404 in the file.
|
502
|
405
|
776
|
406 In general, you should *NOT* use this; use `with-fboundp' or its friends to
|
|
407 wrap individual uses, as necessary. That way, you're more likely to
|
|
408 remember to put in the explicit checks for the function's existence that
|
|
409 are usually necessary. However, `globally-declare-fboundp' is better in
|
|
410 some circumstances, such as when writing an ELisp package that makes
|
|
411 integral use of optionally-compiled-in functionality (typically, an
|
|
412 interface onto a system library) and checks for the existence of the
|
|
413 functionality at some entry point to the package. The file `ldap.el' is a
|
|
414 good example: It provides a layer on top of the optional LDAP ELisp
|
|
415 primitives, makes calls to them throughout its code, and verifies the
|
|
416 presence of LDAP support at load time. Putting calls to `declare-fboundp'
|
|
417 throughout the code would be a major annoyance."
|
502
|
418 (when (cl-compiling-file)
|
771
|
419 (setq functions (eval functions))
|
|
420 (if (not (consp functions))
|
|
421 (setq functions (list functions)))
|
502
|
422 ;; Another hack. This works because the autoload environment is
|
|
423 ;; currently used ONLY to suppress warnings, and the actual
|
|
424 ;; autoload definition is not used. (NOTE: With this definition,
|
|
425 ;; we will get spurious "multiple autoloads for %s" warnings if we
|
771
|
426 ;; have an autoload later in the file for any functions in FUNCTIONS.
|
502
|
427 ;; This is not something that code should ever do, though.)
|
|
428 (setq byte-compile-autoload-environment
|
771
|
429 (append (mapcar #'(lambda (sym) (cons sym nil)) functions)
|
502
|
430 byte-compile-autoload-environment)))
|
|
431 nil)
|
|
432
|
|
433 (defun byte-compile-with-byte-compiler-warnings-suppressed (form)
|
|
434 (let ((byte-compile-warnings byte-compile-warnings)
|
|
435 (types (car (cdr form))))
|
|
436 (unless (consp types)
|
|
437 (setq types (list types)))
|
|
438 (if (eq byte-compile-warnings t)
|
|
439 (setq byte-compile-warnings byte-compile-default-warnings))
|
|
440 (setq byte-compile-warnings (set-difference byte-compile-warnings types))
|
|
441 (byte-compile-form (cons 'progn (cdr (cdr form))))))
|
|
442
|
|
443 ;; Same hack here as with `with-fboundp'.
|
|
444 (put 'with-byte-compiler-warnings-suppressed-1 'byte-compile
|
|
445 'byte-compile-with-byte-compiler-warnings-suppressed)
|
|
446 (defalias 'with-byte-compiler-warnings-suppressed-1 'progn)
|
|
447
|
|
448 (put 'with-byte-compiler-warnings-suppressed 'lisp-indent-function 1)
|
|
449 (defmacro with-byte-compiler-warnings-suppressed (type &rest body)
|
|
450 "Evaluate BODY, but do not issue bytecomp warnings TYPE.
|
|
451 TYPE should be one of `redefine', `callargs', `subr-callargs',
|
|
452 `free-vars', `unresolved', `unused-vars', `obsolete', or `pedantic',
|
|
453 or a list of one or more of these symbols. (See `byte-compile-warnings'.)
|
|
454 TYPE must be quoted.
|
|
455
|
|
456 NOTE: You should *NOT* under normal circumstances be using this!
|
|
457 There are better ways of avoiding most of these warnings. In particular:
|
|
458
|
|
459 -- use (declare (special ...)) if you are making use of
|
|
460 dynamically-scoped variables.
|
776
|
461 -- use `with-fboundp' and friends to avoid warnings about undefined functions
|
771
|
462 when you know the function actually exists.
|
776
|
463 -- use `with-boundp' and friends to avoid warnings about undefined variables
|
771
|
464 when you know the variable actually exists.
|
502
|
465 -- use `with-obsolete-variable' or `with-obsolete-function' if you
|
|
466 are purposely using such a variable or function."
|
|
467 `(with-byte-compiler-warnings-suppressed-1 ,type ,@body))
|
|
468
|
|
469 ;; #### These should be more clever. You could (e.g.) try fletting
|
|
470 ;; `byte-compile-obsolete' or temporarily removing the obsolete info
|
|
471 ;; from the symbol and putting it back with an unwind-protect. (Or
|
|
472 ;; better, modify the byte-compiler to provide a proper solution, and
|
|
473 ;; fix these macros to use it if available, or fall back on the way
|
|
474 ;; below. Remember, these definitions need to work with an unchanged
|
|
475 ;; byte compiler so that they can be copied and used in packages.)
|
|
476
|
|
477 (put 'with-obsolete-variable 'lisp-indent-function 1)
|
|
478 (defmacro with-obsolete-variable (symbol &rest body)
|
|
479 "Evaluate BODY but do not warn about usage of obsolete variable SYMBOL.
|
826
|
480 SYMBOL must be quoted and can be a list of SYMBOLS. See also
|
|
481 `with-obsolete-function'."
|
502
|
482 `(with-byte-compiler-warnings-suppressed 'obsolete ,@body))
|
|
483
|
|
484 (put 'with-obsolete-function 'lisp-indent-function 1)
|
|
485 (defmacro with-obsolete-function (symbol &rest body)
|
|
486 "Evaluate BODY but do not warn about usage of obsolete function SYMBOL.
|
826
|
487 SYMBOL must be quoted and can be a list of SYMBOLS. See also
|
|
488 `with-obsolete-variable'."
|
502
|
489 `(with-byte-compiler-warnings-suppressed 'obsolete ,@body))
|
428
|
490
|
|
491
|
|
492 ;;; Interface to file-local byte-compiler parameters.
|
|
493 ;;; Redefined in bytecomp.el.
|
|
494
|
|
495 ;;; The great RMS speaketh:
|
|
496 ;;;
|
|
497 ;;; I nuked this because it's not a good idea for users to think of
|
|
498 ;;; using it. These options are a matter of installation preference,
|
|
499 ;;; and have nothing to do with particular source files; it's a
|
|
500 ;;; mistake to suggest to users that they should associate these with
|
|
501 ;;; particular source files. There is hardly any reason to change
|
|
502 ;;; these parameters, anyway. --rms.
|
|
503 ;;;
|
|
504 ;;; But I'll leave this stuff alone. --ben
|
|
505
|
|
506 (put 'byte-compiler-options 'lisp-indent-hook 0)
|
|
507 (defmacro byte-compiler-options (&rest args)
|
|
508 "Set some compilation-parameters for this file.
|
|
509 This will affect only the file in which it appears; this does nothing when
|
|
510 evaluated, or when loaded from a .el file.
|
|
511
|
|
512 Each argument to this macro must be a list of a key and a value.
|
|
513
|
|
514 Keys: Values: Corresponding variable:
|
|
515
|
|
516 verbose t, nil byte-compile-verbose
|
|
517 optimize t, nil, source, byte byte-optimize
|
|
518 warnings list of warnings byte-compile-warnings
|
|
519 file-format emacs19, emacs20 byte-compile-emacs19-compatibility
|
|
520
|
|
521 The value specified with the `warnings' option must be a list, containing
|
|
522 some subset of the following flags:
|
|
523
|
|
524 free-vars references to variables not in the current lexical scope.
|
|
525 unused-vars references to non-global variables bound but not referenced.
|
|
526 unresolved calls to unknown functions.
|
|
527 callargs lambda calls with args that don't match the definition.
|
502
|
528 subr-callargs calls to subrs with args that don't match the definition.
|
428
|
529 redefine function cell redefined from a macro to a lambda or vice
|
|
530 versa, or redefined to take a different number of arguments.
|
502
|
531 obsolete use of an obsolete function or variable.
|
|
532 pedantic warn of use of compatible symbols.
|
428
|
533
|
|
534 If the first element if the list is `+' or `-' then the specified elements
|
|
535 are added to or removed from the current set of warnings, instead of the
|
|
536 entire set of warnings being overwritten.
|
|
537
|
|
538 For example, something like this might appear at the top of a source file:
|
|
539
|
|
540 (byte-compiler-options
|
|
541 (optimize t)
|
|
542 (warnings (- callargs)) ; Don't warn about arglist mismatch
|
|
543 (warnings (+ unused-vars)) ; Do warn about unused bindings
|
|
544 (file-format emacs19))"
|
|
545 nil)
|
|
546
|
|
547 ;;; bytecomp-runtime.el ends here
|