changeset 784:6d993c174c62

*** empty log message ***
author Richard M. Stallman <rms@gnu.org>
date Wed, 15 Jul 1992 20:26:37 +0000
parents 59dc833c4e0c
children 17ccc9d015f5
files lisp/emacs-lisp/bytecomp.el
diffstat 1 files changed, 269 insertions(+), 308 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/emacs-lisp/bytecomp.el	Wed Jul 15 18:48:42 1992 +0000
+++ b/lisp/emacs-lisp/bytecomp.el	Wed Jul 15 20:26:37 1992 +0000
@@ -1,10 +1,11 @@
 ;;; -*- Mode: Emacs-Lisp -*-
 ;;; Compilation of Lisp code into byte code.
-;;; Copyright (C) 1985, 1986, 1987 Free Software Foundation, Inc.
+;;; Copyright (C) 1985, 1986, 1987, 1992 Free Software Foundation, Inc.
 
 ;; By Jamie Zawinski <jwz@lucid.com> and Hallvard Furuseth <hbf@ulrik.uio.no>.
+;; Subsequently modified by RMS.
 
-(defconst byte-compile-version "2.04; 5-feb-92.")
+(defconst byte-compile-version "FSF 2.1")
 
 ;; This file is part of GNU Emacs.
 
@@ -24,12 +25,13 @@
 
 ;;; ========================================================================
 ;;; Entry points:
-;;;	byte-recompile-directory, byte-compile-file, 
-;;;	byte-compile-and-load-file byte-compile-buffer, batch-byte-compile,
-;;;	byte-compile, byte-compile-sexp, elisp-compile-defun,
-;;;	byte-compile-report-call-tree
+;;;	byte-recompile-directory, byte-compile-file, batch-byte-compile,
+;;;	byte-compile, compile-defun
+;;;	display-call-tree
+;;; (byte-compile-buffer and byte-compile-and-load-file were turned off
+;;;  because they are not terribly useful and get in the way of completion.)
 
-;;; This version of the elisp byte compiler has the following improvements:
+;;; This version of the byte compiler has the following improvements:
 ;;;  + optimization of compiled code:
 ;;;    - removal of unreachable code;
 ;;;    - removal of calls to side-effectless functions whose return-value
@@ -83,47 +85,27 @@
 ;;;					    or redefined to take other args)
 ;;;				This defaults to nil in -batch mode, which is
 ;;;				slightly faster.
-;;; byte-compile-emacs18-compatibility		Whether the compiler should
+;;; byte-compile-compatibility	Whether the compiler should
 ;;;				generate .elc files which can be loaded into
-;;;				generic emacs 18's which don't have the file
-;;;				bytecomp-runtime.el loaded as well;
-;;; byte-compile-generate-emacs19-bytecodes	Whether to generate bytecodes
-;;;				which exist only in emacs19.  This is a more
-;;;				extreme step than setting emacs18-compatibility
-;;;				to nil, because there is no elisp you can load
-;;;				into an emacs18 to make files compiled this
-;;;				way work.
+;;;				generic emacs 18.
 ;;; byte-compile-single-version	Normally the byte-compiler will consult the
 ;;;				above two variables at runtime, but if this 
 ;;;				variable is true when the compiler itself is
 ;;;				compiled, then the runtime checks will not be
 ;;;				made, and compilation will be slightly faster.
-;;; elisp-source-extention-re	Regexp for the extention of elisp source-files;
-;;;				see also the function byte-compile-dest-file.
 ;;; byte-compile-overwrite-file	If nil, delete old .elc files before saving.
-;;;
-;;; Most of the above parameters can also be set on a file-by-file basis; see
-;;; the documentation of the `byte-compiler-options' macro.
 
 ;;; New Features:
 ;;;
 ;;;  o	The form `defsubst' is just like `defun', except that the function
 ;;;	generated will be open-coded in compiled code which uses it.  This
 ;;;	means that no function call will be generated, it will simply be
-;;;	spliced in.  Elisp functions calls are very slow, so this can be a
+;;;	spliced in.  Lisp functions calls are very slow, so this can be a
 ;;;	big win.
 ;;;
 ;;;	You can generally accomplish the same thing with `defmacro', but in
 ;;;	that case, the defined procedure can't be used as an argument to
 ;;;	mapcar, etc.
-;;;	
-;;;  o	You can make a given function be inline even if it has already been
-;;;	defined with `defun' by using the `proclaim-inline' form like so:
-;;;		(proclaim-inline my-function)
-;;;	This is, in fact, exactly what `defsubst' does.  To make a function no
-;;;	longer be inline, you must use `proclaim-notinline'.  Beware that if
-;;;	you define a function with `defsubst' and later redefine it with 
-;;;	`defun', it will still be open-coded until you use proclaim-notinline.
 ;;;
 ;;;  o	You can also open-code one particular call to a function without
 ;;;	open-coding all calls.  Use the 'inline' form to do this, like so:
@@ -153,7 +135,7 @@
 ;;;
 ;;;  o  The command Meta-X byte-compile-and-load-file does what you'd think.
 ;;;
-;;;  o  The command elisp-compile-defun is analogous to eval-defun.
+;;;  o  The command compile-defun is analogous to eval-defun.
 ;;;
 ;;;  o  If you run byte-compile-file on a filename which is visited in a 
 ;;;     buffer, and that buffer is modified, you are asked whether you want
