1 ;;; bytecomp-runtime.el --- byte-compiler support for inlining
3 ;; Copyright (C) 1992, 1997 Free Software Foundation, Inc.
5 ;; Author: Jamie Zawinski <jwz@jwz.org>
6 ;; Author: Hallvard Furuseth <hbf@ulrik.uio.no>
7 ;; Maintainer: XEmacs Development Team
8 ;; Keywords: internal, dumped
10 ;; This file is part of XEmacs.
12 ;; XEmacs is free software; you can redistribute it and/or modify it
13 ;; under the terms of the GNU General Public License as published by
14 ;; the Free Software Foundation; either version 2, or (at your option)
17 ;; XEmacs is distributed in the hope that it will be useful, but
18 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 ;; General Public License for more details.
22 ;; You should have received a copy of the GNU General Public License
23 ;; along with XEmacs; see the file COPYING. If not, write to the
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
25 ;; Boston, MA 02111-1307, USA.
27 ;;; Synched up with: FSF 19.30.
31 ;; This file is dumped with XEmacs.
33 ;; The code in this file should always be loaded, because it defines things
34 ;; like "defsubst" which should work interpreted as well. The code in
35 ;; bytecomp.el and byte-optimize.el can be loaded as needed.
37 ;; interface to selectively inlining functions.
38 ;; This only happens when source-code optimization is turned on.
42 ;; Redefined in byte-optimize.el.
43 ;; This is not documented--it's not clear that we should promote it.
45 (put 'inline 'lisp-indent-hook 0)
48 ;;; Interface to inline functions.
50 ;; FSF comments the next two out, but I see no reason to do so. --ben
51 (defmacro proclaim-inline (&rest fns)
52 "Cause the named functions to be open-coded when called from compiled code.
53 They will only be compiled open-coded when `byte-optimize' is true."
54 (cons 'eval-and-compile
59 `((or (memq (get ',x 'byte-optimizer)
60 '(nil byte-compile-inline-expand))
62 "%s already has a byte-optimizer, can't make it inline"
64 (put ',x 'byte-optimizer 'byte-compile-inline-expand)))
68 (defmacro proclaim-notinline (&rest fns)
69 "Cause the named functions to no longer be open-coded."
70 (cons 'eval-and-compile
75 `((if (eq (get ',x 'byte-optimizer)
76 'byte-compile-inline-expand)
77 (put ',x 'byte-optimizer nil))))
80 ;; This has a special byte-hunk-handler in bytecomp.el.
81 (defmacro defsubst (name arglist &rest body)
82 "Define an inline function. The syntax is just like that of `defun'."
83 (or (memq (get name 'byte-optimizer)
84 '(nil byte-compile-inline-expand))
85 (error "`%s' is a primitive" name))
87 (cons 'defun (cons name (cons arglist body)))
88 (list 'proclaim-inline name)))
89 ; Instead of the above line, FSF has this:
90 ; (list 'eval-and-compile
91 ; (list 'put (list 'quote name)
92 ; ''byte-optimizer ''byte-compile-inline-expand))))
94 (defun make-obsolete (fn new)
95 "Make the byte-compiler warn that function FN is obsolete.
96 The warning will say that NEW should be used instead.
97 If NEW is a string, that is the `use instead' message."
98 (interactive "aMake function obsolete: \nxObsoletion replacement: ")
99 (let ((handler (get fn 'byte-compile)))
100 (if (eq 'byte-compile-obsolete handler)
101 (setcar (get fn 'byte-obsolete-info) new)
102 (put fn 'byte-obsolete-info (cons new handler))
103 (put fn 'byte-compile 'byte-compile-obsolete)))
106 (defun make-obsolete-variable (var new)
107 "Make the byte-compiler warn that variable VAR is obsolete,
108 and NEW should be used instead. If NEW is a string, then that is the
109 `use instead' message."
112 (let ((str (completing-read "Make variable obsolete: " obarray 'boundp t)))
113 (if (equal str "") (error ""))
115 (car (read-from-string (read-string "Obsoletion replacement: ")))))
116 (put var 'byte-obsolete-variable new)
119 ;; By overwhelming demand, we separate out truly obsolete symbols from
120 ;; those that are present for GNU Emacs compatibility.
121 (defun make-compatible (fn new)
122 "Make the byte-compiler know that function FN is provided for compatibility.
123 The warning will say that NEW should be used instead.
124 If NEW is a string, that is the `use instead' message."
125 (interactive "aMake function compatible: \nxCompatible replacement: ")
126 (let ((handler (get fn 'byte-compile)))
127 (if (eq 'byte-compile-compatible handler)
128 (setcar (get fn 'byte-compatible-info) new)
129 (put fn 'byte-compatible-info (cons new handler))
130 (put fn 'byte-compile 'byte-compile-compatible)))
133 (defun make-compatible-variable (var new)
134 "Make the byte-compiler know that variable VAR is provided for compatibility,
135 and NEW should be used instead. If NEW is a string, then that is the
136 `use instead' message."
139 (let ((str (completing-read "Make variable compatible: "
141 (if (equal str "") (error ""))
143 (car (read-from-string (read-string "Compatible replacement: ")))))
144 (put var 'byte-compatible-variable new)
147 (put 'dont-compile 'lisp-indent-hook 0)
148 (defmacro dont-compile (&rest body)
149 "Like `progn', but the body always runs interpreted (not compiled).
150 If you think you need this, you're probably making a mistake somewhere."
151 (list 'eval (list 'quote (if (cdr body) (cons 'progn body) (car body)))))
154 ;;; interface to evaluating things at compile time and/or load time
155 ;;; these macro must come after any uses of them in this file, as their
156 ;;; definition in the file overrides the magic definitions on the
157 ;;; byte-compile-macro-environment.
159 (put 'eval-when-compile 'lisp-indent-hook 0)
160 (defmacro eval-when-compile (&rest body)
161 "Like `progn', but evaluates the body at compile time.
162 The result of the body appears to the compiler as a quoted constant."
163 ;; Not necessary because we have it in b-c-initial-macro-environment
164 ;; (list 'quote (eval (cons 'progn body)))
167 (put 'eval-and-compile 'lisp-indent-hook 0)
168 (defmacro eval-and-compile (&rest body)
169 "Like `progn', but evaluates the body at compile time and at load time."
170 ;; Remember, it's magic.
174 (put 'eval-when-feature 'lisp-indent-hook 1)
175 (defmacro eval-when-feature (feature &rest body)
176 "Run the body forms when FEATURE is featurep, be it now or later.
177 Called (eval-when-feature (FEATURE [. FILENAME]) BODYFORMS...).
178 If (featurep 'FEATURE), evals now; otherwise adds an elt to
179 `after-load-alist' (which see), using FEATURE as filename if FILENAME is nil."
180 (let ((file (or (cdr feature) (symbol-name (car feature)))))
181 `(let ((bodythunk #'(lambda () ,@body)))
182 (if (featurep ',(car feature))
184 (setq after-load-alist (cons '(,file . (list 'lambda '() bodythunk))
185 after-load-alist))))))
189 ;;; Interface to file-local byte-compiler parameters.
190 ;;; Redefined in bytecomp.el.
192 ;;; The great RMS speaketh:
194 ;;; I nuked this because it's not a good idea for users to think of
195 ;;; using it. These options are a matter of installation preference,
196 ;;; and have nothing to do with particular source files; it's a
197 ;;; mistake to suggest to users that they should associate these with
198 ;;; particular source files. There is hardly any reason to change
199 ;;; these parameters, anyway. --rms.
201 ;;; But I'll leave this stuff alone. --ben
203 (put 'byte-compiler-options 'lisp-indent-hook 0)
204 (defmacro byte-compiler-options (&rest args)
205 "Set some compilation-parameters for this file.
206 This will affect only the file in which it appears; this does nothing when
207 evaluated, or when loaded from a .el file.
209 Each argument to this macro must be a list of a key and a value.
211 Keys: Values: Corresponding variable:
213 verbose t, nil byte-compile-verbose
214 optimize t, nil, source, byte byte-optimize
215 warnings list of warnings byte-compile-warnings
216 file-format emacs19, emacs20 byte-compile-emacs19-compatibility
218 The value specified with the `warnings' option must be a list, containing
219 some subset of the following flags:
221 free-vars references to variables not in the current lexical scope.
222 unused-vars references to non-global variables bound but not referenced.
223 unresolved calls to unknown functions.
224 callargs lambda calls with args that don't match the definition.
225 redefine function cell redefined from a macro to a lambda or vice
226 versa, or redefined to take a different number of arguments.
228 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
230 entire set of warnings being overwritten.
232 For example, something like this might appear at the top of a source file:
234 (byte-compiler-options
236 (warnings (- callargs)) ; Don't warn about arglist mismatch
237 (warnings (+ unused-vars)) ; Do warn about unused bindings
238 (file-format emacs19))"
241 ;;; bytecomp-runtime.el ends here