comparison lisp/bytecomp-runtime.el @ 502:7039e6323819

[xemacs-hg @ 2001-05-04 22:41:46 by ben] ----------------------- byte-comp warning fixes ----------------- New functions for cleanly eliminating byte-compiler warnings. Their definitions require no changes at all in bytecomp.el, meaning that any package that wants to use them and be compatible with older versions of XEmacs need only copy the code and rename the functions (i.e. prefix them with the package name). Eliminate byte-compiler warnings using the new functions in bytecomp-runtime.el. Move coding-system-put,get,category, since they're not Mule-specific and are used in prefer-coding-system. font.el was incredibly ugly. Clean it up. Avoid using defsubst for any exported functions, to avoid possible compatibility problems if we later change the internal interface. (It happened before, with face accessors, between 19.8 and 19.9). Fix tons of warnings. Clean up (new function gpm-is-supported-p eliminates duplicate code in gpm-create/delete-device-hook) and eliminate warnings. ---------- make byte-recompile-directory work in the --------- core `lisp' dir, even in the absence of a Mule XEmacs (i.e. make it skip the Mule files rather than trying to compile them). now you should be able to do `touch *.el' in the `lisp' dir, then M-x byte-recompile-directory, and get no warnings. Avoid trying to compile Mule files in byte-recompile-directory when we're not in a Mule XEmacs, since we're highly likely to get syntax errors. Add a coding-system cookie to all Mule files so that byte-recompile-directory ignores them. Magic cookie function moved to files.el from code-files.el (for use by bytecomp even in a non-coding-system XEmacs), and changed names and semantics for use by bytecomp. NOTE: IMO this is an internal function that we can change as we like (and there is absolutely no code anywhere else using the function). ---------------- GUI improvements: menus, help ------------------- Rearrange order of keymap declarations to be alphabetical. Improve help on help to include all bindings, and group by category. Add bindings for new Info commands. Remove warnings. Use command-hyper-apropos in place of command-apropos. Add a function to do the equivalent of command-apropos. Evals its help-text argument so you can put expressions there. Used now by help-for-help. Add binding to continue text searches. Expand index searches to work over multiple info documents. Add commands to search text/index in User and Lispref. Add new entry, "Uncomment Region" (parallels "Comment Out Region"). Redo Help menu; add bindings for new Info commands to search the index or text of the User and Lispref manuals. Add command for mark-paragraph, activate-region. Make Edit->R accelerator be rectangle, not register (more commonly used), and put rectangle first. Fix the Edit Init File entry to never load the .elc file. Simplify the default-popup-menu. Add Cmds->Tabs menu. Use kp-left not kp_left, etc. ---------------- Miscellaneous bug fixes/cleanup ------------------- byte-compiler-options: Correct doc string. easy-menu-do-define: fix extra quote. fill-paragraph-or-region:Rewrite to be more correct -- use call-interactively so that we always get exactly the same behavior as if the functions were called directly. No need to fiddle with zmacs-region-stays, now that bogus clearing of it (2001-04-28 src/ChangeLog) is removed. Put dialog titles back in -- this time correctly. Fix various other problems with leaks and such. key-sequence-list-description: Clean up fun to always correctly canonicalize. Clean up Kinsoku comments, synch comment-region with FSF 20.7. * simple.el (region-exists-p): * simple.el (region-active-p): Add comment about which one is correct to use in menu specs. * sound.el (load-sound-file): Minor code clean up. * startup.el: * startup.el (command-line-early): * startup.el (initial-scratch-message): Comment changes. Add info about sample.init.el to splash screen. Improve initial-scratch-message and clarify purpose of Scratch buffer. Fix byte-compile warning. ------------------------ Added features ------------------------- Add new variable to control whether etags checks all parent directories for tag files. (On by default.) * hash-table.el: New file, useful utility functions. * dumped-lisp.el (preloaded-file-list): Dump hash-table.el. ------------ notable bug fix: Windows event code -------------- Get critical quit working. ------------ notable bug fix and new feature: regex code -------------- Shy groups were implemented in a horrible, half-assed way that would cause them to screw up regex searching in most cases. Fixed to work correctly. Also extended back-reference syntax past 9. Only is recognized as such if there are at least that many non-shy groups; and optionally will warn about such uses, to catch old code that might be using them differently. (Added variable to control this in search.c -- `warn-about-possibly-incompatible-back- references', on by default for the moment. Declared in lisp.h. ---------------- process/SIGIO improvements ------------------- define USE_GETADDRINFO to replace more complex conditional, and use it. the code conditionalized on this in unix_open_network_stream had *serious* problems handling errors. it's now fixed, and major amounts of duplicate code between the two versions were combined. don't disable SIGIO and other interrupts unless CONNECT_NEEDS_SLOWED_INTERRUPTS is defined -- don't penalize OS's without bugs. similarly for a freebsd bug that was affecting all OS's. * s\ultrix.h: define CONNECT_NEEDS_SLOWED_INTERRUPTS, since that's the OS mentioned as having a kernel bug. * sysdep.c (request_sigio_on_device): * sysdep.c (unrequest_sigio_on_device): fix SIGIO problems on Linux. add check for O_ASYNC in case it's defined and FASYNC isn't. add comment about other ways to do SIGIO on Linux. * callproc.c (Fold_call_process_internal): * process.c (Fstart_process_internal): Deal with the possibility that `default-directory' doesn't have terminating slash. Correct comments about vfork. ---------------- Miscellaneous bug fixes/cleanup ------------------- * callint.c (Finteractive): Add lots of documentation -- exactly what the Lisp equivalents of all the interactive specs are. * console.h (struct console): change type of quit_char to Emchar. * event-msw.c (lstream_type_create_mswindows_selectable): spacing change. Eliminate events-mod.h and combine into events.h. * emacs.c: * emacs.c (make_arg_list_1): * emacs.c (main_1): A couple of char->Extbyte changes, add a comment. * glyphs-msw.c: Correct indentation of function defns to not exceed 80 cols. Try (sort of) to fix some code that sets the colors of the progress gauge. (Commented out) * keymap.c (syms_of_keymap): use DEFSYMBOL. * process.c (read_process_output): No need to fiddle with zmacs_region_stays, now that bogus clearing of it (see below) is removed. * search.c (Freplace_match): warning fix.
author ben
date Fri, 04 May 2001 22:42:35 +0000
parents 3ecd8885ac67
children 943eaba38521
comparison
equal deleted inserted replaced
501:0a255b32b157 502:7039e6323819
181 `(let ((bodythunk #'(lambda () ,@body))) 181 `(let ((bodythunk #'(lambda () ,@body)))
182 (if (featurep ',(car feature)) 182 (if (featurep ',(car feature))
183 (funcall bodythunk) 183 (funcall bodythunk)
184 (setq after-load-alist (cons '(,file . (list 'lambda '() bodythunk)) 184 (setq after-load-alist (cons '(,file . (list 'lambda '() bodythunk))
185 after-load-alist)))))) 185 after-load-alist))))))
186 186
187
188
189 ;;; Functions to cleanly eliminate warnings about undefined functions
190 ;;; or variables when the code knows what it's doing. These macros DO
191 ;;; NOT rely on any byte-compiler changes, and thus can be copied into
192 ;;; a package and used within it.
193
194 ;; NOTE: As a result of the above requirement, the macros rely on
195 ;; "tricks" to get the warnings suppressed. A cleaner way, of course,
196 ;; would be to extend the byte compiler to provide a proper interface.
197
198 ;; #### Should we require an unquoted symbol rather than a quoted one,
199 ;; as we currently do? The quoting gets no generality, as `eval' is
200 ;; called at compile time. But most functions and macros want quoted
201 ;; arguments, and I find it extremely confusing to deal with cases
202 ;; such as `throw' requiring a quoted argument but `block' an unquoted
203 ;; one.
204
205 (put 'with-boundp 'lisp-indent-function 1)
206 (defmacro with-boundp (symbols &rest body)
207 "Evaluate BODY, but do not issue bytecomp warnings about SYMBOLS undefined.
208 SYMBOLS can be a symbol or a list of symbols and must be quoted. When
209 compiling this file, the warning `reference to free variable SYMBOL'
210 will not occur. This is a clean way to avoid such warnings. See also
211 `declare-boundp' and `if-boundp'."
212 (setq symbols (eval symbols))
213 (unless (consp symbols)
214 (setq symbols (list symbols)))
215 `(progn
216 (declare (special ,@symbols))
217 ,@body))
218
219 (put 'if-boundp 'lisp-indent-function 2)
220 (defmacro if-boundp (symbol then &rest else)
221 "Equivalent to (if (boundp SYMBOL) THEN ELSE) but handles bytecomp warnings.
222 When compiling this file, the warning `reference to free variable SYMBOL'
223 will not occur. This is a clean way to avoid such warnings. See also
224 `with-boundp' and `declare-boundp'."
225 `(with-boundp ,symbol
226 (if (boundp ,symbol) ,then ,@else)))
227
228 (defmacro declare-boundp (symbol)
229 "Evaluate SYMBOL without bytecomp warnings about the symbol.
230 Sample usage is
231
232 (declare-boundp gpm-minor-mode)
233
234 which is equivalent to
235
236 (with-fboundp 'gpm-minor-mode
237 gpm-minor-mode)"
238 `(with-boundp ',symbol ,symbol))
239
240 (defmacro globally-declare-boundp (symbol)
241 "Declare that all free uses of SYMBOL in this file are valid.
242 SYMBOL can also be a list of symbols. SYMBOL must be quoted.
243
244 When compiling this file, the warning `reference to free variable
245 SYMBOL' will not occur regardless of where calls to SYMBOL occur in
246 the file.
247
248 In general, you should *NOT* use this; use `declare-boundp',
249 `if-boundp', or `with-boundp' to wrap individual uses, as necessary.
250 That way, you're more likely to remember to put in the explicit checks
251 for the variable's existence that are usually necessary. However,
252 `globally-declare-boundp' is better in some circumstances, such as
253 when writing an ELisp package that makes integral use of
254 optionally-compiled-in functionality (typically, an interface onto a
255 system library) and checks for the existence of the functionality at
256 some entry point to the package. See `globally-declare-fboundp' for
257 more information."
258 (setq symbol (eval symbol))
259 (if (not (consp symbol))
260 (setq symbol (list symbol)))
261 `(progn
262 ;; (defvar FOO) has no side effects.
263 ,@(mapcar #'(lambda (sym) `(defvar ,sym)) symbol)))
264
265 (defun byte-compile-with-fboundp (form)
266 (byte-compile-form (cons 'progn (cdr (cdr form))))
267 ;; Unfortunately, byte-compile-unresolved-functions is used not only
268 ;; for unresolved-function warnings, but also in connection with the
269 ;; following warnings:
270
271 ;; "defsubst %s was used before it was defined"
272 ;; "%s being defined to take %s%s, but was previously called with %s"
273
274 ;; By hacking byte-compile-unresolved-functions like this, we
275 ;; effectively disable these warnings. But code should not be using
276 ;; `with-fboundp' with a function defined later on in the same
277 ;; file, so this is not a big deal.
278
279 (let ((symbols (eval (car (cdr form)))))
280 (unless (consp symbols)
281 (setq symbols (list symbols)))
282 (setq symbols (mapcar #'(lambda (sym) (cons sym nil)) symbols))
283 (setq byte-compile-unresolved-functions
284 (set-difference byte-compile-unresolved-functions symbols
285 :key #'car))
286 ))
287
288 ;; EEEEEEEEVIL hack. We need to create our own byte-compilation
289 ;; method so that the proper variables are bound while compilation
290 ;; takes place (which is when the warnings get noticed and batched
291 ;; up). What we really want to do is make `with-fboundp' a macro
292 ;; that simply `progn's its BODY; but GOD DAMN IT, macros can't have
293 ;; their own byte-compilation methods! So we make `with-fboundp' a
294 ;; macro calling `with-fboundp-1', which is cleverly aliased to
295 ;; progn. This way we can put a byte-compilation method on
296 ;; `with-fboundp-1', and when interpreting, progn will duly skip
297 ;; the first, quoted argument, i.e. the symbol name. (We could make
298 ;; `with-fboundp-1' a regular function, but then we'd have to thunk
299 ;; BODY and eval it at runtime. We could probably just do this using
300 ;; (apply 'progn BODY), but the existing method is more obviously
301 ;; guaranteed to work.)
302 ;;
303 ;; In defense, cl-macs.el does a very similar thing with
304 ;; `cl-block-wrapper'.
305
306 (put 'with-fboundp-1 'byte-compile 'byte-compile-with-fboundp)
307 (defalias 'with-fboundp-1 'progn)
308
309 (put 'with-fboundp 'lisp-indent-function 1)
310 (defmacro with-fboundp (symbol &rest body)
311 "Evaluate BODY, but do not issue bytecomp warnings about SYMBOL.
312 SYMBOL must be quoted. When compiling this file, the warning `the
313 function SYMBOL is not known to be defined' will not occur. This is a
314 clean way to avoid such warnings. See also `declare-fboundp',
315 `if-fboundp', and `globally-declare-fboundp'."
316 `(with-fboundp-1 ,symbol ,@body))
317
318 (put 'if-fboundp 'lisp-indent-function 2)
319 (defmacro if-fboundp (symbol then &rest else)
320 "Equivalent to (if (fboundp SYMBOL) THEN ELSE) but handles bytecomp warnings.
321 When compiling this file, the warning `the function SYMBOL is not
322 known to be defined' will not occur. This is a clean way to avoid
323 such warnings. See also `declare-fboundp', `with-fboundp', and
324 `globally-declare-fboundp'."
325 `(with-fboundp ,symbol
326 (if (fboundp ,symbol) ,then ,@else)))
327
328 (defmacro declare-fboundp (form)
329 "Execute FORM (a function call) without bytecomp warnings about the call.
330 Sample usage is
331
332 (declare-fboundp (x-keysym-on-keyboard-sans-modifiers-p 'backspace))
333
334 which is equivalent to
335
336 (with-fboundp 'x-keysym-on-keyboard-sans-modifiers-p
337 (x-keysym-on-keyboard-sans-modifiers-p 'backspace))"
338 `(with-fboundp ',(car form) ,form))
339
340 (defmacro globally-declare-fboundp (symbol)
341 "Declare that all calls to function SYMBOL in this file are valid.
342 SYMBOL can also be a list of symbols. SYMBOL must be quoted.
343
344 When compiling this file, the warning `the function SYMBOL is not
345 known to be defined' will not occur regardless of where calls to
346 SYMBOL occur in the file.
347
348 In general, you should *NOT* use this; use `declare-fboundp',
349 `if-fboundp', or `with-fboundp' to wrap individual uses, as necessary.
350 That way, you're more likely to remember to put in the explicit checks
351 for the function's existence that are usually necessary. However,
352 `globally-declare-fboundp' is better in some circumstances, such as
353 when writing an ELisp package that makes integral use of
354 optionally-compiled-in functionality (typically, an interface onto a
355 system library) and checks for the existence of the functionality at
356 some entry point to the package. The file `ldap.el' is a good
357 example: It provides a layer on top of the optional LDAP ELisp
358 primitives, makes calls to them throughout its code, and verifies the
359 presence of LDAP support at load time. Putting calls to
360 `declare-fboundp' throughout the code would be a major annoyance."
361 (when (cl-compiling-file)
362 (setq symbol (eval symbol))
363 (if (not (consp symbol))
364 (setq symbol (list symbol)))
365 ;; Another hack. This works because the autoload environment is
366 ;; currently used ONLY to suppress warnings, and the actual
367 ;; autoload definition is not used. (NOTE: With this definition,
368 ;; we will get spurious "multiple autoloads for %s" warnings if we
369 ;; have an autoload later in the file for any functions in SYMBOL.
370 ;; This is not something that code should ever do, though.)
371 (setq byte-compile-autoload-environment
372 (append (mapcar #'(lambda (sym) (cons sym nil)) symbol)
373 byte-compile-autoload-environment)))
374 nil)
375
376 (defun byte-compile-with-byte-compiler-warnings-suppressed (form)
377 (let ((byte-compile-warnings byte-compile-warnings)
378 (types (car (cdr form))))
379 (unless (consp types)
380 (setq types (list types)))
381 (if (eq byte-compile-warnings t)
382 (setq byte-compile-warnings byte-compile-default-warnings))
383 (setq byte-compile-warnings (set-difference byte-compile-warnings types))
384 (byte-compile-form (cons 'progn (cdr (cdr form))))))
385
386 ;; Same hack here as with `with-fboundp'.
387 (put 'with-byte-compiler-warnings-suppressed-1 'byte-compile
388 'byte-compile-with-byte-compiler-warnings-suppressed)
389 (defalias 'with-byte-compiler-warnings-suppressed-1 'progn)
390
391 (put 'with-byte-compiler-warnings-suppressed 'lisp-indent-function 1)
392 (defmacro with-byte-compiler-warnings-suppressed (type &rest body)
393 "Evaluate BODY, but do not issue bytecomp warnings TYPE.
394 TYPE should be one of `redefine', `callargs', `subr-callargs',
395 `free-vars', `unresolved', `unused-vars', `obsolete', or `pedantic',
396 or a list of one or more of these symbols. (See `byte-compile-warnings'.)
397 TYPE must be quoted.
398
399 NOTE: You should *NOT* under normal circumstances be using this!
400 There are better ways of avoiding most of these warnings. In particular:
401
402 -- use (declare (special ...)) if you are making use of
403 dynamically-scoped variables.
404 -- use `with-fboundp', `declare-fboundp', `if-fboundp', or
405 `globally-declare-fboundp' to avoid warnings about undefined
406 functions when you know the function actually exists.
407 -- use `with-boundp', `declare-boundp', or `if-boundp' to avoid
408 warnings about undefined variables when you know the variable
409 actually exists.
410 -- use `with-obsolete-variable' or `with-obsolete-function' if you
411 are purposely using such a variable or function."
412 `(with-byte-compiler-warnings-suppressed-1 ,type ,@body))
413
414 ;; #### These should be more clever. You could (e.g.) try fletting
415 ;; `byte-compile-obsolete' or temporarily removing the obsolete info
416 ;; from the symbol and putting it back with an unwind-protect. (Or
417 ;; better, modify the byte-compiler to provide a proper solution, and
418 ;; fix these macros to use it if available, or fall back on the way
419 ;; below. Remember, these definitions need to work with an unchanged
420 ;; byte compiler so that they can be copied and used in packages.)
421
422 (put 'with-obsolete-variable 'lisp-indent-function 1)
423 (defmacro with-obsolete-variable (symbol &rest body)
424 "Evaluate BODY but do not warn about usage of obsolete variable SYMBOL.
425 SYMBOL must be quoted. See also `with-obsolete-function'."
426 `(with-byte-compiler-warnings-suppressed 'obsolete ,@body))
427
428 (put 'with-obsolete-function 'lisp-indent-function 1)
429 (defmacro with-obsolete-function (symbol &rest body)
430 "Evaluate BODY but do not warn about usage of obsolete function SYMBOL.
431 SYMBOL must be quoted. See also `with-obsolete-variable'."
432 `(with-byte-compiler-warnings-suppressed 'obsolete ,@body))
187 433
188 434
189 ;;; Interface to file-local byte-compiler parameters. 435 ;;; Interface to file-local byte-compiler parameters.
190 ;;; Redefined in bytecomp.el. 436 ;;; Redefined in bytecomp.el.
191 437
220 466
221 free-vars references to variables not in the current lexical scope. 467 free-vars references to variables not in the current lexical scope.
222 unused-vars references to non-global variables bound but not referenced. 468 unused-vars references to non-global variables bound but not referenced.
223 unresolved calls to unknown functions. 469 unresolved calls to unknown functions.
224 callargs lambda calls with args that don't match the definition. 470 callargs lambda calls with args that don't match the definition.
471 subr-callargs calls to subrs with args that don't match the definition.
225 redefine function cell redefined from a macro to a lambda or vice 472 redefine function cell redefined from a macro to a lambda or vice
226 versa, or redefined to take a different number of arguments. 473 versa, or redefined to take a different number of arguments.
474 obsolete use of an obsolete function or variable.
475 pedantic warn of use of compatible symbols.
227 476
228 If the first element if the list is `+' or `-' then the specified elements 477 If the first element if the list is `+' or `-' then the specified elements
229 are added to or removed from the current set of warnings, instead of the 478 are added to or removed from the current set of warnings, instead of the
230 entire set of warnings being overwritten. 479 entire set of warnings being overwritten.
231 480