@@ -161,21 +143,12 @@
 
 (or (fboundp 'defsubst)
     ;; This really ought to be loaded already!
-    (load-library "bytecomp-runtime"))
-
-(eval-when-compile
-  (defvar byte-compile-single-version nil
-    "If this is true, the choice of emacs version (v18 or v19) byte-codes will
-be hard-coded into bytecomp when it compiles itself.  If the compiler itself
-is compiled with optimization, this causes a speedup.")
+    (load-library "byte-run"))
 
-  (cond (byte-compile-single-version
-	 (defmacro byte-compile-single-version () t)
-	 (defmacro byte-compile-version-cond (cond) (list 'quote (eval cond))))
-	(t
-	 (defmacro byte-compile-single-version () nil)
-	 (defmacro byte-compile-version-cond (cond) cond)))
-  )
+;;; The feature of compiling in a specific target Emacs version
+;;; has been turned off because compile time options are a bad idea.
+(defmacro byte-compile-single-version () nil)
+(defmacro byte-compile-version-cond (cond) cond)
 
 ;;; The crud you see scattered through this file of the form
 ;;;   (or (and (boundp 'epoch::version) epoch::version)
@@ -183,74 +156,65 @@
 ;;; is because the Epoch folks couldn't be bothered to follow the
 ;;; normal emacs version numbering convention.
 
-(if (byte-compile-version-cond
-     (or (and (boundp 'epoch::version) epoch::version)
-	 (string-lessp emacs-version "19")))
-    (progn
-      ;; emacs-18 compatibility.
-      (defvar baud-rate (baud-rate))	;Define baud-rate if it's undefined
-
-      (if (byte-compile-single-version)
-	  (defmacro compiled-function-p (x) "Emacs 18 doesn't have these." nil)
-	(defun compiled-function-p (x) "Emacs 18 doesn't have these." nil))
-
-      (or (and (fboundp 'member)
-	       ;; avoid using someone else's possibly bogus definition of this.
-	       (subrp (symbol-function 'member)))
-	  (defun member (elt list)
-	    "like memq, but uses equal instead of eq.  In v19, this is a subr."
-	    (while (and list (not (equal elt (car list))))
-	      (setq list (cdr list)))
-	    list))
-      ))
+;; (if (byte-compile-version-cond
+;;      (or (and (boundp 'epoch::version) epoch::version)
+;; 	 (string-lessp emacs-version "19")))
+;;     (progn
+;;       ;; emacs-18 compatibility.
+;;       (defvar baud-rate (baud-rate))	;Define baud-rate if it's undefined
+;; 
+;;       (if (byte-compile-single-version)
+;; 	  (defmacro compiled-function-p (x) "Emacs 18 doesn't have these." nil)
+;; 	(defun compiled-function-p (x) "Emacs 18 doesn't have these." nil))
+;; 
+;;       (or (and (fboundp 'member)
+;; 	       ;; avoid using someone else's possibly bogus definition of this.
+;; 	       (subrp (symbol-function 'member)))
+;; 	  (defun member (elt list)
+;; 	    "like memq, but uses equal instead of eq.  In v19, this is a subr."
+;; 	    (while (and list (not (equal elt (car list))))
+;; 	      (setq list (cdr list)))
+;; 	    list))))
 
 
-(defvar elisp-source-extention-re (if (eq system-type 'vax-vms)
-				      "\\.EL\\(;[0-9]+\\)?$"
-				    "\\.el$")
-  "*Regexp which matches the extention of elisp source-files.
-You may want to redefine defun byte-compile-dest-file to match this.")
+(defvar emacs-lisp-file-regexp (if (eq system-type 'vax-vms)
+				   "\\.EL\\(;[0-9]+\\)?$"
+				 "\\.el$")
+  "*Regexp which matches Emacs Lisp source files.
+You may want to redefine `byte-compile-dest-file' if you change this.")
 
 (or (fboundp 'byte-compile-dest-file)
-    ;; The user may want to redefine this along with elisp-source-extention-re,
+    ;; The user may want to redefine this,
     ;; so only define it if it is undefined.
     (defun byte-compile-dest-file (filename)
-      "Converts an emacs-lisp source-filename to a compiled-filename."
+      "Convert an Emacs Lisp source file name to a compiled file name."
       (setq filename (file-name-sans-versions filename))
       (cond ((eq system-type 'vax-vms)
 	     (concat (substring filename 0 (string-match ";" filename)) "c"))
-	    ((string-match elisp-source-extention-re filename)
-	     (concat (substring filename 0 (match-beginning 0)) ".elc"))
 	    (t (concat filename "c")))))
 
 ;; This can be the 'byte-compile property of any symbol.
-(autoload 'byte-compile-inline-expand "byte-optimize")
+(autoload 'byte-compile-inline-expand "byte-opt")
 
 ;; This is the entrypoint to the lapcode optimizer pass1.
-(autoload 'byte-optimize-form "byte-optimize")
+(autoload 'byte-optimize-form "byte-opt")
 ;; This is the entrypoint to the lapcode optimizer pass2.
-(autoload 'byte-optimize-lapcode "byte-optimize")
-(autoload 'byte-compile-unfold-lambda "byte-optimize")
+(autoload 'byte-optimize-lapcode "byte-opt")
+(autoload 'byte-compile-unfold-lambda "byte-opt")
 
 (defvar byte-compile-verbose
   (and (not noninteractive) (> baud-rate search-slow-speed))
   "*Non-nil means print messages describing progress of byte-compiler.")
 
-(defvar byte-compile-emacs18-compatibility
-  (or (and (boundp 'epoch::version) epoch::version)
-      (string-lessp emacs-version "19"))
-  "*If this is true, then the byte compiler will generate .elc files which will
-work in generic version 18 emacses without having bytecomp-runtime.el loaded.
-If this is false, the generated code will be more efficient in emacs 19, and
-will be loadable in emacs 18 only if bytecomp-runtime.el is loaded.
-See also byte-compile-generate-emacs19-bytecodes.")
+(defvar byte-compile-compatibility nil
+  "*Non-nil means generate output that can run in Emacs 18.")
 
-(defvar byte-compile-generate-emacs19-bytecodes
-        (not (or (and (boundp 'epoch::version) epoch::version)
-		 (string-lessp emacs-version "19")))
-  "*If this is true, then the byte-compiler will generate bytecode which 
-makes use of byte-ops which are present only in emacs19.  Code generated
-this way can never be run in emacs18, and may even cause it to crash.")
+;; (defvar byte-compile-generate-emacs19-bytecodes
+;;         (not (or (and (boundp 'epoch::version) epoch::version)
+;; 		 (string-lessp emacs-version "19")))
+;;   "*If this is true, then the byte-compiler will generate bytecode which 
+;; makes use of byte-ops which are present only in Emacs 19.  Code generated
+;; this way can never be run in Emacs 18, and may even cause it to crash.")
 
 (defvar byte-optimize t
   "*If nil, no compile-optimizations will be done.
@@ -275,20 +239,22 @@
 (defconst byte-compile-warning-types '(redefine callargs free-vars unresolved))
 (defvar byte-compile-warnings (not noninteractive)
   "*List of warnings that the byte-compiler should issue (t for all).
-See doc of macro byte-compiler-options.")
+Valid elements of this list are `callargs', `redefine', `free-vars',
+and `unresolved'.")
 
 (defvar byte-compile-generate-call-tree nil
-  "*If this is true, then the compiler will collect statistics on what
-functions were called and from where.  This will be displayed after the
-compilation completes.  If it is non-nil, but not t, you will be asked
-for whether to display this.
+  "*Non-nil means collect call-graph information when compiling.
+This records functions were called and from where.
+If the value is t, compilation displays the call graph when it finishes.
+If the value is neither t nor nil, compilation asks you whether to display
+the graph.
 
 The call tree only lists functions called, not macros used. Those functions
 which the byte-code interpreter knows about directly (eq, cons, etc.) are
 not reported.
 
 The call tree also lists those functions which are not known to be called
-(that is, to which no calls have been compiled.)  Functions which can be
+\(that is, to which no calls have been compiled.)  Functions which can be
 invoked interactively are excluded from this list.")
 
 (defconst byte-compile-call-tree nil "Alist of functions and their call tree.
@@ -301,17 +267,17 @@
 FUNCTION.")
 
 (defvar byte-compile-call-tree-sort 'name
-  "*If non nil, the call tree is sorted.
-The values 'name, 'callers, 'calls, 'calls+callers means to sort on
-the those fields.")
+  "*If non-nil, sort the call tree.
+The values `name', `callers', `calls', `calls+callers'
+specify different fields to sort on.")
 
-(defvar byte-compile-overwrite-file t
-  "If nil, old .elc files are deleted before the new is saved, and .elc
-files will have the same modes as the corresponding .el file.  Otherwise,
-existing .elc files will simply be overwritten, and the existing modes
-will not be changed.  If this variable is nil, then an .elc file which 
-is a symbolic link will be turned into a normal file, instead of the file
-which the link points to being overwritten.")
+;; (defvar byte-compile-overwrite-file t
+;;   "If nil, old .elc files are deleted before the new is saved, and .elc
+;; files will have the same modes as the corresponding .el file.  Otherwise,
+;; existing .elc files will simply be overwritten, and the existing modes
+;; will not be changed.  If this variable is nil, then an .elc file which 
+;; is a symbolic link will be turned into a normal file, instead of the file
+;; which the link points to being overwritten.")
 
 (defvar byte-compile-constants nil
   "list of all constants encountered during compilation of this form")
@@ -324,8 +290,9 @@
 (defvar byte-compile-free-assignments)
 
 (defconst byte-compile-initial-macro-environment
-  '((byte-compiler-options . (lambda (&rest forms)
-			       (apply 'byte-compiler-options-handler forms)))
+  '(
+;;     (byte-compiler-options . (lambda (&rest forms)
+;; 			       (apply 'byte-compiler-options-handler forms)))
     (eval-when-compile . (lambda (&rest body)
 			   (list 'quote (eval (byte-compile-top-level
 					       (cons 'progn body))))))
@@ -337,13 +304,15 @@
 expanded by the compiler as when expanded by the interpreter.")
 
 (defvar byte-compile-macro-environment byte-compile-initial-macro-environment
-  "Alist of (MACRONAME . DEFINITION) macros defined in the file which is being 
-compiled.  It is (MACRONAME . nil) when a macro is redefined as a function.")
+  "Alist of macros defined in the file being compiled.
+Each element looks like (MACRONAME . DEFINITION).  It is
+\(MACRONAME . nil) when a function is redefined as a function.")
 
 (defvar byte-compile-function-environment nil
-  "Alist of (FUNCTIONNAME . DEFINITION) functions defined in the file which
-is being compiled (this is so we can inline them if necessary).  It is
-(FUNCTIONNAME . nil) when a function is redefined as a macro.")
+  "Alist of functions defined in the file being compiled.
+This is so we can inline them when necessary.
+Each element looks like (FUNCTIONNAME . DEFINITION).  It is
+\(FUNCTIONNAME . nil) when a function is redefined as a macro.")
 
 (defvar byte-compile-unresolved-functions nil
   "Alist of undefined functions to which calls have been compiled (used for
@@ -514,25 +483,27 @@
 (byte-defop 142 -1 byte-unwind-protect
   "for unwind-protect.  Takes, on stack, an expression for the unwind-action")
 
-(byte-defop 143 -2 byte-condition-case
-  "for condition-case.  Takes, on stack, the variable to bind, 
-an expression for the body, and a list of clauses")
+;; For condition-case.  Takes, on stack, the variable to bind, 
+;; an expression for the body, and a list of clauses.
+(byte-defop 143 -2 byte-condition-case)
 
-(byte-defop 144  0 byte-temp-output-buffer-setup
-  "for entry to with-output-to-temp-buffer.
-Takes, on stack, the buffer name.
-Binds standard-output and does some other things.
-Returns with temp buffer on the stack in place of buffer name")
+;; For entry to with-output-to-temp-buffer.
+;; Takes, on stack, the buffer name.
+;; Binds standard-output and does some other things.
+;; Returns with temp buffer on the stack in place of buffer name.
+(byte-defop 144  0 byte-temp-output-buffer-setup)
 
-(byte-defop 145 -1 byte-temp-output-buffer-show
-  "for exit from with-output-to-temp-buffer.
-Expects the temp buffer on the stack underneath value to return.
-Pops them both, then pushes the value back on.
-Unbinds standard-output and makes the temp buffer visible")
+;; For exit from with-output-to-temp-buffer.
+;; Expects the temp buffer on the stack underneath value to return.
+;; Pops them both, then pushes the value back on.
+;; Unbinds standard-output and makes the temp buffer visible.
+(byte-defop 145 -1 byte-temp-output-buffer-show)
 
 ;; these ops are new to v19
-(byte-defop 146  0 byte-unbind-all "to unbind back to the beginning of 
-this frame.  Not used yet, but wil be needed for tail-recursion elimination.")
+
+;; To unbind back to the beginning of this frame.
+;; Not used yet, but wil be needed for tail-recursion elimination.
+(byte-defop 146  0 byte-unbind-all)
 
 ;; these ops are new to v19
 (byte-defop 147 -2 byte-set-marker)
@@ -581,7 +552,7 @@
 (defconst byte-goto-ops '(byte-goto byte-goto-if-nil byte-goto-if-not-nil
 			  byte-goto-if-nil-else-pop
 			  byte-goto-if-not-nil-else-pop)
-  "those byte-codes whose offset is a pc.")
+  "List of byte-codes whose offset is a pc.")
 
 (defconst byte-goto-always-pop-ops '(byte-goto-if-nil byte-goto-if-not-nil))
 
@@ -589,7 +560,7 @@
 			      byte-rel-goto-if-nil byte-rel-goto-if-not-nil
 			      byte-rel-goto-if-nil-else-pop
 			      byte-rel-goto-if-not-nil-else-pop)
-  "byte-codes for relative jumps.")
+  "List of byte-codes for relative jumps.")
 
 (byte-extrude-byte-code-vectors)
 
@@ -636,7 +607,7 @@
       (setq op (car (car lap))
 	    off (cdr (car lap)))
       (cond ((not (symbolp op))
-	     (error "non-symbolic opcode %s" op))
+	     (error "Non-symbolic opcode `%s'" op))
 	    ((eq op 'TAG)
 	     (setcar off pc)
 	     (setq patchlist (cons off patchlist)))
@@ -677,8 +648,8 @@
 					    bytes))))))))
       (setq lap (cdr lap)))
     ;;(if (not (= pc (length bytes)))
-    ;;    (error "compiler error: pc mismatch - %s %s" pc (length bytes)))
-    (cond ((byte-compile-version-cond byte-compile-generate-emacs19-bytecodes)
+    ;;    (error "Compiler error: pc mismatch - %s %s" pc (length bytes)))
+    (cond ((byte-compile-version-cond byte-compile-compatibility)
 	   ;; Make relative jumps
 	   (setq patchlist (nreverse patchlist))
 	   (while (progn
@@ -800,61 +771,61 @@
 
 ;; Compiler options
 
-(defvar byte-compiler-legal-options
-  '((optimize byte-optimize (t nil source byte) val)
-    (file-format byte-compile-emacs18-compatibility (emacs18 emacs19)
-		 (eq val 'emacs18))
-    (new-bytecodes byte-compile-generate-emacs19-bytecodes (t nil) val)
-    (delete-errors byte-compile-delete-errors (t nil) val)
-    (verbose byte-compile-verbose (t nil) val)
-    (warnings byte-compile-warnings ((callargs redefine free-vars unresolved))
-	      val)))
+;; (defvar byte-compiler-valid-options
+;;   '((optimize byte-optimize (t nil source byte) val)
+;;     (file-format byte-compile-compatibility (emacs18 emacs19)
+;; 		 (eq val 'emacs18))
+;; ;;     (new-bytecodes byte-compile-generate-emacs19-bytecodes (t nil) val)
+;;     (delete-errors byte-compile-delete-errors (t nil) val)
+;;     (verbose byte-compile-verbose (t nil) val)
+;;     (warnings byte-compile-warnings ((callargs redefine free-vars unresolved))
+;; 	      val)))
 
 ;; Inhibit v18/v19 selectors if the version is hardcoded.
 ;; #### This should print a warning if the user tries to change something 
 ;; than can't be changed because the running compiler doesn't support it.
-(cond
- ((byte-compile-single-version)
-  (setcar (cdr (cdr (assq 'new-bytecodes byte-compiler-legal-options)))
-	  (list (byte-compile-version-cond
-		 byte-compile-generate-emacs19-bytecodes)))
-  (setcar (cdr (cdr (assq 'file-format byte-compiler-legal-options)))
-	  (if (byte-compile-version-cond byte-compile-emacs18-compatibility)
-	      '(emacs18) '(emacs19)))))
+;; (cond
+;;  ((byte-compile-single-version)
+;;   (setcar (cdr (cdr (assq 'new-bytecodes byte-compiler-valid-options)))
+;; 	  (list (byte-compile-version-cond
+;; 		 byte-compile-generate-emacs19-bytecodes)))
+;;   (setcar (cdr (cdr (assq 'file-format byte-compiler-valid-options)))
+;; 	  (if (byte-compile-version-cond byte-compile-compatibility)
+;; 	      '(emacs18) '(emacs19)))))
 
-(defun byte-compiler-options-handler (&rest args)
-  (let (key val desc choices)
-    (while args
-      (if (or (atom (car args)) (nthcdr 2 (car args)) (null (cdr (car args))))
-	  (error "malformed byte-compiler-option %s" (car args)))
-      (setq key (car (car args))
-	    val (car (cdr (car args)))
-	    desc (assq key byte-compiler-legal-options))
-      (or desc
-	  (error "unknown byte-compiler option %s" key))
-      (setq choices (nth 2 desc))
-      (if (consp (car choices))
-	  (let (this
-		(handler 'cons)
-		(ret (and (memq (car val) '(+ -))
-			  (copy-sequence (if (eq t (symbol-value (nth 1 desc)))
-					     choices
-					   (symbol-value (nth 1 desc)))))))
-	    (setq choices (car  choices))
-	    (while val
-	      (setq this (car val))
-	      (cond ((memq this choices)
-		     (setq ret (funcall handler this ret)))
-		    ((eq this '+) (setq handler 'cons))
-		    ((eq this '-) (setq handler 'delq))
-		    ((error "%s only accepts %s." key choices)))
-	      (setq val (cdr val)))
-	    (set (nth 1 desc) ret))
-	(or (memq val choices)
-	    (error "%s must be one of %s." key choices))
-	(set (nth 1 desc) (eval (nth 3 desc))))
-      (setq args (cdr args)))
-    nil))
+;; (defun byte-compiler-options-handler (&rest args)
+;;   (let (key val desc choices)
+;;     (while args
+;;       (if (or (atom (car args)) (nthcdr 2 (car args)) (null (cdr (car args))))
+;; 	  (error "Malformed byte-compiler option `%s'" (car args)))
+;;       (setq key (car (car args))
+;; 	    val (car (cdr (car args)))
+;; 	    desc (assq key byte-compiler-valid-options))
+;;       (or desc
+;; 	  (error "Unknown byte-compiler option `%s'" key))
+;;       (setq choices (nth 2 desc))
+;;       (if (consp (car choices))
+;; 	  (let (this
+;; 		(handler 'cons)
+;; 		(ret (and (memq (car val) '(+ -))
+;; 			  (copy-sequence (if (eq t (symbol-value (nth 1 desc)))
+;; 					     choices
+;; 					   (symbol-value (nth 1 desc)))))))
+;; 	    (setq choices (car  choices))
+;; 	    (while val
+;; 	      (setq this (car val))
+;; 	      (cond ((memq this choices)
+;; 		     (setq ret (funcall handler this ret)))
+;; 		    ((eq this '+) (setq handler 'cons))
+;; 		    ((eq this '-) (setq handler 'delq))
+;; 		    ((error "`%s' only accepts %s" key choices)))
+;; 	      (setq val (cdr val)))
+;; 	    (set (nth 1 desc) ret))
+;; 	(or (memq val choices)
+;; 	    (error "`%s' must be one of `%s'" key choices))
+;; 	(set (nth 1 desc) (eval (nth 3 desc))))
+;;       (setq args (cdr args)))
+;;     nil))
 
 ;;; sanity-checking arglists
 
@@ -919,8 +890,8 @@
 	(t (format "%d-%d" (car signature) (cdr signature)))))
 
 
+;; Warn if the form is calling a function with the wrong number of arguments.
 (defun byte-compile-callargs-warn (form)
-  "warn if the form is calling a function with the wrong number of arguments."
   (let* ((def (or (byte-compile-fdefinition (car form) nil)
 		  (byte-compile-fdefinition (car form) t)))
 	 (sig (and def (byte-compile-arglist-signature
@@ -951,9 +922,9 @@
 		      (cons (list (car form) n)
 			    byte-compile-unresolved-functions))))))))
 
+;; Warn if the function or macro is being redefined with a different
+;; number of arguments.
 (defun byte-compile-arglist-warn (form macrop)
-  "warn if the function or macro is being redefined with a different
-number of arguments."
   (let ((old (byte-compile-fdefinition (nth 1 form) macrop)))
     (if old
 	(let ((sig1 (byte-compile-arglist-signature
@@ -990,10 +961,10 @@
 		    (delq calls byte-compile-unresolved-functions)))))
       )))
 
+;; If we have compiled any calls to functions which are not known to be 
+;; defined, issue a warning enumerating them.
+;; `unresolved' in the list `byte-compile-warnings' disables this.
 (defun byte-compile-warn-about-unresolved-functions ()
-  "If we have compiled any calls to functions which are not known to be 
-defined, issue a warning enumerating them.  You can disable this by including
-'unresolved in variable byte-compile-warnings."
   (if (memq 'unresolved byte-compile-warnings)
    (let ((byte-compile-current-form "the end of the data"))
     (if (cdr byte-compile-unresolved-functions)
@@ -1042,8 +1013,8 @@
 		;;
 		(byte-compile-verbose byte-compile-verbose)
 		(byte-optimize byte-optimize)
-		(byte-compile-generate-emacs19-bytecodes
-		 byte-compile-generate-emacs19-bytecodes)
+;; 		(byte-compile-generate-emacs19-bytecodes
+;; 		 byte-compile-generate-emacs19-bytecodes)
 		(byte-compile-warnings (if (eq byte-compile-warnings t)
 					   byte-compile-warning-types
 					 byte-compile-warnings))
@@ -1083,7 +1054,7 @@
   (save-some-buffers)
   (set-buffer-modified-p (buffer-modified-p))  ;Update the mode line.
   (setq directory (expand-file-name directory))
-  (let ((files (directory-files directory nil elisp-source-extention-re))
+  (let ((files (directory-files directory nil emacs-lisp-file-regexp))
 	(count 0)
 	source dest)
     (while files
@@ -1113,18 +1084,11 @@
 	      'emacs-lisp-mode)
 	  (setq file-name (file-name-nondirectory file)
 		file-dir (file-name-directory file)))
-     (list (if (byte-compile-version-cond
-		(or (and (boundp 'epoch::version) epoch::version)
-		    (string-lessp emacs-version "19")))
-	       (read-file-name (if current-prefix-arg
-				   "Byte compile and load file: "
-				 "Byte compile file: ")
-			       file-dir file-name nil)
-	     (read-file-name (if current-prefix-arg
-				 "Byte compile and load file: "
-			       "Byte compile file: ")
-			     file-dir nil nil file-name))
-	   current-prefix-arg)))
+     (list (read-file-name (if current-prefix-arg
+			       "Byte compile and load file: "
+			     "Byte compile file: ")
+			   file-dir file-name nil))
+	   current-prefix-arg))
   ;; Expand now so we get the current buffer's defaults
   (setq filename (expand-file-name filename))
 
@@ -1155,10 +1119,10 @@
       (insert "\n") ; aaah, unix.
       (let ((vms-stmlf-recfm t))
 	(setq target-file (byte-compile-dest-file filename))
-	(or byte-compile-overwrite-file
-	    (condition-case ()
-		(delete-file target-file)
-	      (error nil)))
+;; 	(or byte-compile-overwrite-file
+;; 	    (condition-case ()
+;; 		(delete-file target-file)
+;; 	      (error nil)))
 	(if (file-writable-p target-file)
  	    (let ((kanji-flag nil)) ; for nemacs, from Nakagawa Takayuki
 	      (write-region 1 (point-max) target-file))
@@ -1168,10 +1132,11 @@
 					"cannot overwrite file"
 				      "directory not writable or nonexistent")
 				    target-file)))
-	(or byte-compile-overwrite-file
-	    (condition-case ()
-		(set-file-modes target-file (file-modes filename))
-	      (error nil))))
+;; 	(or byte-compile-overwrite-file
+;; 	    (condition-case ()
+;; 		(set-file-modes target-file (file-modes filename))
+;; 	      (error nil)))
+	)
       (kill-buffer (current-buffer)))
     (if (and byte-compile-generate-call-tree
 	     (or (eq t byte-compile-generate-call-tree)
@@ -1182,31 +1147,30 @@
 	(load target-file)))
   t)
 
-(defun byte-compile-and-load-file (&optional filename)
-  "Compile a file of Lisp code named FILENAME into a file of byte code,
-and then load it.  The output file's name is made by appending \"c\" to 
-the end of FILENAME."
-  (interactive)
-  (if filename ; I don't get it, (interactive-p) doesn't always work
-      (byte-compile-file filename t)
-    (let ((current-prefix-arg '(4)))
-      (call-interactively 'byte-compile-file))))
-
+;;(defun byte-compile-and-load-file (&optional filename)
+;;  "Compile a file of Lisp code named FILENAME into a file of byte code,
+;;and then load it.  The output file's name is made by appending \"c\" to 
+;;the end of FILENAME."
+;;  (interactive)
+;;  (if filename ; I don't get it, (interactive-p) doesn't always work
+;;      (byte-compile-file filename t)
+;;    (let ((current-prefix-arg '(4)))
+;;      (call-interactively 'byte-compile-file))))
 
-(defun byte-compile-buffer (&optional buffer)
-  "Byte-compile and evaluate contents of BUFFER (default: the current buffer)."
-  (interactive "bByte compile buffer: ")
-  (setq buffer (if buffer (get-buffer buffer) (current-buffer)))
-  (message "Compiling %s..." (buffer-name buffer))
-  (let* ((filename (or (buffer-file-name buffer)
-		       (concat "#<buffer " (buffer-name buffer) ">")))
-	 (byte-compile-current-file buffer))
-    (byte-compile-from-buffer buffer t))
-  (message "Compiling %s...done" (buffer-name buffer))
-  t)
+;;(defun byte-compile-buffer (&optional buffer)
+;;  "Byte-compile and evaluate contents of BUFFER (default: the current buffer)."
+;;  (interactive "bByte compile buffer: ")
+;;  (setq buffer (if buffer (get-buffer buffer) (current-buffer)))
+;;  (message "Compiling %s..." (buffer-name buffer))
+;;  (let* ((filename (or (buffer-file-name buffer)
+;;		       (concat "#<buffer " (buffer-name buffer) ">")))
+;;	 (byte-compile-current-file buffer))
+;;    (byte-compile-from-buffer buffer t))
+;;  (message "Compiling %s...done" (buffer-name buffer))
+;;  t)
 
 ;;; compiling a single function
-(defun elisp-compile-defun (&optional arg)
+(defun compile-defun (&optional arg)
   "Compile and evaluate the current top-level form.
 Print the result in the minibuffer.
 With argument, insert value in current buffer after the form."
@@ -1293,17 +1257,17 @@
        ((eq byte-optimize 'byte) "byte-level optimization only")
        (byte-optimize "optimization is on")
        (t "optimization is off"))
-     (if (byte-compile-version-cond byte-compile-emacs18-compatibility)
-	 "; compiled with emacs18 compatibility.\n"
+     (if (byte-compile-version-cond byte-compile-compatibility)
+	 "; compiled with Emacs 18 compatibility.\n"
        ".\n"))
-   (if (byte-compile-version-cond byte-compile-generate-emacs19-bytecodes)
-       (insert ";;; this file uses opcodes which do not exist in Emacs18.\n"
+   (if (byte-compile-version-cond byte-compile-compatibility)
+       (insert ";;; this file uses opcodes which do not exist in Emacs 18.\n"
 	       ;; Have to check if emacs-version is bound so that this works
 	       ;; in files loaded early in loadup.el.
 	       "\n(if (and (boundp 'emacs-version)\n"
 	       "\t (or (and (boundp 'epoch::version) epoch::version)\n"
 	       "\t     (string-lessp emacs-version \"19\")))\n"
-	       "    (error \"This file was compiled for Emacs19.\"))\n"
+	       "    (error \"This file was compiled for Emacs 19\"))\n"
 	       ))
    ))
 
@@ -1486,7 +1450,7 @@
 	(message "Compiling %s (%s)..." (or filename "") (nth 1 form)))
     (cond (that-one
 	   (if (and (memq 'redefine byte-compile-warnings)
-		    ;; don't warn when compiling the stubs in bytecomp-runtime...
+		    ;; don't warn when compiling the stubs in byte-run...
 		    (not (assq (nth 1 form)
 			       byte-compile-initial-macro-environment)))
 	       (byte-compile-warn
@@ -1496,7 +1460,7 @@
 	  (this-one
 	   (if (and (memq 'redefine byte-compile-warnings)
 		    ;; hack: don't warn when compiling the magic internal
-		    ;; byte-compiler macros in bytecomp-runtime.el...
+		    ;; byte-compiler macros in byte-run.el...
 		    (not (assq (nth 1 form)
 			       byte-compile-initial-macro-environment)))
 	       (byte-compile-warn "%s %s defined multiple times in this file"
@@ -1589,7 +1553,7 @@
 ;; Given a function made by byte-compile-lambda, make a form which produces it.
 (defun byte-compile-byte-code-maker (fun)
   (cond
-   ((byte-compile-version-cond byte-compile-emacs18-compatibility)
+   ((byte-compile-version-cond byte-compile-compatibility)
     ;; Return (quote (lambda ...)).
     (list 'quote (byte-compile-byte-code-unmake fun)))
    ;; ## atom is faster than compiled-func-p.
@@ -1598,7 +1562,7 @@
     ;; would have produced a lambda.
     fun)
    ;; b-c-lambda didn't produce a compiled-function, so it's either a trivial
-   ;; function, or this is emacs18, or generate-emacs19-bytecodes is off.
+   ;; function, or this is Emacs 18, or generate-emacs19-bytecodes is off.
    ((let (tmp)
       (if (and (setq tmp (assq 'byte-code (cdr-safe (cdr fun))))
 	       (null (cdr (memq tmp fun))))
@@ -1665,7 +1629,7 @@
     (let ((compiled (byte-compile-top-level (cons 'progn body) nil 'lambda)))
       (if (and (eq 'byte-code (car-safe compiled))
 	       (byte-compile-version-cond
-		byte-compile-generate-emacs19-bytecodes))
+		byte-compile-compatibility))
 	  (apply 'make-byte-code
 		 (append (list arglist)
 			 ;; byte-string, constants-vector, stack depth
@@ -1856,7 +1820,7 @@
 		(handler (get fn 'byte-compile)))
 	   (if (and handler
 		    (or (byte-compile-version-cond
-			 byte-compile-generate-emacs19-bytecodes)
+			 byte-compile-compatibility)
 			(not (get (get fn 'byte-opcode) 'emacs19-opcode))))
 	       (funcall handler form)
 	     (if (memq 'callargs byte-compile-warnings)
@@ -1971,9 +1935,9 @@
 
 (defmacro byte-defop-compiler19 (function &optional compile-handler)
   ;; Just like byte-defop-compiler, but defines an opcode that will only
-  ;; be used when byte-compile-generate-emacs19-bytecodes is true.
+  ;; be used when byte-compile-compatibility is true.
   (if (and (byte-compile-single-version)
-	   (not byte-compile-generate-emacs19-bytecodes))
+	   (not byte-compile-compatibility))
       nil
     (list 'progn
       (list 'put
@@ -2188,7 +2152,7 @@
 	   (byte-compile-out
 	    (aref [byte-list1 byte-list2 byte-list3 byte-list4] (1- count)) 0))
 	  ((and (< count 256) (byte-compile-version-cond
-			       byte-compile-generate-emacs19-bytecodes))
+			       byte-compile-compatibility))
 	   (mapcar 'byte-compile-form (cdr form))
 	   (byte-compile-out 'byte-listN count))
 	  (t (byte-compile-normal-call form)))))
@@ -2204,7 +2168,7 @@
 	  ((= count 0)
 	   (byte-compile-form ""))
 	  ((and (< count 256) (byte-compile-version-cond
-			       byte-compile-generate-emacs19-bytecodes))
+			       byte-compile-compatibility))
 	   (mapcar 'byte-compile-form (cdr form))
 	   (byte-compile-out 'byte-concatN count))
 	  ((byte-compile-normal-call form)))))
@@ -2285,7 +2249,7 @@
 	 ;; '(lambda (..) (byte-code ..)) instead of a call to make-byte-code.
 	 ;; In this situation, calling make-byte-code at run-time will usually
 	 ;; be less efficient than processing a call to byte-code.
-	 ((byte-compile-version-cond byte-compile-emacs18-compatibility)
+	 ((byte-compile-version-cond byte-compile-compatibility)
 	  (byte-compile-byte-code-unmake (byte-compile-lambda (nth 1 form))))
 	 ((byte-compile-lambda (nth 1 form))))))
 
@@ -2304,7 +2268,7 @@
   (cond ((null (cdr form))
 	 (byte-compile-constant nil))
 	((and (byte-compile-version-cond
-	       byte-compile-generate-emacs19-bytecodes)
+	       byte-compile-compatibility)
 	      (<= (length form) 256))
 	 (mapcar 'byte-compile-form (cdr form))
 	 (if (cdr (cdr form))
@@ -2372,13 +2336,11 @@
     (setq body (cdr body)))
   (byte-compile-form (car body) for-effect))
 
-(proclaim-inline byte-compile-body-do-effect)
-(defun byte-compile-body-do-effect (body)
+(defsubst byte-compile-body-do-effect (body)
   (byte-compile-body body for-effect)
   (setq for-effect nil))
 
-(proclaim-inline byte-compile-form-do-effect)
-(defun byte-compile-form-do-effect (form)
+(defsubst byte-compile-form-do-effect (form)
   (byte-compile-form form for-effect)
   (setq for-effect nil))
 
@@ -2553,7 +2515,7 @@
   (list 'not
     (cons (or (get (car form) 'byte-compile-negated-op)
 	      (error
-	       "compiler error: %s has no byte-compile-negated-op property"
+	       "Compiler error: `%s' has no `byte-compile-negated-op' property"
 	       (car form)))
 	  (cdr form))))
 
@@ -2708,7 +2670,7 @@
 	;; ## remove this someday
 	(and byte-compile-depth
 	  (not (= (cdr (cdr tag)) byte-compile-depth))
-	  (error "bytecomp bug: depth conflict at tag %d" (car (cdr tag))))
+	  (error "Compiler bug: depth conflict at tag %d" (car (cdr tag))))
 	(setq byte-compile-depth (cdr (cdr tag))))
     (setcdr (cdr tag) byte-compile-depth)))
 
@@ -2735,7 +2697,7 @@
 					 (- (1- offset))))
 	       byte-compile-maxdepth (max byte-compile-depth
 					  byte-compile-maxdepth))))
-  ;;(if (< byte-compile-depth 0) (error "compiler error: stack underflow"))
+  ;;(if (< byte-compile-depth 0) (error "Compiler error: stack underflow"))
   )
 
 
@@ -2761,19 +2723,22 @@
 		  byte-compile-call-tree)))
     ))
 
-(defun byte-compile-report-call-tree (&optional filename)
-  "Display a buffer describing which functions have been called, what functions
-called them, and what functions they call.  This buffer will list all functions
-whose definitions have been compiled since this emacs session was started, as
-well as all functions called by those functions.
+;; Renamed from byte-compile-report-call-tree
+;; to avoid interfering with completion of byte-compile-file.
+(defun display-call-tree (&optional filename)
+  "Display a call graph of a specified file.
+This lists which functions have been called, what functions called
+them, and what functions they call.  The list includes all functions
+whose definitions have been compiled in this Emacs session, as well as
+all functions called by those functions.
 
-The call tree only lists functions called, not macros or inline functions
-expanded.  Those functions which the byte-code interpreter knows about directly
-\(eq, cons, etc.\) are not reported.
+The call graph does not include macros, inline functions, or
+primitives that the byte-code interpreter knows about directly \(eq,
+cons, etc.\).
 
 The call tree also lists those functions which are not known to be called
-\(that is, to which no calls have been compiled.\)  Functions which can be
-invoked interactively are excluded from this list."
+\(that is, to which no calls have been compiled\), and which cannot be
+invoked interactively."
   (interactive)
   (message "Generating call tree...")
   (with-output-to-temp-buffer "*Call-Tree*"
@@ -2806,7 +2771,7 @@
 			  ((eq byte-compile-call-tree-sort 'name)
 			   (function (lambda (x y) (string< (car x)
 							    (car y)))))
-			  (t (error "byte-compile-call-tree-sort: %s - unknown sort mode"
+			  (t (error "`byte-compile-call-tree-sort': `%s' - unknown sort mode"
 				    byte-compile-call-tree-sort))))))
     (message "Generating call tree...")
     (let ((rest byte-compile-call-tree)
@@ -2889,21 +2854,22 @@
 ;;; by crl@newton.purdue.edu
 ;;;  Only works noninteractively.
 (defun batch-byte-compile ()
-  "Runs `byte-compile-file' on the files remaining on the command line.
-Must be used only with -batch, and kills emacs on completion.
-Each file will be processed even if an error occurred previously.
+  "Run `byte-compile-file' on the files remaining on the command line.
+Use this from the command line, with `-batch';
+it won't work in an interactive Emacs.
+Each file is processed even if an error occurred previously.
 For example, invoke \"emacs -batch -f batch-byte-compile $emacs/ ~/*.el\""
   ;; command-line-args-left is what is left of the command line (from startup.el)
   (defvar command-line-args-left)	;Avoid 'free variable' warning
   (if (not noninteractive)
-      (error "batch-byte-compile is to be used only with -batch"))
+      (error "`batch-byte-compile' is to be used only with -batch"))
   (let ((error nil))
     (while command-line-args-left
       (if (file-directory-p (expand-file-name (car command-line-args-left)))
 	  (let ((files (directory-files (car command-line-args-left)))
 		source dest)
 	    (while files
-	      (if (and (string-match elisp-source-extention-re (car files))
+	      (if (and (string-match emacs-lisp-file-regexp (car files))
 		       (not (auto-save-file-name-p (car files)))
 		       (setq source (expand-file-name (car files)
 						      (car command-line-args-left)))
@@ -2938,44 +2904,39 @@
 (make-obsolete 'dot-min 'point-min)
 (make-obsolete 'dot-marker 'point-marker)
 
-(cond ((not (or (and (boundp 'epoch::version) epoch::version)
-		(string-lessp emacs-version "19")))
-       (make-obsolete 'buffer-flush-undo 'buffer-disable-undo)
-       (make-obsolete 'baud-rate "use the baud-rate variable instead")
-       ))
+(make-obsolete 'buffer-flush-undo 'buffer-disable-undo)
+(make-obsolete 'baud-rate "use the baud-rate variable instead")
 
 (provide 'byte-compile)
 
 
 ;;; report metering (see the hacks in bytecode.c)
 
-(if (boundp 'byte-code-meter)
-    (defun byte-compile-report-ops ()
-      (defvar byte-code-meter)
-      (with-output-to-temp-buffer "*Meter*"
-	(set-buffer "*Meter*")
-	(let ((i 0) n op off)
-	  (while (< i 256)
-	    (setq n (aref (aref byte-code-meter 0) i)
-		  off nil)
-	    (if t ;(not (zerop n))
-		(progn
-		  (setq op i)
-		  (setq off nil)
-		  (cond ((< op byte-nth)
-			 (setq off (logand op 7))
-			 (setq op (logand op 248)))
-			((>= op byte-constant)
-			 (setq off (- op byte-constant)
-			       op byte-constant)))
-		  (setq op (aref byte-code-vector op))
-		  (insert (format "%-4d" i))
-		  (insert (symbol-name op))
-		  (if off (insert " [" (int-to-string off) "]"))
-		  (indent-to 40)
-		  (insert (int-to-string n) "\n")))
-	    (setq i (1+ i)))))))
-
+(defun byte-compile-report-ops ()
+  (defvar byte-code-meter)
+  (with-output-to-temp-buffer "*Meter*"
+    (set-buffer "*Meter*")
+    (let ((i 0) n op off)
+      (while (< i 256)
+	(setq n (aref (aref byte-code-meter 0) i)
+	      off nil)
+	(if t				;(not (zerop n))
+	    (progn
+	      (setq op i)
+	      (setq off nil)
+	      (cond ((< op byte-nth)
+		     (setq off (logand op 7))
+		     (setq op (logand op 248)))
+		    ((>= op byte-constant)
+		     (setq off (- op byte-constant)
+			   op byte-constant)))
+	      (setq op (aref byte-code-vector op))
+	      (insert (format "%-4d" i))
+	      (insert (symbol-name op))
+	      (if off (insert " [" (int-to-string off) "]"))
+	      (indent-to 40)
+	      (insert (int-to-string n) "\n")))
+	(setq i (1+ i))))))
 
 ;; To avoid "lisp nesting exceeds max-lisp-eval-depth" when bytecomp compiles
 ;; itself, compile some of its most used recursive functions (at load time).