annotate lisp/emacs-lisp/byte-opt.el @ 30408:e3e2c9051c5f

Got rid of all byte-compiler warnings on Emacs. Add to the menu when the file is loaded, not in ada-mode-hook. Add -toolbar to the default ddd command Switches moved from ada-prj-default-comp-cmd and ada-prj-default-make-cmd to ada-prj-default-comp-opt (ada-add-ada-menu): Remove the map and name parameters Add the Ada Reference Manual to the menu (ada-check-current): rewritten as a call to ada-compile-current (ada-compile): Removed. (ada-compile-application, ada-compile-current, ada-check-current): Set the compilation-search-path so that compile.el automatically finds the sources in src_dir. Automatic scrollong of the compilation buffer. C-uC-cC-c asks for confirmation before compiling (ada-compile-current): New parameter, prj-field (ada-complete-identifier): Load the .ali file before doing processing (ada-find-ali-file-in-dir): prepend build_dir to obj_dir to conform to gnatmake's behavior. (ada-find-file-in-dir): New function (ada-find-references): Set the environment variables for gnatfind (ada-find-src-file-in-dir): New function. (ada-first-non-nil): Removed (ada-gdb-application): Add support for jdb, the java debugger. (ada-get-ada-file-name): Load the original-file first if not done yet. (ada-get-all-references): Handles the new ali syntax (parent types are found between <>). (ada-initialize-runtime-library): New function (ada-mode-hook): Always load a project file when a file is opened, so that the casing exceptions are correctly read. (ada-operator-re): Add all missing operators ("abs", "rem", "**"). (ada-parse-prj-file): Use find-file-noselect instead of find-file to open the project file, since the latter does not work with speedbar Get default values before loading the prj file, or the default executable file name is wrong. Use the absolute value of src_dir to initialize ada-search-directories and compilation-search-path,... Add the standard runtime library to the search path for find-file. (ada-prj-default-debugger): Was missing an opening '{' (ada-prj-default-bind-opt, ada-prj-default-link-opt): New variables. (ada-prj-default-gnatmake-opt): New variable (ada-prj-find-prj-file): Handles non-file buffers For non-Ada buffers, the project file is the default one Save the windows configuration before displaying the menu. (ada-prj-src-dir, ada-prj-obj-dir, ada-prj-comp-opt,...): Removed (ada-read-identifier): Fix xrefs on operators (for "mod", "and", ...) regexp-quote identifiers names to support operators +, -,... in regexps. (ada-remote): New function. (ada-run-application): Erase the output buffer before starting the run Support remote execution of the application. Use call-process, or the arguments are incorrectly parsed (ada-set-default-project-file): Reread the content of the active project file, not the one from the current buffer When a project file is set as the default project, all directories are automatically associated with it. (ada-set-environment): New function (ada-treat-cmd-string): New special variable ${current} (ada-treat-cmd-string): Revised. The substitution is now done for any ${...} substring (ada-xref-current): If no body was found, compiles the spec instead. Setup ADA_{SOURCE,OBJECTS}_PATH before running the compiler to get rid of command line length limitations. (ada-xref-get-project-field): New function (ada-xref-project-files): New variable (ada-xref-runtime-library-specs-path) (ada-xref-runtime-library-ali-path): New variables (ada-xref-set-default-prj-values): Default run command now does a cd to the build directory. New field: main_unit Provide a default file name even if the current buffer has no prj file.
author Gerd Moellmann <gerd@gnu.org>
date Mon, 24 Jul 2000 11:13:11 +0000
parents 2f88e6f0d32b
children 038a08ffb9f8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
848
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
1 ;;; byte-opt.el --- the optimization passes of the emacs-lisp byte compiler.
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
2
27823
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
3 ;;; Copyright (c) 1991, 1994, 2000 Free Software Foundation, Inc.
848
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
4
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
5 ;; Author: Jamie Zawinski <jwz@lucid.com>
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
6 ;; Hallvard Furuseth <hbf@ulrik.uio.no>
27823
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
7 ;; Maintainer: FSF
848
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
8 ;; Keywords: internal
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
848
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
15 ;; any later version.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
20 ;; GNU General Public License for more details.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
25 ;; Boston, MA 02111-1307, USA.
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26
848
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
27 ;;; Commentary:
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
28
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
29 ;; ========================================================================
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
30 ;; "No matter how hard you try, you can't make a racehorse out of a pig.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
31 ;; You can, however, make a faster pig."
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
32 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
33 ;; Or, to put it another way, the emacs byte compiler is a VW Bug. This code
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
34 ;; makes it be a VW Bug with fuel injection and a turbocharger... You're
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
35 ;; still not going to make it go faster than 70 mph, but it might be easier
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
36 ;; to get it there.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
37 ;;
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
39 ;; TO DO:
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
40 ;;
29580
2f88e6f0d32b (byte-compile-log-lap-1)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29053
diff changeset
41 ;; (apply (lambda (x &rest y) ...) 1 (foo))
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
42 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
43 ;; maintain a list of functions known not to access any global variables
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
44 ;; (actually, give them a 'dynamically-safe property) and then
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
45 ;; (let ( v1 v2 ... vM vN ) <...dynamically-safe...> ) ==>
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
46 ;; (let ( v1 v2 ... vM ) vN <...dynamically-safe...> )
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
47 ;; by recursing on this, we might be able to eliminate the entire let.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
48 ;; However certain variables should never have their bindings optimized
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
49 ;; away, because they affect everything.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
50 ;; (put 'debug-on-error 'binding-is-magic t)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
51 ;; (put 'debug-on-abort 'binding-is-magic t)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
52 ;; (put 'debug-on-next-call 'binding-is-magic t)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
53 ;; (put 'mocklisp-arguments 'binding-is-magic t)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
54 ;; (put 'inhibit-quit 'binding-is-magic t)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
55 ;; (put 'quit-flag 'binding-is-magic t)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
56 ;; (put 't 'binding-is-magic t)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
57 ;; (put 'nil 'binding-is-magic t)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
58 ;; possibly also
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
59 ;; (put 'gc-cons-threshold 'binding-is-magic t)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
60 ;; (put 'track-mouse 'binding-is-magic t)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
61 ;; others?
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
62 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
63 ;; Simple defsubsts often produce forms like
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
64 ;; (let ((v1 (f1)) (v2 (f2)) ...)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
65 ;; (FN v1 v2 ...))
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
66 ;; It would be nice if we could optimize this to
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
67 ;; (FN (f1) (f2) ...)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
68 ;; but we can't unless FN is dynamically-safe (it might be dynamically
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
69 ;; referring to the bindings that the lambda arglist established.)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
70 ;; One of the uncountable lossages introduced by dynamic scope...
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
71 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
72 ;; Maybe there should be a control-structure that says "turn on
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
73 ;; fast-and-loose type-assumptive optimizations here." Then when
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
74 ;; we see a form like (car foo) we can from then on assume that
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
75 ;; the variable foo is of type cons, and optimize based on that.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
76 ;; But, this won't win much because of (you guessed it) dynamic
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
77 ;; scope. Anything down the stack could change the value.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
78 ;; (Another reason it doesn't work is that it is perfectly valid
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
79 ;; to call car with a null argument.) A better approach might
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
80 ;; be to allow type-specification of the form
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
81 ;; (put 'foo 'arg-types '(float (list integer) dynamic))
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
82 ;; (put 'foo 'result-type 'bool)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
83 ;; It should be possible to have these types checked to a certain
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
84 ;; degree.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
85 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
86 ;; collapse common subexpressions
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
87 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
88 ;; It would be nice if redundant sequences could be factored out as well,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
89 ;; when they are known to have no side-effects:
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
90 ;; (list (+ a b c) (+ a b c)) --> a b add c add dup list-2
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
91 ;; but beware of traps like
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
92 ;; (cons (list x y) (list x y))
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
93 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
94 ;; Tail-recursion elimination is not really possible in Emacs Lisp.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
95 ;; Tail-recursion elimination is almost always impossible when all variables
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
96 ;; have dynamic scope, but given that the "return" byteop requires the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
97 ;; binding stack to be empty (rather than emptying it itself), there can be
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
98 ;; no truly tail-recursive Emacs Lisp functions that take any arguments or
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
99 ;; make any bindings.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
100 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
101 ;; Here is an example of an Emacs Lisp function which could safely be
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
102 ;; byte-compiled tail-recursively:
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
103 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
104 ;; (defun tail-map (fn list)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
105 ;; (cond (list
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
106 ;; (funcall fn (car list))
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
107 ;; (tail-map fn (cdr list)))))
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
108 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
109 ;; However, if there was even a single let-binding around the COND,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
110 ;; it could not be byte-compiled, because there would be an "unbind"
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
111 ;; byte-op between the final "call" and "return." Adding a
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
112 ;; Bunbind_all byteop would fix this.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
113 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
114 ;; (defun foo (x y z) ... (foo a b c))
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
115 ;; ... (const foo) (varref a) (varref b) (varref c) (call 3) END: (return)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
116 ;; ... (varref a) (varbind x) (varref b) (varbind y) (varref c) (varbind z) (goto 0) END: (unbind-all) (return)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
117 ;; ... (varref a) (varset x) (varref b) (varset y) (varref c) (varset z) (goto 0) END: (return)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
118 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
119 ;; this also can be considered tail recursion:
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
120 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
121 ;; ... (const foo) (varref a) (call 1) (goto X) ... X: (return)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
122 ;; could generalize this by doing the optimization
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
123 ;; (goto X) ... X: (return) --> (return)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
124 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
125 ;; But this doesn't solve all of the problems: although by doing tail-
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
126 ;; recursion elimination in this way, the call-stack does not grow, the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
127 ;; binding-stack would grow with each recursive step, and would eventually
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
128 ;; overflow. I don't believe there is any way around this without lexical
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
129 ;; scope.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
130 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
131 ;; Wouldn't it be nice if Emacs Lisp had lexical scope.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
132 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
133 ;; Idea: the form (lexical-scope) in a file means that the file may be
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
134 ;; compiled lexically. This proclamation is file-local. Then, within
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
135 ;; that file, "let" would establish lexical bindings, and "let-dynamic"
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
136 ;; would do things the old way. (Or we could use CL "declare" forms.)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
137 ;; We'd have to notice defvars and defconsts, since those variables should
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
138 ;; always be dynamic, and attempting to do a lexical binding of them
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
139 ;; should simply do a dynamic binding instead.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
140 ;; But! We need to know about variables that were not necessarily defvarred
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
141 ;; in the file being compiled (doing a boundp check isn't good enough.)
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
142 ;; Fdefvar() would have to be modified to add something to the plist.
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
143 ;;
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
144 ;; A major disadvantage of this scheme is that the interpreter and compiler
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
145 ;; would have different semantics for files compiled with (dynamic-scope).
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
146 ;; Since this would be a file-local optimization, there would be no way to
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
147 ;; modify the interpreter to obey this (unless the loader was hacked
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13790
diff changeset
148 ;; in some grody way, but that's a really bad idea.)
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
149
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
150 ;; Other things to consider:
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
151
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
152 ;;;;; Associative math should recognize subcalls to identical function:
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
153 ;;;(disassemble (lambda (x) (+ (+ (foo) 1) (+ (bar) 2))))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
154 ;;;;; This should generate the same as (1+ x) and (1- x)
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
155
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
156 ;;;(disassemble (lambda (x) (cons (+ x 1) (- x 1))))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
157 ;;;;; An awful lot of functions always return a non-nil value. If they're
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
158 ;;;;; error free also they may act as true-constants.
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
159
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
160 ;;;(disassemble (lambda (x) (and (point) (foo))))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
161 ;;;;; When
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
162 ;;;;; - all but one arguments to a function are constant
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
163 ;;;;; - the non-constant argument is an if-expression (cond-expression?)
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
164 ;;;;; then the outer function can be distributed. If the guarding
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
165 ;;;;; condition is side-effect-free [assignment-free] then the other
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
166 ;;;;; arguments may be any expressions. Since, however, the code size
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
167 ;;;;; can increase this way they should be "simple". Compare:
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
168
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
169 ;;;(disassemble (lambda (x) (eq (if (point) 'a 'b) 'c)))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
170 ;;;(disassemble (lambda (x) (if (point) (eq 'a 'c) (eq 'b 'c))))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
171
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
172 ;;;;; (car (cons A B)) -> (progn B A)
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
173 ;;;(disassemble (lambda (x) (car (cons (foo) 42))))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
174
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
175 ;;;;; (cdr (cons A B)) -> (progn A B)
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
176 ;;;(disassemble (lambda (x) (cdr (cons 42 (foo)))))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
177
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
178 ;;;;; (car (list A B ...)) -> (progn B ... A)
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
179 ;;;(disassemble (lambda (x) (car (list (foo) 42 (bar)))))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
180
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
181 ;;;;; (cdr (list A B ...)) -> (progn A (list B ...))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
182 ;;;(disassemble (lambda (x) (cdr (list 42 (foo) (bar)))))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
183
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
184
848
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
185 ;;; Code:
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
186
23822
34fa38b26638 Require bytecomp for byte-goto-ops.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 23177
diff changeset
187 (require 'bytecomp)
34fa38b26638 Require bytecomp for byte-goto-ops.
Markus Rost <rost@math.uni-bielefeld.de>
parents: 23177
diff changeset
188
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
189 (defun byte-compile-log-lap-1 (format &rest args)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
190 (if (aref byte-code-vector 0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
191 (error "The old version of the disassembler is loaded. Reload new-bytecomp as well."))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
192 (byte-compile-log-1
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
193 (apply 'format format
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
194 (let (c a)
29580
2f88e6f0d32b (byte-compile-log-lap-1)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29053
diff changeset
195 (mapcar (lambda (arg)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
196 (if (not (consp arg))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
197 (if (and (symbolp arg)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
198 (string-match "^byte-" (symbol-name arg)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
199 (intern (substring (symbol-name arg) 5))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
200 arg)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
201 (if (integerp (setq c (car arg)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
202 (error "non-symbolic byte-op %s" c))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
203 (if (eq c 'TAG)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
204 (setq c arg)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
205 (setq a (cond ((memq c byte-goto-ops)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
206 (car (cdr (cdr arg))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
207 ((memq c byte-constref-ops)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
208 (car (cdr arg)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
209 (t (cdr arg))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
210 (setq c (symbol-name c))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
211 (if (string-match "^byte-." c)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
212 (setq c (intern (substring c 5)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
213 (if (eq c 'constant) (setq c 'const))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
214 (if (and (eq (cdr arg) 0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
215 (not (memq c '(unbind call const))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
216 c
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
217 (format "(%s %s)" c a))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
218 args)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
219
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
220 (defmacro byte-compile-log-lap (format-string &rest args)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
221 (list 'and
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
222 '(memq byte-optimize-log '(t byte))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
223 (cons 'byte-compile-log-lap-1
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
224 (cons format-string args))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
225
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
226
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
227 ;;; byte-compile optimizers to support inlining
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
228
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
229 (put 'inline 'byte-optimizer 'byte-optimize-inline-handler)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
230
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
231 (defun byte-optimize-inline-handler (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
232 "byte-optimize-handler for the `inline' special-form."
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
233 (cons 'progn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
234 (mapcar
29580
2f88e6f0d32b (byte-compile-log-lap-1)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29053
diff changeset
235 (lambda (sexp)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
236 (let ((fn (car-safe sexp)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
237 (if (and (symbolp fn)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
238 (or (cdr (assq fn byte-compile-function-environment))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
239 (and (fboundp fn)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
240 (not (or (cdr (assq fn byte-compile-macro-environment))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
241 (and (consp (setq fn (symbol-function fn)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
242 (eq (car fn) 'macro))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
243 (subrp fn))))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
244 (byte-compile-inline-expand sexp)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
245 sexp)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
246 (cdr form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
247
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
248
767
02bfc9709961 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 757
diff changeset
249 ;; Splice the given lap code into the current instruction stream.
02bfc9709961 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 757
diff changeset
250 ;; If it has any labels in it, you're responsible for making sure there
02bfc9709961 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 757
diff changeset
251 ;; are no collisions, and that byte-compile-tag-number is reasonable
02bfc9709961 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 757
diff changeset
252 ;; after this is spliced in. The provided list is destroyed.
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
253 (defun byte-inline-lapcode (lap)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
254 (setq byte-compile-output (nconc (nreverse lap) byte-compile-output)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
255
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
256
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
257 (defun byte-compile-inline-expand (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
258 (let* ((name (car form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
259 (fn (or (cdr (assq name byte-compile-function-environment))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
260 (and (fboundp name) (symbol-function name)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
261 (if (null fn)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
262 (progn
28423
6b92fbc04c23 (byte-compile-inline-expand): Fix bug
Gerd Moellmann <gerd@gnu.org>
parents: 27823
diff changeset
263 (byte-compile-warn "Attempt to inline `%s' before it was defined"
6b92fbc04c23 (byte-compile-inline-expand): Fix bug
Gerd Moellmann <gerd@gnu.org>
parents: 27823
diff changeset
264 name)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
265 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
266 ;; else
28440
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
267 (when (and (consp fn) (eq (car fn) 'autoload))
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
268 (load (nth 2 fn))
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
269 (setq fn (or (and (fboundp name) (symbol-function name))
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
270 (cdr (assq name byte-compile-function-environment)))))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271 (if (and (consp fn) (eq (car fn) 'autoload))
28423
6b92fbc04c23 (byte-compile-inline-expand): Fix bug
Gerd Moellmann <gerd@gnu.org>
parents: 27823
diff changeset
272 (error "File `%s' didn't define `%s'" (nth 2 fn) name))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
273 (if (symbolp fn)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
274 (byte-compile-inline-expand (cons fn (cdr form)))
1818
7e3322619e46 compiled-function-p has been renamed to byte-code-function-p.
Jim Blandy <jimb@redhat.com>
parents: 957
diff changeset
275 (if (byte-code-function-p fn)
20778
6d7fffd02e26 (byte-compile-inline-expand): Use string-as-unibyte, if it is defined.
Richard M. Stallman <rms@gnu.org>
parents: 20749
diff changeset
276 (let (string)
11203
31b8e30c1afb (byte-compile-inline-expand): Fetch actual bytecode
Karl Heuer <kwzh@gnu.org>
parents: 8466
diff changeset
277 (fetch-bytecode fn)
20778
6d7fffd02e26 (byte-compile-inline-expand): Use string-as-unibyte, if it is defined.
Richard M. Stallman <rms@gnu.org>
parents: 20749
diff changeset
278 (setq string (aref fn 1))
6d7fffd02e26 (byte-compile-inline-expand): Use string-as-unibyte, if it is defined.
Richard M. Stallman <rms@gnu.org>
parents: 20749
diff changeset
279 (if (fboundp 'string-as-unibyte)
6d7fffd02e26 (byte-compile-inline-expand): Use string-as-unibyte, if it is defined.
Richard M. Stallman <rms@gnu.org>
parents: 20749
diff changeset
280 (setq string (string-as-unibyte string)))
11203
31b8e30c1afb (byte-compile-inline-expand): Fetch actual bytecode
Karl Heuer <kwzh@gnu.org>
parents: 8466
diff changeset
281 (cons (list 'lambda (aref fn 0)
20778
6d7fffd02e26 (byte-compile-inline-expand): Use string-as-unibyte, if it is defined.
Richard M. Stallman <rms@gnu.org>
parents: 20749
diff changeset
282 (list 'byte-code string (aref fn 2) (aref fn 3)))
11203
31b8e30c1afb (byte-compile-inline-expand): Fetch actual bytecode
Karl Heuer <kwzh@gnu.org>
parents: 8466
diff changeset
283 (cdr form)))
23177
e3e7eca80c06 (byte-compile-inline-expand):
Karl Heuer <kwzh@gnu.org>
parents: 22686
diff changeset
284 (if (eq (car-safe fn) 'lambda)
e3e7eca80c06 (byte-compile-inline-expand):
Karl Heuer <kwzh@gnu.org>
parents: 22686
diff changeset
285 (cons fn (cdr form))
e3e7eca80c06 (byte-compile-inline-expand):
Karl Heuer <kwzh@gnu.org>
parents: 22686
diff changeset
286 ;; Give up on inlining.
e3e7eca80c06 (byte-compile-inline-expand):
Karl Heuer <kwzh@gnu.org>
parents: 22686
diff changeset
287 form))))))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
289 ;;; ((lambda ...) ...)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
290 ;;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
291 (defun byte-compile-unfold-lambda (form &optional name)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
292 (or name (setq name "anonymous lambda"))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
293 (let ((lambda (car form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
294 (values (cdr form)))
1818
7e3322619e46 compiled-function-p has been renamed to byte-code-function-p.
Jim Blandy <jimb@redhat.com>
parents: 957
diff changeset
295 (if (byte-code-function-p lambda)
957
2619b7a9c11e entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 902
diff changeset
296 (setq lambda (list 'lambda (aref lambda 0)
2619b7a9c11e entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 902
diff changeset
297 (list 'byte-code (aref lambda 1)
2619b7a9c11e entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 902
diff changeset
298 (aref lambda 2) (aref lambda 3)))))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
299 (let ((arglist (nth 1 lambda))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
300 (body (cdr (cdr lambda)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
301 optionalp restp
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
302 bindings)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
303 (if (and (stringp (car body)) (cdr body))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
304 (setq body (cdr body)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
305 (if (and (consp (car body)) (eq 'interactive (car (car body))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
306 (setq body (cdr body)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
307 (while arglist
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
308 (cond ((eq (car arglist) '&optional)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
309 ;; ok, I'll let this slide because funcall_lambda() does...
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
310 ;; (if optionalp (error "multiple &optional keywords in %s" name))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
311 (if restp (error "&optional found after &rest in %s" name))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
312 (if (null (cdr arglist))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
313 (error "nothing after &optional in %s" name))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
314 (setq optionalp t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
315 ((eq (car arglist) '&rest)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
316 ;; ...but it is by no stretch of the imagination a reasonable
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
317 ;; thing that funcall_lambda() allows (&rest x y) and
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
318 ;; (&rest x &optional y) in arglists.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
319 (if (null (cdr arglist))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
320 (error "nothing after &rest in %s" name))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
321 (if (cdr (cdr arglist))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
322 (error "multiple vars after &rest in %s" name))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
323 (setq restp t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
324 (restp
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
325 (setq bindings (cons (list (car arglist)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
326 (and values (cons 'list values)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
327 bindings)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
328 values nil))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
329 ((and (not optionalp) (null values))
28440
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
330 (byte-compile-warn "Attempt to open-code `%s' with too few arguments" name)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
331 (setq arglist nil values 'too-few))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
332 (t
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
333 (setq bindings (cons (list (car arglist) (car values))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
334 bindings)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
335 values (cdr values))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
336 (setq arglist (cdr arglist)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
337 (if values
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
338 (progn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
339 (or (eq values 'too-few)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
340 (byte-compile-warn
28440
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
341 "Attempt to open-code `%s' with too many arguments" name))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
342 form)
13790
10c76db77107 (byte-compile-unfold-lambda): Recursively optimize body.
Karl Heuer <kwzh@gnu.org>
parents: 13060
diff changeset
343 (setq body (mapcar 'byte-optimize-form body))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
344 (let ((newform
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
345 (if bindings
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
346 (cons 'let (cons (nreverse bindings) body))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
347 (cons 'progn body))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
348 (byte-compile-log " %s\t==>\t%s" form newform)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
349 newform)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
350
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
351
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
352 ;;; implementing source-level optimizers
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
353
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
354 (defun byte-optimize-form-code-walker (form for-effect)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
355 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
356 ;; For normal function calls, We can just mapcar the optimizer the cdr. But
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
357 ;; we need to have special knowledge of the syntax of the special forms
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
358 ;; like let and defun (that's why they're special forms :-). (Actually,
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
359 ;; the important aspect is that they are subrs that don't evaluate all of
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
360 ;; their args.)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
361 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
362 (let ((fn (car-safe form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
363 tmp)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
364 (cond ((not (consp form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
365 (if (not (and for-effect
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
366 (or byte-compile-delete-errors
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
367 (not (symbolp form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
368 (eq form t))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
369 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
370 ((eq fn 'quote)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
371 (if (cdr (cdr form))
28440
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
372 (byte-compile-warn "Malformed quote form: `%s'"
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
373 (prin1-to-string form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
374 ;; map (quote nil) to nil to simplify optimizer logic.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
375 ;; map quoted constants to nil if for-effect (just because).
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
376 (and (nth 1 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
377 (not for-effect)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
378 form))
1818
7e3322619e46 compiled-function-p has been renamed to byte-code-function-p.
Jim Blandy <jimb@redhat.com>
parents: 957
diff changeset
379 ((or (byte-code-function-p fn)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
380 (eq 'lambda (car-safe fn)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
381 (byte-compile-unfold-lambda form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
382 ((memq fn '(let let*))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
383 ;; recursively enter the optimizer for the bindings and body
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
384 ;; of a let or let*. This for depth-firstness: forms that
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
385 ;; are more deeply nested are optimized first.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
386 (cons fn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
387 (cons
29580
2f88e6f0d32b (byte-compile-log-lap-1)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29053
diff changeset
388 (mapcar (lambda (binding)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
389 (if (symbolp binding)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
390 binding
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
391 (if (cdr (cdr binding))
28440
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
392 (byte-compile-warn "Malformed let binding: `%s'"
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
393 (prin1-to-string binding)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
394 (list (car binding)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
395 (byte-optimize-form (nth 1 binding) nil))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
396 (nth 1 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
397 (byte-optimize-body (cdr (cdr form)) for-effect))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
398 ((eq fn 'cond)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
399 (cons fn
29580
2f88e6f0d32b (byte-compile-log-lap-1)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29053
diff changeset
400 (mapcar (lambda (clause)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
401 (if (consp clause)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
402 (cons
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
403 (byte-optimize-form (car clause) nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
404 (byte-optimize-body (cdr clause) for-effect))
28440
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
405 (byte-compile-warn "Malformed cond form: `%s'"
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
406 (prin1-to-string clause))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
407 clause))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
408 (cdr form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
409 ((eq fn 'progn)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
410 ;; as an extra added bonus, this simplifies (progn <x>) --> <x>
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
411 (if (cdr (cdr form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
412 (progn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
413 (setq tmp (byte-optimize-body (cdr form) for-effect))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
414 (if (cdr tmp) (cons 'progn tmp) (car tmp)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
415 (byte-optimize-form (nth 1 form) for-effect)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
416 ((eq fn 'prog1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
417 (if (cdr (cdr form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
418 (cons 'prog1
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
419 (cons (byte-optimize-form (nth 1 form) for-effect)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
420 (byte-optimize-body (cdr (cdr form)) t)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
421 (byte-optimize-form (nth 1 form) for-effect)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
422 ((eq fn 'prog2)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
423 (cons 'prog2
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
424 (cons (byte-optimize-form (nth 1 form) t)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
425 (cons (byte-optimize-form (nth 2 form) for-effect)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
426 (byte-optimize-body (cdr (cdr (cdr form))) t)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
427
16276
f98b8c0b6414 (byte-optimize-form-code-walker):
Richard M. Stallman <rms@gnu.org>
parents: 14641
diff changeset
428 ((memq fn '(save-excursion save-restriction save-current-buffer))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
429 ;; those subrs which have an implicit progn; it's not quite good
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
430 ;; enough to treat these like normal function calls.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
431 ;; This can turn (save-excursion ...) into (save-excursion) which
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
432 ;; will be optimized away in the lap-optimize pass.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
433 (cons fn (byte-optimize-body (cdr form) for-effect)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
434
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
435 ((eq fn 'with-output-to-temp-buffer)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
436 ;; this is just like the above, except for the first argument.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
437 (cons fn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
438 (cons
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
439 (byte-optimize-form (nth 1 form) nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
440 (byte-optimize-body (cdr (cdr form)) for-effect))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
441
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
442 ((eq fn 'if)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
443 (cons fn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
444 (cons (byte-optimize-form (nth 1 form) nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
445 (cons
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
446 (byte-optimize-form (nth 2 form) for-effect)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
447 (byte-optimize-body (nthcdr 3 form) for-effect)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
448
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
449 ((memq fn '(and or)) ; remember, and/or are control structures.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
450 ;; take forms off the back until we can't any more.
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3138
diff changeset
451 ;; In the future it could conceivably be a problem that the
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
452 ;; subexpressions of these forms are optimized in the reverse
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
453 ;; order, but it's ok for now.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
454 (if for-effect
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
455 (let ((backwards (reverse (cdr form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
456 (while (and backwards
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
457 (null (setcar backwards
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
458 (byte-optimize-form (car backwards)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
459 for-effect))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
460 (setq backwards (cdr backwards)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
461 (if (and (cdr form) (null backwards))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
462 (byte-compile-log
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
463 " all subforms of %s called for effect; deleted" form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
464 (and backwards
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
465 (cons fn (nreverse backwards))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
466 (cons fn (mapcar 'byte-optimize-form (cdr form)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
467
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
468 ((eq fn 'interactive)
28440
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
469 (byte-compile-warn "Misplaced interactive spec: `%s'"
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
470 (prin1-to-string form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
471 nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
472
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
473 ((memq fn '(defun defmacro function
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
474 condition-case save-window-excursion))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
475 ;; These forms are compiled as constants or by breaking out
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
476 ;; all the subexpressions and compiling them separately.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
477 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
478
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
479 ((eq fn 'unwind-protect)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
480 ;; the "protected" part of an unwind-protect is compiled (and thus
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
481 ;; optimized) as a top-level form, so don't do it here. But the
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
482 ;; non-protected part has the same for-effect status as the
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
483 ;; unwind-protect itself. (The protected part is always for effect,
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
484 ;; but that isn't handled properly yet.)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
485 (cons fn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
486 (cons (byte-optimize-form (nth 1 form) for-effect)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
487 (cdr (cdr form)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
488
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
489 ((eq fn 'catch)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
490 ;; the body of a catch is compiled (and thus optimized) as a
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
491 ;; top-level form, so don't do it here. The tag is never
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
492 ;; for-effect. The body should have the same for-effect status
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
493 ;; as the catch form itself, but that isn't handled properly yet.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
494 (cons fn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
495 (cons (byte-optimize-form (nth 1 form) nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
496 (cdr (cdr form)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
497
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
498 ;; If optimization is on, this is the only place that macros are
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
499 ;; expanded. If optimization is off, then macroexpansion happens
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
500 ;; in byte-compile-form. Otherwise, the macros are already expanded
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
501 ;; by the time that is reached.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
502 ((not (eq form
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
503 (setq form (macroexpand form
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
504 byte-compile-macro-environment))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
505 (byte-optimize-form form for-effect))
20749
e87544dbfacb (byte-optimize-form-code-walker):
Richard M. Stallman <rms@gnu.org>
parents: 20414
diff changeset
506
e87544dbfacb (byte-optimize-form-code-walker):
Richard M. Stallman <rms@gnu.org>
parents: 20414
diff changeset
507 ;; Support compiler macros as in cl.el.
e87544dbfacb (byte-optimize-form-code-walker):
Richard M. Stallman <rms@gnu.org>
parents: 20414
diff changeset
508 ((and (fboundp 'compiler-macroexpand)
20874
223c220043af (byte-optimize-form-code-walker): Only call compiler-macroexpand if
Richard M. Stallman <rms@gnu.org>
parents: 20780
diff changeset
509 (symbolp (car-safe form))
223c220043af (byte-optimize-form-code-walker): Only call compiler-macroexpand if
Richard M. Stallman <rms@gnu.org>
parents: 20780
diff changeset
510 (get (car-safe form) 'cl-compiler-macro)
20749
e87544dbfacb (byte-optimize-form-code-walker):
Richard M. Stallman <rms@gnu.org>
parents: 20414
diff changeset
511 (not (eq form
20780
24c546c71f29 (byte-optimize-form-code-walker): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 20778
diff changeset
512 (setq form (compiler-macroexpand form)))))
20749
e87544dbfacb (byte-optimize-form-code-walker):
Richard M. Stallman <rms@gnu.org>
parents: 20414
diff changeset
513 (byte-optimize-form form for-effect))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
514
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
515 ((not (symbolp fn))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
516 (or (eq 'mocklisp (car-safe fn)) ; ha!
28440
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
517 (byte-compile-warn "`%s' is a malformed function"
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
518 (prin1-to-string fn)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
519 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
520
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
521 ((and for-effect (setq tmp (get fn 'side-effect-free))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
522 (or byte-compile-delete-errors
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
523 (eq tmp 'error-free)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
524 (progn
28440
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
525 (byte-compile-warn "`%s' called for effect"
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
526 (prin1-to-string form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
527 nil)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
528 (byte-compile-log " %s called for effect; deleted" fn)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
529 ;; appending a nil here might not be necessary, but it can't hurt.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
530 (byte-optimize-form
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
531 (cons 'progn (append (cdr form) '(nil))) t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
532
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
533 (t
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
534 ;; Otherwise, no args can be considered to be for-effect,
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
535 ;; even if the called function is for-effect, because we
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
536 ;; don't know anything about that function.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
537 (cons fn (mapcar 'byte-optimize-form (cdr form)))))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
538
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
539
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
540 (defun byte-optimize-form (form &optional for-effect)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
541 "The source-level pass of the optimizer."
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
542 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
543 ;; First, optimize all sub-forms of this one.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
544 (setq form (byte-optimize-form-code-walker form for-effect))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
545 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
546 ;; after optimizing all subforms, optimize this form until it doesn't
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
547 ;; optimize any further. This means that some forms will be passed through
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
548 ;; the optimizer many times, but that's necessary to make the for-effect
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
549 ;; processing do as much as possible.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
550 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
551 (let (opt new)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
552 (if (and (consp form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
553 (symbolp (car form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
554 (or (and for-effect
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
555 ;; we don't have any of these yet, but we might.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
556 (setq opt (get (car form) 'byte-for-effect-optimizer)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
557 (setq opt (get (car form) 'byte-optimizer)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
558 (not (eq form (setq new (funcall opt form)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
559 (progn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
560 ;; (if (equal form new) (error "bogus optimizer -- %s" opt))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
561 (byte-compile-log " %s\t==>\t%s" form new)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
562 (setq new (byte-optimize-form new for-effect))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
563 new)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
564 form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
565
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
566
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
567 (defun byte-optimize-body (forms all-for-effect)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
568 ;; optimize the cdr of a progn or implicit progn; all forms is a list of
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
569 ;; forms, all but the last of which are optimized with the assumption that
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
570 ;; they are being called for effect. the last is for-effect as well if
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
571 ;; all-for-effect is true. returns a new list of forms.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
572 (let ((rest forms)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
573 (result nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
574 fe new)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
575 (while rest
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
576 (setq fe (or all-for-effect (cdr rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
577 (setq new (and (car rest) (byte-optimize-form (car rest) fe)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
578 (if (or new (not fe))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
579 (setq result (cons new result)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
580 (setq rest (cdr rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
581 (nreverse result)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
582
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
583
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
584 ;;; some source-level optimizers
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
585 ;;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
586 ;;; when writing optimizers, be VERY careful that the optimizer returns
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
587 ;;; something not EQ to its argument if and ONLY if it has made a change.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
588 ;;; This implies that you cannot simply destructively modify the list;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
589 ;;; you must return something not EQ to it if you make an optimization.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
590 ;;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
591 ;;; It is now safe to optimize code such that it introduces new bindings.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
592
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3138
diff changeset
593 ;; I'd like this to be a defsubst, but let's not be self-referential...
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
594 (defmacro byte-compile-trueconstp (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
595 ;; Returns non-nil if FORM is a non-nil constant.
27823
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
596 `(cond ((consp ,form) (eq (car ,form) 'quote))
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
597 ((not (symbolp ,form)))
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
598 ((eq ,form t))
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
599 ((keywordp ,form))))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
600
767
02bfc9709961 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 757
diff changeset
601 ;; If the function is being called with constant numeric args,
02bfc9709961 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 757
diff changeset
602 ;; evaluate as much as possible at compile-time. This optimizer
02bfc9709961 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 757
diff changeset
603 ;; assumes that the function is associative, like + or *.
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
604 (defun byte-optimize-associative-math (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
605 (let ((args nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
606 (constants nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
607 (rest (cdr form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
608 (while rest
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
609 (if (numberp (car rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
610 (setq constants (cons (car rest) constants))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
611 (setq args (cons (car rest) args)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
612 (setq rest (cdr rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
613 (if (cdr constants)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
614 (if args
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
615 (list (car form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
616 (apply (car form) constants)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
617 (if (cdr args)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
618 (cons (car form) (nreverse args))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
619 (car args)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
620 (apply (car form) constants))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
621 form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
622
767
02bfc9709961 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 757
diff changeset
623 ;; If the function is being called with constant numeric args,
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
624 ;; evaluate as much as possible at compile-time. This optimizer
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
625 ;; assumes that the function satisfies
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
626 ;; (op x1 x2 ... xn) == (op ...(op (op x1 x2) x3) ...xn)
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
627 ;; like - and /.
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
628 (defun byte-optimize-nonassociative-math (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
629 (if (or (not (numberp (car (cdr form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
630 (not (numberp (car (cdr (cdr form))))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
631 form
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
632 (let ((constant (car (cdr form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
633 (rest (cdr (cdr form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
634 (while (numberp (car rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
635 (setq constant (funcall (car form) constant (car rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
636 rest (cdr rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
637 (if rest
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
638 (cons (car form) (cons constant rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
639 constant))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
640
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
641 ;;(defun byte-optimize-associative-two-args-math (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
642 ;; (setq form (byte-optimize-associative-math form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
643 ;; (if (consp form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
644 ;; (byte-optimize-two-args-left form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
645 ;; form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
646
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
647 ;;(defun byte-optimize-nonassociative-two-args-math (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
648 ;; (setq form (byte-optimize-nonassociative-math form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
649 ;; (if (consp form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
650 ;; (byte-optimize-two-args-right form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
651 ;; form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
652
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
653 (defun byte-optimize-approx-equal (x y)
17680
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
654 (<= (* (abs (- x y)) 100) (abs (+ x y))))
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
655
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
656 ;; Collect all the constants from FORM, after the STARTth arg,
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
657 ;; and apply FUN to them to make one argument at the end.
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
658 ;; For functions that can handle floats, that optimization
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
659 ;; can be incorrect because reordering can cause an overflow
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
660 ;; that would otherwise be avoided by encountering an arg that is a float.
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
661 ;; We avoid this problem by (1) not moving float constants and
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
662 ;; (2) not moving anything if it would cause an overflow.
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
663 (defun byte-optimize-delay-constants-math (form start fun)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
664 ;; Merge all FORM's constants from number START, call FUN on them
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
665 ;; and put the result at the end.
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
666 (let ((rest (nthcdr (1- start) form))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
667 (orig form)
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
668 ;; t means we must check for overflow.
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
669 (overflow (memq fun '(+ *))))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
670 (while (cdr (setq rest (cdr rest)))
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
671 (if (integerp (car rest))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
672 (let (constants)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
673 (setq form (copy-sequence form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
674 rest (nthcdr (1- start) form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
675 (while (setq rest (cdr rest))
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
676 (cond ((integerp (car rest))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
677 (setq constants (cons (car rest) constants))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
678 (setcar rest nil))))
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
679 ;; If necessary, check now for overflow
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
680 ;; that might be caused by reordering.
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
681 (if (and overflow
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
682 ;; We have overflow if the result of doing the arithmetic
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
683 ;; on floats is not even close to the result
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
684 ;; of doing it on integers.
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
685 (not (byte-optimize-approx-equal
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
686 (apply fun (mapcar 'float constants))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
687 (float (apply fun constants)))))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
688 (setq form orig)
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
689 (setq form (nconc (delq nil form)
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
690 (list (apply fun (nreverse constants)))))))))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
691 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
692
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
693 (defun byte-optimize-plus (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
694 (setq form (byte-optimize-delay-constants-math form 1 '+))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
695 (if (memq 0 form) (setq form (delq 0 (copy-sequence form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
696 ;;(setq form (byte-optimize-associative-two-args-math form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
697 (cond ((null (cdr form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
698 (condition-case ()
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
699 (eval form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
700 (error form)))
902
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
701 ;;; It is not safe to delete the function entirely
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
702 ;;; (actually, it would be safe if we know the sole arg
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
703 ;;; is not a marker).
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
704 ;; ((null (cdr (cdr form))) (nth 1 form))
24734
1a05fdaa603b (byte-optimize-plus): Fix 1-arg case.
Richard M. Stallman <rms@gnu.org>
parents: 24713
diff changeset
705 ((null (cddr form))
1a05fdaa603b (byte-optimize-plus): Fix 1-arg case.
Richard M. Stallman <rms@gnu.org>
parents: 24713
diff changeset
706 (if (numberp (nth 1 form))
1a05fdaa603b (byte-optimize-plus): Fix 1-arg case.
Richard M. Stallman <rms@gnu.org>
parents: 24713
diff changeset
707 (nth 1 form)
1a05fdaa603b (byte-optimize-plus): Fix 1-arg case.
Richard M. Stallman <rms@gnu.org>
parents: 24713
diff changeset
708 form))
17680
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
709 ((and (null (nthcdr 3 form))
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
710 (or (memq (nth 1 form) '(1 -1))
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
711 (memq (nth 2 form) '(1 -1))))
20210
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
712 ;; Optimize (+ x 1) into (1+ x) and (+ x -1) into (1- x).
17680
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
713 (let ((integer
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
714 (if (memq (nth 1 form) '(1 -1))
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
715 (nth 1 form)
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
716 (nth 2 form)))
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
717 (other
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
718 (if (memq (nth 1 form) '(1 -1))
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
719 (nth 2 form)
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
720 (nth 1 form))))
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
721 (list (if (eq integer 1) '1+ '1-)
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
722 other)))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
723 (t form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
724
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
725 (defun byte-optimize-minus (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
726 ;; Put constants at the end, except the last constant.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
727 (setq form (byte-optimize-delay-constants-math form 2 '+))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
728 ;; Now only first and last element can be a number.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
729 (let ((last (car (reverse (nthcdr 3 form)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
730 (cond ((eq 0 last)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
731 ;; (- x y ... 0) --> (- x y ...)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
732 (setq form (copy-sequence form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
733 (setcdr (cdr (cdr form)) (delq 0 (nthcdr 3 form))))
17680
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
734 ((equal (nthcdr 2 form) '(1))
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
735 (setq form (list '1- (nth 1 form))))
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
736 ((equal (nthcdr 2 form) '(-1))
fdb29fa454bf (byte-optimize-approx-equal): Use <=, not <.
Richard M. Stallman <rms@gnu.org>
parents: 16941
diff changeset
737 (setq form (list '1+ (nth 1 form))))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
738 ;; If form is (- CONST foo... CONST), merge first and last.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
739 ((and (numberp (nth 1 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
740 (numberp last))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
741 (setq form (nconc (list '- (- (nth 1 form) last) (nth 2 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
742 (delq last (copy-sequence (nthcdr 3 form))))))))
902
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
743 ;;; It is not safe to delete the function entirely
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
744 ;;; (actually, it would be safe if we know the sole arg
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
745 ;;; is not a marker).
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
746 ;;; (if (eq (nth 2 form) 0)
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
747 ;;; (nth 1 form) ; (- x 0) --> x
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
748 (byte-optimize-predicate
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
749 (if (and (null (cdr (cdr (cdr form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
750 (eq (nth 1 form) 0)) ; (- 0 x) --> (- x)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
751 (cons (car form) (cdr (cdr form)))
902
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
752 form))
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
753 ;;; )
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
754 )
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
755
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
756 (defun byte-optimize-multiply (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
757 (setq form (byte-optimize-delay-constants-math form 1 '*))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
758 ;; If there is a constant in FORM, it is now the last element.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
759 (cond ((null (cdr form)) 1)
902
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
760 ;;; It is not safe to delete the function entirely
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
761 ;;; (actually, it would be safe if we know the sole arg
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
762 ;;; is not a marker or if it appears in other arithmetic).
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
763 ;;; ((null (cdr (cdr form))) (nth 1 form))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
764 ((let ((last (car (reverse form))))
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
765 (cond ((eq 0 last) (cons 'progn (cdr form)))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
766 ((eq 1 last) (delq 1 (copy-sequence form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
767 ((eq -1 last) (list '- (delq -1 (copy-sequence form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
768 ((and (eq 2 last)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
769 (memq t (mapcar 'symbolp (cdr form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
770 (prog1 (setq form (delq 2 (copy-sequence form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
771 (while (not (symbolp (car (setq form (cdr form))))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
772 (setcar form (list '+ (car form) (car form)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
773 (form))))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
774
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
775 (defsubst byte-compile-butlast (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
776 (nreverse (cdr (reverse form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
777
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
778 (defun byte-optimize-divide (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
779 (setq form (byte-optimize-delay-constants-math form 2 '*))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
780 (let ((last (car (reverse (cdr (cdr form))))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
781 (if (numberp last)
3138
80ce80f189f7 (byte-optimize-divide): Don't optimize to less than two arguments.
Richard M. Stallman <rms@gnu.org>
parents: 1818
diff changeset
782 (cond ((= (length form) 3)
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
783 (if (and (numberp (nth 1 form))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
784 (not (zerop last))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
785 (condition-case nil
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
786 (/ (nth 1 form) last)
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
787 (error nil)))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
788 (setq form (list 'progn (/ (nth 1 form) last)))))
3138
80ce80f189f7 (byte-optimize-divide): Don't optimize to less than two arguments.
Richard M. Stallman <rms@gnu.org>
parents: 1818
diff changeset
789 ((= last 1)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
790 (setq form (byte-compile-butlast form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
791 ((numberp (nth 1 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
792 (setq form (cons (car form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
793 (cons (/ (nth 1 form) last)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
794 (byte-compile-butlast (cdr (cdr form)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
795 last nil))))
902
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
796 (cond
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
797 ;;; ((null (cdr (cdr form)))
c81d26e85bef *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 848
diff changeset
798 ;;; (nth 1 form))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
799 ((eq (nth 1 form) 0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
800 (append '(progn) (cdr (cdr form)) '(0)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
801 ((eq last -1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
802 (list '- (if (nthcdr 3 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
803 (byte-compile-butlast form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
804 (nth 1 form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
805 (form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
806
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
807 (defun byte-optimize-logmumble (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
808 (setq form (byte-optimize-delay-constants-math form 1 (car form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
809 (byte-optimize-predicate
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
810 (cond ((memq 0 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
811 (setq form (if (eq (car form) 'logand)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
812 (cons 'progn (cdr form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
813 (delq 0 (copy-sequence form)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
814 ((and (eq (car-safe form) 'logior)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
815 (memq -1 form))
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
816 (cons 'progn (cdr form)))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
817 (form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
818
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
819
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
820 (defun byte-optimize-binary-predicate (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
821 (if (byte-compile-constp (nth 1 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
822 (if (byte-compile-constp (nth 2 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
823 (condition-case ()
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
824 (list 'quote (eval form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
825 (error form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
826 ;; This can enable some lapcode optimizations.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
827 (list (car form) (nth 2 form) (nth 1 form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
828 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
829
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
830 (defun byte-optimize-predicate (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
831 (let ((ok t)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
832 (rest (cdr form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
833 (while (and rest ok)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
834 (setq ok (byte-compile-constp (car rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
835 rest (cdr rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
836 (if ok
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
837 (condition-case ()
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
838 (list 'quote (eval form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
839 (error form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
840 form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
841
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
842 (defun byte-optimize-identity (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
843 (if (and (cdr form) (null (cdr (cdr form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
844 (nth 1 form)
28440
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
845 (byte-compile-warn "Identity called with %d arg%s, but requires 1"
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
846 (length (cdr form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
847 (if (= 1 (length (cdr form))) "" "s"))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
848 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
849
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
850 (put 'identity 'byte-optimizer 'byte-optimize-identity)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
851
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
852 (put '+ 'byte-optimizer 'byte-optimize-plus)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
853 (put '* 'byte-optimizer 'byte-optimize-multiply)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
854 (put '- 'byte-optimizer 'byte-optimize-minus)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
855 (put '/ 'byte-optimizer 'byte-optimize-divide)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
856 (put 'max 'byte-optimizer 'byte-optimize-associative-math)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
857 (put 'min 'byte-optimizer 'byte-optimize-associative-math)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
858
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
859 (put '= 'byte-optimizer 'byte-optimize-binary-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
860 (put 'eq 'byte-optimizer 'byte-optimize-binary-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
861 (put 'equal 'byte-optimizer 'byte-optimize-binary-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
862 (put 'string= 'byte-optimizer 'byte-optimize-binary-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
863 (put 'string-equal 'byte-optimizer 'byte-optimize-binary-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
864
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
865 (put '< 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
866 (put '> 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
867 (put '<= 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
868 (put '>= 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
869 (put '1+ 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
870 (put '1- 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
871 (put 'not 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
872 (put 'null 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
873 (put 'memq 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
874 (put 'consp 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
875 (put 'listp 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
876 (put 'symbolp 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
877 (put 'stringp 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
878 (put 'string< 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
879 (put 'string-lessp 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
880
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
881 (put 'logand 'byte-optimizer 'byte-optimize-logmumble)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
882 (put 'logior 'byte-optimizer 'byte-optimize-logmumble)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
883 (put 'logxor 'byte-optimizer 'byte-optimize-logmumble)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
884 (put 'lognot 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
885
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
886 (put 'car 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
887 (put 'cdr 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
888 (put 'car-safe 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
889 (put 'cdr-safe 'byte-optimizer 'byte-optimize-predicate)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
890
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
891
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
892 ;; I'm not convinced that this is necessary. Doesn't the optimizer loop
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
893 ;; take care of this? - Jamie
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
894 ;; I think this may some times be necessary to reduce ie (quote 5) to 5,
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3138
diff changeset
895 ;; so arithmetic optimizers recognize the numeric constant. - Hallvard
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
896 (put 'quote 'byte-optimizer 'byte-optimize-quote)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
897 (defun byte-optimize-quote (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
898 (if (or (consp (nth 1 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
899 (and (symbolp (nth 1 form))
27823
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
900 (not (byte-compile-const-symbol-p form))))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
901 form
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
902 (nth 1 form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
903
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
904 (defun byte-optimize-zerop (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
905 (cond ((numberp (nth 1 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
906 (eval form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
907 (byte-compile-delete-errors
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
908 (list '= (nth 1 form) 0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
909 (form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
910
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
911 (put 'zerop 'byte-optimizer 'byte-optimize-zerop)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
912
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
913 (defun byte-optimize-and (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
914 ;; Simplify if less than 2 args.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
915 ;; if there is a literal nil in the args to `and', throw it and following
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
916 ;; forms away, and surround the `and' with (progn ... nil).
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
917 (cond ((null (cdr form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
918 ((memq nil form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
919 (list 'progn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
920 (byte-optimize-and
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
921 (prog1 (setq form (copy-sequence form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
922 (while (nth 1 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
923 (setq form (cdr form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
924 (setcdr form nil)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
925 nil))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
926 ((null (cdr (cdr form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
927 (nth 1 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
928 ((byte-optimize-predicate form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
929
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
930 (defun byte-optimize-or (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
931 ;; Throw away nil's, and simplify if less than 2 args.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
932 ;; If there is a literal non-nil constant in the args to `or', throw away all
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
933 ;; following forms.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
934 (if (memq nil form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
935 (setq form (delq nil (copy-sequence form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
936 (let ((rest form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
937 (while (cdr (setq rest (cdr rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
938 (if (byte-compile-trueconstp (car rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
939 (setq form (copy-sequence form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
940 rest (setcdr (memq (car rest) form) nil))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
941 (if (cdr (cdr form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
942 (byte-optimize-predicate form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
943 (nth 1 form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
944
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
945 (defun byte-optimize-cond (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
946 ;; if any clauses have a literal nil as their test, throw them away.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
947 ;; if any clause has a literal non-nil constant as its test, throw
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
948 ;; away all following clauses.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
949 (let (rest)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
950 ;; This must be first, to reduce (cond (t ...) (nil)) to (progn t ...)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
951 (while (setq rest (assq nil (cdr form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
952 (setq form (delq rest (copy-sequence form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
953 (if (memq nil (cdr form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
954 (setq form (delq nil (copy-sequence form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
955 (setq rest form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
956 (while (setq rest (cdr rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
957 (cond ((byte-compile-trueconstp (car-safe (car rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
958 (cond ((eq rest (cdr form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
959 (setq form
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
960 (if (cdr (car rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
961 (if (cdr (cdr (car rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
962 (cons 'progn (cdr (car rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
963 (nth 1 (car rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
964 (car (car rest)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
965 ((cdr rest)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
966 (setq form (copy-sequence form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
967 (setcdr (memq (car rest) form) nil)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
968 (setq rest nil)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
969 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
970 ;; Turn (cond (( <x> )) ... ) into (or <x> (cond ... ))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
971 (if (eq 'cond (car-safe form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
972 (let ((clauses (cdr form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
973 (if (and (consp (car clauses))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
974 (null (cdr (car clauses))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
975 (list 'or (car (car clauses))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
976 (byte-optimize-cond
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
977 (cons (car form) (cdr (cdr form)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
978 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
979 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
980
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
981 (defun byte-optimize-if (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
982 ;; (if <true-constant> <then> <else...>) ==> <then>
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
983 ;; (if <false-constant> <then> <else...>) ==> (progn <else...>)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
984 ;; (if <test> nil <else...>) ==> (if (not <test>) (progn <else...>))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
985 ;; (if <test> <then> nil) ==> (if <test> <then>)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
986 (let ((clause (nth 1 form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
987 (cond ((byte-compile-trueconstp clause)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
988 (nth 2 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
989 ((null clause)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
990 (if (nthcdr 4 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
991 (cons 'progn (nthcdr 3 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
992 (nth 3 form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
993 ((nth 2 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
994 (if (equal '(nil) (nthcdr 3 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
995 (list 'if clause (nth 2 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
996 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
997 ((or (nth 3 form) (nthcdr 4 form))
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
998 (list 'if
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
999 ;; Don't make a double negative;
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
1000 ;; instead, take away the one that is there.
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
1001 (if (and (consp clause) (memq (car clause) '(not null))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
1002 (= (length clause) 2)) ; (not xxxx) or (not (xxxx))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
1003 (nth 1 clause)
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
1004 (list 'not clause))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1005 (if (nthcdr 4 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1006 (cons 'progn (nthcdr 3 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1007 (nth 3 form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1008 (t
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1009 (list 'progn clause nil)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1010
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1011 (defun byte-optimize-while (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1012 (if (nth 1 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1013 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1014
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1015 (put 'and 'byte-optimizer 'byte-optimize-and)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1016 (put 'or 'byte-optimizer 'byte-optimize-or)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1017 (put 'cond 'byte-optimizer 'byte-optimize-cond)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1018 (put 'if 'byte-optimizer 'byte-optimize-if)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1019 (put 'while 'byte-optimizer 'byte-optimize-while)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1020
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1021 ;; byte-compile-negation-optimizer lives in bytecomp.el
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1022 (put '/= 'byte-optimizer 'byte-compile-negation-optimizer)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1023 (put 'atom 'byte-optimizer 'byte-compile-negation-optimizer)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1024 (put 'nlistp 'byte-optimizer 'byte-compile-negation-optimizer)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1025
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1026
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1027 (defun byte-optimize-funcall (form)
29580
2f88e6f0d32b (byte-compile-log-lap-1)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29053
diff changeset
1028 ;; (funcall (lambda ...) ...) ==> ((lambda ...) ...)
2f88e6f0d32b (byte-compile-log-lap-1)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29053
diff changeset
1029 ;; (funcall foo ...) ==> (foo ...)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1030 (let ((fn (nth 1 form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1031 (if (memq (car-safe fn) '(quote function))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1032 (cons (nth 1 fn) (cdr (cdr form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1033 form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1034
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1035 (defun byte-optimize-apply (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1036 ;; If the last arg is a literal constant, turn this into a funcall.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1037 ;; The funcall optimizer can then transform (funcall 'foo ...) -> (foo ...).
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1038 (let ((fn (nth 1 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1039 (last (nth (1- (length form)) form))) ; I think this really is fastest
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1040 (or (if (or (null last)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1041 (eq (car-safe last) 'quote))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1042 (if (listp (nth 1 last))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1043 (let ((butlast (nreverse (cdr (reverse (cdr (cdr form)))))))
957
2619b7a9c11e entered into RCS
Jim Blandy <jimb@redhat.com>
parents: 902
diff changeset
1044 (nconc (list 'funcall fn) butlast
29580
2f88e6f0d32b (byte-compile-log-lap-1)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29053
diff changeset
1045 (mapcar (lambda (x) (list 'quote x)) (nth 1 last))))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1046 (byte-compile-warn
28440
45337208670b (byte-compile-inline-expand): Look
Gerd Moellmann <gerd@gnu.org>
parents: 28423
diff changeset
1047 "Last arg to apply can't be a literal atom: `%s'"
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1048 (prin1-to-string last))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1049 nil))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1050 form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1051
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1052 (put 'funcall 'byte-optimizer 'byte-optimize-funcall)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1053 (put 'apply 'byte-optimizer 'byte-optimize-apply)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1054
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1055
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1056 (put 'let 'byte-optimizer 'byte-optimize-letX)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1057 (put 'let* 'byte-optimizer 'byte-optimize-letX)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1058 (defun byte-optimize-letX (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1059 (cond ((null (nth 1 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1060 ;; No bindings
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1061 (cons 'progn (cdr (cdr form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1062 ((or (nth 2 form) (nthcdr 3 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1063 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1064 ;; The body is nil
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1065 ((eq (car form) 'let)
11509
853f52a85d11 (byte-optimize-letX): Use car-safe and cdr-safe.
Richard M. Stallman <rms@gnu.org>
parents: 11203
diff changeset
1066 (append '(progn) (mapcar 'car-safe (mapcar 'cdr-safe (nth 1 form)))
853f52a85d11 (byte-optimize-letX): Use car-safe and cdr-safe.
Richard M. Stallman <rms@gnu.org>
parents: 11203
diff changeset
1067 '(nil)))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1068 (t
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1069 (let ((binds (reverse (nth 1 form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1070 (list 'let* (reverse (cdr binds)) (nth 1 (car binds)) nil)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1071
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1072
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1073 (put 'nth 'byte-optimizer 'byte-optimize-nth)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1074 (defun byte-optimize-nth (form)
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
1075 (if (and (= (safe-length form) 3) (memq (nth 1 form) '(0 1)))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1076 (list 'car (if (zerop (nth 1 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1077 (nth 2 form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1078 (list 'cdr (nth 2 form))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1079 (byte-optimize-predicate form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1080
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1081 (put 'nthcdr 'byte-optimizer 'byte-optimize-nthcdr)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1082 (defun byte-optimize-nthcdr (form)
12550
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
1083 (if (and (= (safe-length form) 3) (not (memq (nth 1 form) '(0 1 2))))
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
1084 (byte-optimize-predicate form)
c33dd1c62d72 (byte-optimize-nth, byte-optimize-nthcdr):
Karl Heuer <kwzh@gnu.org>
parents: 11509
diff changeset
1085 (let ((count (nth 1 form)))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1086 (setq form (nth 2 form))
12737
7b804de92243 (byte-optimize-nthcdr): Fix previous change.
Richard M. Stallman <rms@gnu.org>
parents: 12638
diff changeset
1087 (while (>= (setq count (1- count)) 0)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1088 (setq form (list 'cdr form)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1089 form)))
20210
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
1090
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
1091 (put 'concat 'byte-optimizer 'byte-optimize-concat)
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
1092 (defun byte-optimize-concat (form)
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
1093 (let ((args (cdr form))
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
1094 (constant t))
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
1095 (while (and args constant)
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
1096 (or (byte-compile-constp (car args))
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
1097 (setq constant nil))
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
1098 (setq args (cdr args)))
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
1099 (if constant
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
1100 (eval form)
622d0b6c6445 (byte-optimize-concat): New function.
Karl Heuer <kwzh@gnu.org>
parents: 17680
diff changeset
1101 form)))
25621
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1102
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1103 ;; Avoid having to write forward-... with a negative arg for speed.
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1104 (put 'backward-char 'byte-optimizer 'byte-optimize-backward-char)
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1105 (defun byte-optimize-backward-char (form)
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1106 (cond ((and (= 2 (safe-length form))
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1107 (numberp (nth 1 form)))
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1108 (list 'forward-char (eval (- (nth 1 form)))))
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1109 ((= 1 (safe-length form))
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1110 '(forward-char -1))
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1111 (t form)))
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1112
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1113 (put 'backward-word 'byte-optimizer 'byte-optimize-backward-word)
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1114 (defun byte-optimize-backward-word (form)
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1115 (cond ((and (= 2 (safe-length form))
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1116 (numberp (nth 1 form)))
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1117 (list 'forward-word (eval (- (nth 1 form)))))
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1118 ((= 1 (safe-length form))
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1119 '(forward-char -1))
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1120 (t form)))
27823
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
1121
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
1122 (put 'char-before 'byte-optimizer 'byte-optimize-char-before)
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
1123 (defun byte-optimize-char-before (form)
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
1124 (cond ((= 2 (safe-length form))
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
1125 `(char-after (1- ,(nth 1 form))))
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
1126 ((= 1 (safe-length form))
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
1127 '(char-after (1- (point))))
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
1128 (t form)))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1129
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1130 ;;; enumerating those functions which need not be called if the returned
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1131 ;;; value is not used. That is, something like
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1132 ;;; (progn (list (something-with-side-effects) (yow))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1133 ;;; (foo))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1134 ;;; may safely be turned into
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1135 ;;; (progn (progn (something-with-side-effects) (yow))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1136 ;;; (foo))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1137 ;;; Further optimizations will turn (progn (list 1 2 3) 'foo) into 'foo.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1138
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1139 ;;; I wonder if I missed any :-\)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1140 (let ((side-effect-free-fns
5315
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1141 '(% * + - / /= 1+ 1- < <= = > >= abs acos append aref ash asin atan
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1142 assoc assq
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1143 boundp buffer-file-name buffer-local-variables buffer-modified-p
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1144 buffer-substring
29053
565418f2e425 Update side-effect free function lists.
Dave Love <fx@gnu.org>
parents: 28440
diff changeset
1145 capitalize car-less-than-car car cdr ceiling char-after char-before
565418f2e425 Update side-effect free function lists.
Dave Love <fx@gnu.org>
parents: 28440
diff changeset
1146 concat coordinates-in-window-p
25621
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1147 char-width copy-marker cos count-lines
5315
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1148 default-boundp default-value documentation downcase
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1149 elt exp expt fboundp featurep
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1150 file-directory-p file-exists-p file-locked-p file-name-absolute-p
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1151 file-newer-than-file-p file-readable-p file-symlink-p file-writable-p
25621
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1152 float floor format frame-visible-p
26941
8584ef89a2bd Don't put optimization info on `eql'.
Dave Love <fx@gnu.org>
parents: 25621
diff changeset
1153 get gethash get-buffer get-buffer-window getenv get-file-buffer
8584ef89a2bd Don't put optimization info on `eql'.
Dave Love <fx@gnu.org>
parents: 25621
diff changeset
1154 hash-table-count
5315
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1155 int-to-string
25621
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1156 keymap-parent
27823
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
1157 length local-variable-if-set-p local-variable-p log log10 logand
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
1158 logb logior lognot logxor lsh
5315
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1159 marker-buffer max member memq min mod
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1160 next-window nth nthcdr number-to-string
29053
565418f2e425 Update side-effect free function lists.
Dave Love <fx@gnu.org>
parents: 28440
diff changeset
1161 parse-colon-path prefix-numeric-value previous-window propertize
5315
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1162 radians-to-degrees rassq regexp-quote reverse round
29053
565418f2e425 Update side-effect free function lists.
Dave Love <fx@gnu.org>
parents: 28440
diff changeset
1163 sin sqrt string string< string= string-equal string-lessp string-to-char
25621
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1164 string-to-int string-to-number substring symbol-function symbol-plist
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1165 symbol-value
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1166 tan unibyte-char-to-multibyte upcase user-variable-p vconcat
5315
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1167 window-buffer window-dedicated-p window-edges window-height
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1168 window-hscroll window-minibuffer-p window-width
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1169 zerop))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1170 (side-effect-and-error-free-fns
5315
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1171 '(arrayp atom
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1172 bobp bolp buffer-end buffer-list buffer-size buffer-string bufferp
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1173 car-safe case-table-p cdr-safe char-or-string-p commandp cons consp
25621
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1174 current-buffer current-global-map current-indentation
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1175 current-local-map current-minor-mode-maps
29053
565418f2e425 Update side-effect free function lists.
Dave Love <fx@gnu.org>
parents: 28440
diff changeset
1176 dot dot-marker eobp eolp eq equal eventp
565418f2e425 Update side-effect free function lists.
Dave Love <fx@gnu.org>
parents: 28440
diff changeset
1177 floatp following-char framep
5315
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1178 get-largest-window get-lru-window
26941
8584ef89a2bd Don't put optimization info on `eql'.
Dave Love <fx@gnu.org>
parents: 25621
diff changeset
1179 hash-table-p
5315
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1180 identity ignore integerp integer-or-marker-p interactive-p
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1181 invocation-directory invocation-name
25621
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1182 keymapp
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1183 line-beginning-position line-end-position list listp
5315
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1184 make-marker mark mark-marker markerp memory-limit minibuffer-window
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1185 mouse-movement-p
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1186 natnump nlistp not null number-or-marker-p numberp
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1187 one-window-p overlayp
29053
565418f2e425 Update side-effect free function lists.
Dave Love <fx@gnu.org>
parents: 28440
diff changeset
1188 point point-marker point-min point-max preceding-char processp
25621
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1189 recent-keys recursion-depth
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1190 selected-frame selected-window sequencep stringp subrp symbolp
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1191 standard-case-table standard-syntax-table syntax-table-p
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1192 this-command-keys this-command-keys-vector this-single-command-keys
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1193 this-single-command-raw-keys
5315
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1194 user-full-name user-login-name user-original-login-name
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1195 user-real-login-name user-real-uid user-uid
25621
e263170c30d0 (byte-optimize-backward-char, byte-optimize-backward-word): New
Dave Love <fx@gnu.org>
parents: 25557
diff changeset
1196 vector vectorp visible-frame-list
5315
55a8d59088c1 Add side-effect-free props for many functions.
Richard M. Stallman <rms@gnu.org>
parents: 4755
diff changeset
1197 window-configuration-p window-live-p windowp)))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1198 (while side-effect-free-fns
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1199 (put (car side-effect-free-fns) 'side-effect-free t)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1200 (setq side-effect-free-fns (cdr side-effect-free-fns)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1201 (while side-effect-and-error-free-fns
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1202 (put (car side-effect-and-error-free-fns) 'side-effect-free 'error-free)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1203 (setq side-effect-and-error-free-fns (cdr side-effect-and-error-free-fns)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1204 nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1205
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1206
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1207 (defun byte-compile-splice-in-already-compiled-code (form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1208 ;; form is (byte-code "..." [...] n)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1209 (if (not (memq byte-optimize '(t lap)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1210 (byte-compile-normal-call form)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1211 (byte-inline-lapcode
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1212 (byte-decompile-bytecode-1 (nth 1 form) (nth 2 form) t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1213 (setq byte-compile-maxdepth (max (+ byte-compile-depth (nth 3 form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1214 byte-compile-maxdepth))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1215 (setq byte-compile-depth (1+ byte-compile-depth))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1216
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1217 (put 'byte-code 'byte-compile 'byte-compile-splice-in-already-compiled-code)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1218
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1219
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1220 (defconst byte-constref-ops
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1221 '(byte-constant byte-constant2 byte-varref byte-varset byte-varbind))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1222
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1223 ;;; This function extracts the bitfields from variable-length opcodes.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1224 ;;; Originally defined in disass.el (which no longer uses it.)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1225
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1226 (defun disassemble-offset ()
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1227 "Don't call this!"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1228 ;; fetch and return the offset for the current opcode.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1229 ;; return NIL if this opcode has no offset
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1230 ;; OP, PTR and BYTES are used and set dynamically
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1231 (defvar op)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1232 (defvar ptr)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1233 (defvar bytes)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1234 (cond ((< op byte-nth)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1235 (let ((tem (logand op 7)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1236 (setq op (logand op 248))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1237 (cond ((eq tem 6)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1238 (setq ptr (1+ ptr)) ;offset in next byte
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1239 (aref bytes ptr))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1240 ((eq tem 7)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1241 (setq ptr (1+ ptr)) ;offset in next 2 bytes
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1242 (+ (aref bytes ptr)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1243 (progn (setq ptr (1+ ptr))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1244 (lsh (aref bytes ptr) 8))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1245 (t tem)))) ;offset was in opcode
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1246 ((>= op byte-constant)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1247 (prog1 (- op byte-constant) ;offset in opcode
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1248 (setq op byte-constant)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1249 ((and (>= op byte-constant2)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1250 (<= op byte-goto-if-not-nil-else-pop))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1251 (setq ptr (1+ ptr)) ;offset in next 2 bytes
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1252 (+ (aref bytes ptr)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1253 (progn (setq ptr (1+ ptr))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1254 (lsh (aref bytes ptr) 8))))
848
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
1255 ((and (>= op byte-listN)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1256 (<= op byte-insertN))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1257 (setq ptr (1+ ptr)) ;offset in next byte
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1258 (aref bytes ptr))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1259
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1260
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1261 ;;; This de-compiler is used for inline expansion of compiled functions,
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1262 ;;; and by the disassembler.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1263 ;;;
8292
6857db0f3c82 (byte-decompile-bytecode-1):
Richard M. Stallman <rms@gnu.org>
parents: 7298
diff changeset
1264 ;;; This list contains numbers, which are pc values,
6857db0f3c82 (byte-decompile-bytecode-1):
Richard M. Stallman <rms@gnu.org>
parents: 7298
diff changeset
1265 ;;; before each instruction.
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1266 (defun byte-decompile-bytecode (bytes constvec)
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3138
diff changeset
1267 "Turns BYTECODE into lapcode, referring to CONSTVEC."
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1268 (let ((byte-compile-constants nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1269 (byte-compile-variables nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1270 (byte-compile-tag-number 0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1271 (byte-decompile-bytecode-1 bytes constvec)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1272
767
02bfc9709961 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 757
diff changeset
1273 ;; As byte-decompile-bytecode, but updates
02bfc9709961 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 757
diff changeset
1274 ;; byte-compile-{constants, variables, tag-number}.
8294
cd3d2474ea10 (byte-decompile-bytecode-1): Don't add pc values
Richard M. Stallman <rms@gnu.org>
parents: 8292
diff changeset
1275 ;; If MAKE-SPLICEABLE is true, then `return' opcodes are replaced
767
02bfc9709961 *** empty log message ***
Richard M. Stallman <rms@gnu.org>
parents: 757
diff changeset
1276 ;; with `goto's destined for the end of the code.
8294
cd3d2474ea10 (byte-decompile-bytecode-1): Don't add pc values
Richard M. Stallman <rms@gnu.org>
parents: 8292
diff changeset
1277 ;; That is for use by the compiler.
cd3d2474ea10 (byte-decompile-bytecode-1): Don't add pc values
Richard M. Stallman <rms@gnu.org>
parents: 8292
diff changeset
1278 ;; If MAKE-SPLICEABLE is nil, we are being called for the disassembler.
cd3d2474ea10 (byte-decompile-bytecode-1): Don't add pc values
Richard M. Stallman <rms@gnu.org>
parents: 8292
diff changeset
1279 ;; In that case, we put a pc value into the list
cd3d2474ea10 (byte-decompile-bytecode-1): Don't add pc values
Richard M. Stallman <rms@gnu.org>
parents: 8292
diff changeset
1280 ;; before each insn (or its label).
cd3d2474ea10 (byte-decompile-bytecode-1): Don't add pc values
Richard M. Stallman <rms@gnu.org>
parents: 8292
diff changeset
1281 (defun byte-decompile-bytecode-1 (bytes constvec &optional make-spliceable)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1282 (let ((length (length bytes))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1283 (ptr 0) optr tag tags op offset
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1284 lap tmp
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1285 endtag
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1286 (retcount 0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1287 (while (not (= ptr length))
8294
cd3d2474ea10 (byte-decompile-bytecode-1): Don't add pc values
Richard M. Stallman <rms@gnu.org>
parents: 8292
diff changeset
1288 (or make-spliceable
cd3d2474ea10 (byte-decompile-bytecode-1): Don't add pc values
Richard M. Stallman <rms@gnu.org>
parents: 8292
diff changeset
1289 (setq lap (cons ptr lap)))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1290 (setq op (aref bytes ptr)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1291 optr ptr
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1292 offset (disassemble-offset)) ; this does dynamic-scope magic
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1293 (setq op (aref byte-code-vector op))
848
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
1294 (cond ((memq op byte-goto-ops)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1295 ;; it's a pc
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1296 (setq offset
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1297 (cdr (or (assq offset tags)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1298 (car (setq tags
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1299 (cons (cons offset
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1300 (byte-compile-make-tag))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1301 tags)))))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1302 ((cond ((eq op 'byte-constant2) (setq op 'byte-constant) t)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1303 ((memq op byte-constref-ops)))
22074
b52cdd6c996e (byte-decompile-bytecode-1):
Richard M. Stallman <rms@gnu.org>
parents: 21590
diff changeset
1304 (setq tmp (if (>= offset (length constvec))
b52cdd6c996e (byte-decompile-bytecode-1):
Richard M. Stallman <rms@gnu.org>
parents: 21590
diff changeset
1305 (list 'out-of-range offset)
b52cdd6c996e (byte-decompile-bytecode-1):
Richard M. Stallman <rms@gnu.org>
parents: 21590
diff changeset
1306 (aref constvec offset))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1307 offset (if (eq op 'byte-constant)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1308 (byte-compile-get-constant tmp)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1309 (or (assq tmp byte-compile-variables)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1310 (car (setq byte-compile-variables
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1311 (cons (list tmp)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1312 byte-compile-variables)))))))
8294
cd3d2474ea10 (byte-decompile-bytecode-1): Don't add pc values
Richard M. Stallman <rms@gnu.org>
parents: 8292
diff changeset
1313 ((and make-spliceable
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1314 (eq op 'byte-return))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1315 (if (= ptr (1- length))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1316 (setq op nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1317 (setq offset (or endtag (setq endtag (byte-compile-make-tag)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1318 op 'byte-goto))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1319 ;; lap = ( [ (pc . (op . arg)) ]* )
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1320 (setq lap (cons (cons optr (cons op (or offset 0)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1321 lap))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1322 (setq ptr (1+ ptr)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1323 ;; take off the dummy nil op that we replaced a trailing "return" with.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1324 (let ((rest lap))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1325 (while rest
8292
6857db0f3c82 (byte-decompile-bytecode-1):
Richard M. Stallman <rms@gnu.org>
parents: 7298
diff changeset
1326 (cond ((numberp (car rest)))
6857db0f3c82 (byte-decompile-bytecode-1):
Richard M. Stallman <rms@gnu.org>
parents: 7298
diff changeset
1327 ((setq tmp (assq (car (car rest)) tags))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1328 ;; this addr is jumped to
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1329 (setcdr rest (cons (cons nil (cdr tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1330 (cdr rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1331 (setq tags (delq tmp tags))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1332 (setq rest (cdr rest))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1333 (setq rest (cdr rest))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1334 (if tags (error "optimizer error: missed tags %s" tags))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1335 (if (null (car (cdr (car lap))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1336 (setq lap (cdr lap)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1337 (if endtag
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1338 (setq lap (cons (cons nil endtag) lap)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1339 ;; remove addrs, lap = ( [ (op . arg) | (TAG tagno) ]* )
8292
6857db0f3c82 (byte-decompile-bytecode-1):
Richard M. Stallman <rms@gnu.org>
parents: 7298
diff changeset
1340 (mapcar (function (lambda (elt)
6857db0f3c82 (byte-decompile-bytecode-1):
Richard M. Stallman <rms@gnu.org>
parents: 7298
diff changeset
1341 (if (numberp elt)
6857db0f3c82 (byte-decompile-bytecode-1):
Richard M. Stallman <rms@gnu.org>
parents: 7298
diff changeset
1342 elt
6857db0f3c82 (byte-decompile-bytecode-1):
Richard M. Stallman <rms@gnu.org>
parents: 7298
diff changeset
1343 (cdr elt))))
6857db0f3c82 (byte-decompile-bytecode-1):
Richard M. Stallman <rms@gnu.org>
parents: 7298
diff changeset
1344 (nreverse lap))))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1345
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1346
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1347 ;;; peephole optimizer
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1348
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1349 (defconst byte-tagref-ops (cons 'TAG byte-goto-ops))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1350
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1351 (defconst byte-conditional-ops
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1352 '(byte-goto-if-nil byte-goto-if-not-nil byte-goto-if-nil-else-pop
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1353 byte-goto-if-not-nil-else-pop))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1354
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1355 (defconst byte-after-unbind-ops
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1356 '(byte-constant byte-dup
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1357 byte-symbolp byte-consp byte-stringp byte-listp byte-numberp byte-integerp
21590
ef61a9126a73 (byte-after-unbind-ops): Delete byte-equal.
Richard M. Stallman <rms@gnu.org>
parents: 20874
diff changeset
1358 byte-eq byte-not
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1359 byte-cons byte-list1 byte-list2 ; byte-list3 byte-list4
8466
3cca823100db (byte-after-unbind-ops): Fix paren error wrt doc string.
Richard M. Stallman <rms@gnu.org>
parents: 8294
diff changeset
1360 byte-interactive-p)
3cca823100db (byte-after-unbind-ops): Fix paren error wrt doc string.
Richard M. Stallman <rms@gnu.org>
parents: 8294
diff changeset
1361 ;; How about other side-effect-free-ops? Is it safe to move an
3cca823100db (byte-after-unbind-ops): Fix paren error wrt doc string.
Richard M. Stallman <rms@gnu.org>
parents: 8294
diff changeset
1362 ;; error invocation (such as from nth) out of an unwind-protect?
21590
ef61a9126a73 (byte-after-unbind-ops): Delete byte-equal.
Richard M. Stallman <rms@gnu.org>
parents: 20874
diff changeset
1363 ;; No, it is not, because the unwind-protect forms can alter
ef61a9126a73 (byte-after-unbind-ops): Delete byte-equal.
Richard M. Stallman <rms@gnu.org>
parents: 20874
diff changeset
1364 ;; the inside of the object to which nth would apply.
ef61a9126a73 (byte-after-unbind-ops): Delete byte-equal.
Richard M. Stallman <rms@gnu.org>
parents: 20874
diff changeset
1365 ;; For the same reason, byte-equal was deleted from this list.
8466
3cca823100db (byte-after-unbind-ops): Fix paren error wrt doc string.
Richard M. Stallman <rms@gnu.org>
parents: 8294
diff changeset
1366 "Byte-codes that can be moved past an unbind.")
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1367
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1368 (defconst byte-compile-side-effect-and-error-free-ops
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1369 '(byte-constant byte-dup byte-symbolp byte-consp byte-stringp byte-listp
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1370 byte-integerp byte-numberp byte-eq byte-equal byte-not byte-car-safe
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1371 byte-cdr-safe byte-cons byte-list1 byte-list2 byte-point byte-point-max
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1372 byte-point-min byte-following-char byte-preceding-char
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1373 byte-current-column byte-eolp byte-eobp byte-bolp byte-bobp
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1374 byte-current-buffer byte-interactive-p))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1375
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1376 (defconst byte-compile-side-effect-free-ops
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1377 (nconc
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1378 '(byte-varref byte-nth byte-memq byte-car byte-cdr byte-length byte-aref
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1379 byte-symbol-value byte-get byte-concat2 byte-concat3 byte-sub1 byte-add1
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1380 byte-eqlsign byte-gtr byte-lss byte-leq byte-geq byte-diff byte-negate
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1381 byte-plus byte-max byte-min byte-mult byte-char-after byte-char-syntax
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1382 byte-buffer-substring byte-string= byte-string< byte-nthcdr byte-elt
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1383 byte-member byte-assq byte-quo byte-rem)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1384 byte-compile-side-effect-and-error-free-ops))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1385
14641
4706508583bd Comments censored.
Karl Heuer <kwzh@gnu.org>
parents: 14169
diff changeset
1386 ;;; This crock is because of the way DEFVAR_BOOL variables work.
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1387 ;;; Consider the code
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1388 ;;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1389 ;;; (defun foo (flag)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1390 ;;; (let ((old-pop-ups pop-up-windows)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1391 ;;; (pop-up-windows flag))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1392 ;;; (cond ((not (eq pop-up-windows old-pop-ups))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1393 ;;; (setq old-pop-ups pop-up-windows)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1394 ;;; ...))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1395 ;;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1396 ;;; Uncompiled, old-pop-ups will always be set to nil or t, even if FLAG is
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1397 ;;; something else. But if we optimize
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1398 ;;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1399 ;;; varref flag
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1400 ;;; varbind pop-up-windows
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1401 ;;; varref pop-up-windows
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1402 ;;; not
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1403 ;;; to
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1404 ;;; varref flag
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1405 ;;; dup
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1406 ;;; varbind pop-up-windows
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1407 ;;; not
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1408 ;;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1409 ;;; we break the program, because it will appear that pop-up-windows and
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1410 ;;; old-pop-ups are not EQ when really they are. So we have to know what
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1411 ;;; the BOOL variables are, and not perform this optimization on them.
25557
5eb4b90c57b0 (byte-boolean-vars): Removed. (Now primitive.)
Dave Love <fx@gnu.org>
parents: 25471
diff changeset
1412
5eb4b90c57b0 (byte-boolean-vars): Removed. (Now primitive.)
Dave Love <fx@gnu.org>
parents: 25471
diff changeset
1413 ;;; The variable `byte-boolean-vars' is now primitive and updated
5eb4b90c57b0 (byte-boolean-vars): Removed. (Now primitive.)
Dave Love <fx@gnu.org>
parents: 25471
diff changeset
1414 ;;; automatically by DEFVAR_BOOL.
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1415
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1416 (defun byte-optimize-lapcode (lap &optional for-effect)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1417 "Simple peephole optimizer. LAP is both modified and returned."
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1418 (let (lap0 off0
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1419 lap1 off1
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1420 lap2 off2
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1421 (keep-going 'first-time)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1422 (add-depth 0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1423 rest tmp tmp2 tmp3
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1424 (side-effect-free (if byte-compile-delete-errors
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1425 byte-compile-side-effect-free-ops
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1426 byte-compile-side-effect-and-error-free-ops)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1427 (while keep-going
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1428 (or (eq keep-going 'first-time)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1429 (byte-compile-log-lap " ---- next pass"))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1430 (setq rest lap
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1431 keep-going nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1432 (while rest
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1433 (setq lap0 (car rest)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1434 lap1 (nth 1 rest)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1435 lap2 (nth 2 rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1436
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1437 ;; You may notice that sequences like "dup varset discard" are
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1438 ;; optimized but sequences like "dup varset TAG1: discard" are not.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1439 ;; You may be tempted to change this; resist that temptation.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1440 (cond ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1441 ;; <side-effect-free> pop --> <deleted>
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1442 ;; ...including:
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1443 ;; const-X pop --> <deleted>
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1444 ;; varref-X pop --> <deleted>
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1445 ;; dup pop --> <deleted>
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1446 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1447 ((and (eq 'byte-discard (car lap1))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1448 (memq (car lap0) side-effect-free))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1449 (setq keep-going t)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1450 (setq tmp (aref byte-stack+-info (symbol-value (car lap0))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1451 (setq rest (cdr rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1452 (cond ((= tmp 1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1453 (byte-compile-log-lap
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1454 " %s discard\t-->\t<deleted>" lap0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1455 (setq lap (delq lap0 (delq lap1 lap))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1456 ((= tmp 0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1457 (byte-compile-log-lap
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1458 " %s discard\t-->\t<deleted> discard" lap0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1459 (setq lap (delq lap0 lap)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1460 ((= tmp -1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1461 (byte-compile-log-lap
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1462 " %s discard\t-->\tdiscard discard" lap0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1463 (setcar lap0 'byte-discard)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1464 (setcdr lap0 0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1465 ((error "Optimizer error: too much on the stack"))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1466 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1467 ;; goto*-X X: --> X:
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1468 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1469 ((and (memq (car lap0) byte-goto-ops)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1470 (eq (cdr lap0) lap1))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1471 (cond ((eq (car lap0) 'byte-goto)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1472 (setq lap (delq lap0 lap))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1473 (setq tmp "<deleted>"))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1474 ((memq (car lap0) byte-goto-always-pop-ops)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1475 (setcar lap0 (setq tmp 'byte-discard))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1476 (setcdr lap0 0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1477 ((error "Depth conflict at tag %d" (nth 2 lap0))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1478 (and (memq byte-optimize-log '(t byte))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1479 (byte-compile-log " (goto %s) %s:\t-->\t%s %s:"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1480 (nth 1 lap1) (nth 1 lap1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1481 tmp (nth 1 lap1)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1482 (setq keep-going t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1483 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1484 ;; varset-X varref-X --> dup varset-X
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1485 ;; varbind-X varref-X --> dup varbind-X
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1486 ;; const/dup varset-X varref-X --> const/dup varset-X const/dup
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1487 ;; const/dup varbind-X varref-X --> const/dup varbind-X const/dup
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1488 ;; The latter two can enable other optimizations.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1489 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1490 ((and (eq 'byte-varref (car lap2))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1491 (eq (cdr lap1) (cdr lap2))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1492 (memq (car lap1) '(byte-varset byte-varbind)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1493 (if (and (setq tmp (memq (car (cdr lap2)) byte-boolean-vars))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1494 (not (eq (car lap0) 'byte-constant)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1495 nil
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1496 (setq keep-going t)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1497 (if (memq (car lap0) '(byte-constant byte-dup))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1498 (progn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1499 (setq tmp (if (or (not tmp)
27823
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
1500 (byte-compile-const-symbol-p
08c25ce52bef Change old backquote syntax.
Dave Love <fx@gnu.org>
parents: 26941
diff changeset
1501 (car (cdr lap0))))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1502 (cdr lap0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1503 (byte-compile-get-constant t)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1504 (byte-compile-log-lap " %s %s %s\t-->\t%s %s %s"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1505 lap0 lap1 lap2 lap0 lap1
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1506 (cons (car lap0) tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1507 (setcar lap2 (car lap0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1508 (setcdr lap2 tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1509 (byte-compile-log-lap " %s %s\t-->\tdup %s" lap1 lap2 lap1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1510 (setcar lap2 (car lap1))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1511 (setcar lap1 'byte-dup)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1512 (setcdr lap1 0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1513 ;; The stack depth gets locally increased, so we will
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1514 ;; increase maxdepth in case depth = maxdepth here.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1515 ;; This can cause the third argument to byte-code to
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1516 ;; be larger than necessary.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1517 (setq add-depth 1))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1518 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1519 ;; dup varset-X discard --> varset-X
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1520 ;; dup varbind-X discard --> varbind-X
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1521 ;; (the varbind variant can emerge from other optimizations)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1522 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1523 ((and (eq 'byte-dup (car lap0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1524 (eq 'byte-discard (car lap2))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1525 (memq (car lap1) '(byte-varset byte-varbind)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1526 (byte-compile-log-lap " dup %s discard\t-->\t%s" lap1 lap1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1527 (setq keep-going t
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1528 rest (cdr rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1529 (setq lap (delq lap0 (delq lap2 lap))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1530 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1531 ;; not goto-X-if-nil --> goto-X-if-non-nil
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1532 ;; not goto-X-if-non-nil --> goto-X-if-nil
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1533 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1534 ;; it is wrong to do the same thing for the -else-pop variants.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1535 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1536 ((and (eq 'byte-not (car lap0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1537 (or (eq 'byte-goto-if-nil (car lap1))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1538 (eq 'byte-goto-if-not-nil (car lap1))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1539 (byte-compile-log-lap " not %s\t-->\t%s"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1540 lap1
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1541 (cons
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1542 (if (eq (car lap1) 'byte-goto-if-nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1543 'byte-goto-if-not-nil
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1544 'byte-goto-if-nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1545 (cdr lap1)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1546 (setcar lap1 (if (eq (car lap1) 'byte-goto-if-nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1547 'byte-goto-if-not-nil
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1548 'byte-goto-if-nil))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1549 (setq lap (delq lap0 lap))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1550 (setq keep-going t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1551 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1552 ;; goto-X-if-nil goto-Y X: --> goto-Y-if-non-nil X:
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1553 ;; goto-X-if-non-nil goto-Y X: --> goto-Y-if-nil X:
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1554 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1555 ;; it is wrong to do the same thing for the -else-pop variants.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1556 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1557 ((and (or (eq 'byte-goto-if-nil (car lap0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1558 (eq 'byte-goto-if-not-nil (car lap0))) ; gotoX
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1559 (eq 'byte-goto (car lap1)) ; gotoY
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1560 (eq (cdr lap0) lap2)) ; TAG X
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1561 (let ((inverse (if (eq 'byte-goto-if-nil (car lap0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1562 'byte-goto-if-not-nil 'byte-goto-if-nil)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1563 (byte-compile-log-lap " %s %s %s:\t-->\t%s %s:"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1564 lap0 lap1 lap2
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1565 (cons inverse (cdr lap1)) lap2)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1566 (setq lap (delq lap0 lap))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1567 (setcar lap1 inverse)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1568 (setq keep-going t)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1569 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1570 ;; const goto-if-* --> whatever
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1571 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1572 ((and (eq 'byte-constant (car lap0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1573 (memq (car lap1) byte-conditional-ops))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1574 (cond ((if (or (eq (car lap1) 'byte-goto-if-nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1575 (eq (car lap1) 'byte-goto-if-nil-else-pop))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1576 (car (cdr lap0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1577 (not (car (cdr lap0))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1578 (byte-compile-log-lap " %s %s\t-->\t<deleted>"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1579 lap0 lap1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1580 (setq rest (cdr rest)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1581 lap (delq lap0 (delq lap1 lap))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1582 (t
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1583 (if (memq (car lap1) byte-goto-always-pop-ops)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1584 (progn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1585 (byte-compile-log-lap " %s %s\t-->\t%s"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1586 lap0 lap1 (cons 'byte-goto (cdr lap1)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1587 (setq lap (delq lap0 lap)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1588 (byte-compile-log-lap " %s %s\t-->\t%s" lap0 lap1
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1589 (cons 'byte-goto (cdr lap1))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1590 (setcar lap1 'byte-goto)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1591 (setq keep-going t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1592 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1593 ;; varref-X varref-X --> varref-X dup
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1594 ;; varref-X [dup ...] varref-X --> varref-X [dup ...] dup
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1595 ;; We don't optimize the const-X variations on this here,
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1596 ;; because that would inhibit some goto optimizations; we
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1597 ;; optimize the const-X case after all other optimizations.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1598 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1599 ((and (eq 'byte-varref (car lap0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1600 (progn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1601 (setq tmp (cdr rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1602 (while (eq (car (car tmp)) 'byte-dup)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1603 (setq tmp (cdr tmp)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1604 t)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1605 (eq (cdr lap0) (cdr (car tmp)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1606 (eq 'byte-varref (car (car tmp))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1607 (if (memq byte-optimize-log '(t byte))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1608 (let ((str ""))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1609 (setq tmp2 (cdr rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1610 (while (not (eq tmp tmp2))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1611 (setq tmp2 (cdr tmp2)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1612 str (concat str " dup")))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1613 (byte-compile-log-lap " %s%s %s\t-->\t%s%s dup"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1614 lap0 str lap0 lap0 str)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1615 (setq keep-going t)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1616 (setcar (car tmp) 'byte-dup)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1617 (setcdr (car tmp) 0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1618 (setq rest tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1619 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1620 ;; TAG1: TAG2: --> TAG1: <deleted>
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1621 ;; (and other references to TAG2 are replaced with TAG1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1622 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1623 ((and (eq (car lap0) 'TAG)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1624 (eq (car lap1) 'TAG))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1625 (and (memq byte-optimize-log '(t byte))
3591
507f64624555 Apply typo patches from Paul Eggert.
Jim Blandy <jimb@redhat.com>
parents: 3138
diff changeset
1626 (byte-compile-log " adjacent tags %d and %d merged"
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1627 (nth 1 lap1) (nth 1 lap0)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1628 (setq tmp3 lap)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1629 (while (setq tmp2 (rassq lap0 tmp3))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1630 (setcdr tmp2 lap1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1631 (setq tmp3 (cdr (memq tmp2 tmp3))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1632 (setq lap (delq lap0 lap)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1633 keep-going t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1634 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1635 ;; unused-TAG: --> <deleted>
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1636 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1637 ((and (eq 'TAG (car lap0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1638 (not (rassq lap0 lap)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1639 (and (memq byte-optimize-log '(t byte))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1640 (byte-compile-log " unused tag %d removed" (nth 1 lap0)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1641 (setq lap (delq lap0 lap)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1642 keep-going t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1643 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1644 ;; goto ... --> goto <delete until TAG or end>
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1645 ;; return ... --> return <delete until TAG or end>
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1646 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1647 ((and (memq (car lap0) '(byte-goto byte-return))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1648 (not (memq (car lap1) '(TAG nil))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1649 (setq tmp rest)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1650 (let ((i 0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1651 (opt-p (memq byte-optimize-log '(t lap)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1652 str deleted)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1653 (while (and (setq tmp (cdr tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1654 (not (eq 'TAG (car (car tmp)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1655 (if opt-p (setq deleted (cons (car tmp) deleted)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1656 str (concat str " %s")
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1657 i (1+ i))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1658 (if opt-p
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1659 (let ((tagstr
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1660 (if (eq 'TAG (car (car tmp)))
12638
4adf53113ec9 (byte-optimize-lapcode): Fix format calls.
Richard M. Stallman <rms@gnu.org>
parents: 12550
diff changeset
1661 (format "%d:" (car (cdr (car tmp))))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1662 (or (car tmp) ""))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1663 (if (< i 6)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1664 (apply 'byte-compile-log-lap-1
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1665 (concat " %s" str
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1666 " %s\t-->\t%s <deleted> %s")
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1667 lap0
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1668 (nconc (nreverse deleted)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1669 (list tagstr lap0 tagstr)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1670 (byte-compile-log-lap
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1671 " %s <%d unreachable op%s> %s\t-->\t%s <deleted> %s"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1672 lap0 i (if (= i 1) "" "s")
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1673 tagstr lap0 tagstr))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1674 (rplacd rest tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1675 (setq keep-going t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1676 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1677 ;; <safe-op> unbind --> unbind <safe-op>
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1678 ;; (this may enable other optimizations.)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1679 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1680 ((and (eq 'byte-unbind (car lap1))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1681 (memq (car lap0) byte-after-unbind-ops))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1682 (byte-compile-log-lap " %s %s\t-->\t%s %s" lap0 lap1 lap1 lap0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1683 (setcar rest lap1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1684 (setcar (cdr rest) lap0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1685 (setq keep-going t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1686 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1687 ;; varbind-X unbind-N --> discard unbind-(N-1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1688 ;; save-excursion unbind-N --> unbind-(N-1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1689 ;; save-restriction unbind-N --> unbind-(N-1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1690 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1691 ((and (eq 'byte-unbind (car lap1))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1692 (memq (car lap0) '(byte-varbind byte-save-excursion
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1693 byte-save-restriction))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1694 (< 0 (cdr lap1)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1695 (if (zerop (setcdr lap1 (1- (cdr lap1))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1696 (delq lap1 rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1697 (if (eq (car lap0) 'byte-varbind)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1698 (setcar rest (cons 'byte-discard 0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1699 (setq lap (delq lap0 lap)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1700 (byte-compile-log-lap " %s %s\t-->\t%s %s"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1701 lap0 (cons (car lap1) (1+ (cdr lap1)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1702 (if (eq (car lap0) 'byte-varbind)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1703 (car rest)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1704 (car (cdr rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1705 (if (and (/= 0 (cdr lap1))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1706 (eq (car lap0) 'byte-varbind))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1707 (car (cdr rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1708 ""))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1709 (setq keep-going t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1710 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1711 ;; goto*-X ... X: goto-Y --> goto*-Y
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1712 ;; goto-X ... X: return --> return
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1713 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1714 ((and (memq (car lap0) byte-goto-ops)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1715 (memq (car (setq tmp (nth 1 (memq (cdr lap0) lap))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1716 '(byte-goto byte-return)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1717 (cond ((and (not (eq tmp lap0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1718 (or (eq (car lap0) 'byte-goto)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1719 (eq (car tmp) 'byte-goto)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1720 (byte-compile-log-lap " %s [%s]\t-->\t%s"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1721 (car lap0) tmp tmp)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1722 (if (eq (car tmp) 'byte-return)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1723 (setcar lap0 'byte-return))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1724 (setcdr lap0 (cdr tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1725 (setq keep-going t))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1726 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1727 ;; goto-*-else-pop X ... X: goto-if-* --> whatever
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1728 ;; goto-*-else-pop X ... X: discard --> whatever
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1729 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1730 ((and (memq (car lap0) '(byte-goto-if-nil-else-pop
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1731 byte-goto-if-not-nil-else-pop))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1732 (memq (car (car (setq tmp (cdr (memq (cdr lap0) lap)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1733 (eval-when-compile
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1734 (cons 'byte-discard byte-conditional-ops)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1735 (not (eq lap0 (car tmp))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1736 (setq tmp2 (car tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1737 (setq tmp3 (assq (car lap0) '((byte-goto-if-nil-else-pop
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1738 byte-goto-if-nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1739 (byte-goto-if-not-nil-else-pop
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1740 byte-goto-if-not-nil))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1741 (if (memq (car tmp2) tmp3)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1742 (progn (setcar lap0 (car tmp2))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1743 (setcdr lap0 (cdr tmp2))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1744 (byte-compile-log-lap " %s-else-pop [%s]\t-->\t%s"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1745 (car lap0) tmp2 lap0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1746 ;; Get rid of the -else-pop's and jump one step further.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1747 (or (eq 'TAG (car (nth 1 tmp)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1748 (setcdr tmp (cons (byte-compile-make-tag)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1749 (cdr tmp))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1750 (byte-compile-log-lap " %s [%s]\t-->\t%s <skip>"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1751 (car lap0) tmp2 (nth 1 tmp3))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1752 (setcar lap0 (nth 1 tmp3))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1753 (setcdr lap0 (nth 1 tmp)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1754 (setq keep-going t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1755 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1756 ;; const goto-X ... X: goto-if-* --> whatever
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1757 ;; const goto-X ... X: discard --> whatever
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1758 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1759 ((and (eq (car lap0) 'byte-constant)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1760 (eq (car lap1) 'byte-goto)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1761 (memq (car (car (setq tmp (cdr (memq (cdr lap1) lap)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1762 (eval-when-compile
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1763 (cons 'byte-discard byte-conditional-ops)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1764 (not (eq lap1 (car tmp))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1765 (setq tmp2 (car tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1766 (cond ((memq (car tmp2)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1767 (if (null (car (cdr lap0)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1768 '(byte-goto-if-nil byte-goto-if-nil-else-pop)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1769 '(byte-goto-if-not-nil
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1770 byte-goto-if-not-nil-else-pop)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1771 (byte-compile-log-lap " %s goto [%s]\t-->\t%s %s"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1772 lap0 tmp2 lap0 tmp2)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1773 (setcar lap1 (car tmp2))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1774 (setcdr lap1 (cdr tmp2))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1775 ;; Let next step fix the (const,goto-if*) sequence.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1776 (setq rest (cons nil rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1777 (t
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1778 ;; Jump one step further
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1779 (byte-compile-log-lap
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1780 " %s goto [%s]\t-->\t<deleted> goto <skip>"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1781 lap0 tmp2)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1782 (or (eq 'TAG (car (nth 1 tmp)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1783 (setcdr tmp (cons (byte-compile-make-tag)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1784 (cdr tmp))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1785 (setcdr lap1 (car (cdr tmp)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1786 (setq lap (delq lap0 lap))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1787 (setq keep-going t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1788 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1789 ;; X: varref-Y ... varset-Y goto-X -->
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1790 ;; X: varref-Y Z: ... dup varset-Y goto-Z
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1791 ;; (varset-X goto-BACK, BACK: varref-X --> copy the varref down.)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1792 ;; (This is so usual for while loops that it is worth handling).
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1793 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1794 ((and (eq (car lap1) 'byte-varset)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1795 (eq (car lap2) 'byte-goto)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1796 (not (memq (cdr lap2) rest)) ;Backwards jump
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1797 (eq (car (car (setq tmp (cdr (memq (cdr lap2) lap)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1798 'byte-varref)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1799 (eq (cdr (car tmp)) (cdr lap1))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1800 (not (memq (car (cdr lap1)) byte-boolean-vars)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1801 ;;(byte-compile-log-lap " Pulled %s to end of loop" (car tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1802 (let ((newtag (byte-compile-make-tag)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1803 (byte-compile-log-lap
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1804 " %s: %s ... %s %s\t-->\t%s: %s %s: ... %s %s %s"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1805 (nth 1 (cdr lap2)) (car tmp)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1806 lap1 lap2
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1807 (nth 1 (cdr lap2)) (car tmp)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1808 (nth 1 newtag) 'byte-dup lap1
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1809 (cons 'byte-goto newtag)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1810 )
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1811 (setcdr rest (cons (cons 'byte-dup 0) (cdr rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1812 (setcdr tmp (cons (setcdr lap2 newtag) (cdr tmp))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1813 (setq add-depth 1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1814 (setq keep-going t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1815 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1816 ;; goto-X Y: ... X: goto-if*-Y --> goto-if-not-*-X+1 Y:
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1817 ;; (This can pull the loop test to the end of the loop)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1818 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1819 ((and (eq (car lap0) 'byte-goto)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1820 (eq (car lap1) 'TAG)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1821 (eq lap1
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1822 (cdr (car (setq tmp (cdr (memq (cdr lap0) lap))))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1823 (memq (car (car tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1824 '(byte-goto byte-goto-if-nil byte-goto-if-not-nil
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1825 byte-goto-if-nil-else-pop)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1826 ;; (byte-compile-log-lap " %s %s, %s %s --> moved conditional"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1827 ;; lap0 lap1 (cdr lap0) (car tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1828 (let ((newtag (byte-compile-make-tag)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1829 (byte-compile-log-lap
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1830 "%s %s: ... %s: %s\t-->\t%s ... %s:"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1831 lap0 (nth 1 lap1) (nth 1 (cdr lap0)) (car tmp)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1832 (cons (cdr (assq (car (car tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1833 '((byte-goto-if-nil . byte-goto-if-not-nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1834 (byte-goto-if-not-nil . byte-goto-if-nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1835 (byte-goto-if-nil-else-pop .
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1836 byte-goto-if-not-nil-else-pop)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1837 (byte-goto-if-not-nil-else-pop .
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1838 byte-goto-if-nil-else-pop))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1839 newtag)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1840
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1841 (nth 1 newtag)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1842 )
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1843 (setcdr tmp (cons (setcdr lap0 newtag) (cdr tmp)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1844 (if (eq (car (car tmp)) 'byte-goto-if-nil-else-pop)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1845 ;; We can handle this case but not the -if-not-nil case,
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1846 ;; because we won't know which non-nil constant to push.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1847 (setcdr rest (cons (cons 'byte-constant
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1848 (byte-compile-get-constant nil))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1849 (cdr rest))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1850 (setcar lap0 (nth 1 (memq (car (car tmp))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1851 '(byte-goto-if-nil-else-pop
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1852 byte-goto-if-not-nil
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1853 byte-goto-if-nil
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1854 byte-goto-if-not-nil
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1855 byte-goto byte-goto))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1856 )
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1857 (setq keep-going t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1858 )
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1859 (setq rest (cdr rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1860 )
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1861 ;; Cleanup stage:
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1862 ;; Rebuild byte-compile-constants / byte-compile-variables.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1863 ;; Simple optimizations that would inhibit other optimizations if they
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1864 ;; were done in the optimizing loop, and optimizations which there is no
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1865 ;; need to do more than once.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1866 (setq byte-compile-constants nil
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1867 byte-compile-variables nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1868 (setq rest lap)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1869 (while rest
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1870 (setq lap0 (car rest)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1871 lap1 (nth 1 rest))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1872 (if (memq (car lap0) byte-constref-ops)
20414
c42c4f60ecbb (byte-optimize-lapcode): Correctly
Karl Heuer <kwzh@gnu.org>
parents: 20210
diff changeset
1873 (if (not (eq (car lap0) 'byte-constant))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1874 (or (memq (cdr lap0) byte-compile-variables)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1875 (setq byte-compile-variables (cons (cdr lap0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1876 byte-compile-variables)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1877 (or (memq (cdr lap0) byte-compile-constants)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1878 (setq byte-compile-constants (cons (cdr lap0)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1879 byte-compile-constants)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1880 (cond (;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1881 ;; const-C varset-X const-C --> const-C dup varset-X
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1882 ;; const-C varbind-X const-C --> const-C dup varbind-X
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1883 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1884 (and (eq (car lap0) 'byte-constant)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1885 (eq (car (nth 2 rest)) 'byte-constant)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1886 (eq (cdr lap0) (car (nth 2 rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1887 (memq (car lap1) '(byte-varbind byte-varset)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1888 (byte-compile-log-lap " %s %s %s\t-->\t%s dup %s"
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1889 lap0 lap1 lap0 lap0 lap1)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1890 (setcar (cdr (cdr rest)) (cons (car lap1) (cdr lap1)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1891 (setcar (cdr rest) (cons 'byte-dup 0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1892 (setq add-depth 1))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1893 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1894 ;; const-X [dup/const-X ...] --> const-X [dup ...] dup
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1895 ;; varref-X [dup/varref-X ...] --> varref-X [dup ...] dup
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1896 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1897 ((memq (car lap0) '(byte-constant byte-varref))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1898 (setq tmp rest
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1899 tmp2 nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1900 (while (progn
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1901 (while (eq 'byte-dup (car (car (setq tmp (cdr tmp))))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1902 (and (eq (cdr lap0) (cdr (car tmp)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1903 (eq (car lap0) (car (car tmp)))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1904 (setcar tmp (cons 'byte-dup 0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1905 (setq tmp2 t))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1906 (if tmp2
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1907 (byte-compile-log-lap
12638
4adf53113ec9 (byte-optimize-lapcode): Fix format calls.
Richard M. Stallman <rms@gnu.org>
parents: 12550
diff changeset
1908 " %s [dup/%s]...\t-->\t%s dup..." lap0 lap0 lap0)))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1909 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1910 ;; unbind-N unbind-M --> unbind-(N+M)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1911 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1912 ((and (eq 'byte-unbind (car lap0))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1913 (eq 'byte-unbind (car lap1)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1914 (byte-compile-log-lap " %s %s\t-->\t%s" lap0 lap1
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1915 (cons 'byte-unbind
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1916 (+ (cdr lap0) (cdr lap1))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1917 (setq keep-going t)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1918 (setq lap (delq lap0 lap))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1919 (setcdr lap1 (+ (cdr lap1) (cdr lap0))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1920 )
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1921 (setq rest (cdr rest)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1922 (setq byte-compile-maxdepth (+ byte-compile-maxdepth add-depth)))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1923 lap)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1924
25231
b587c4aeff78 Provide `byte-optimize', not `byte-opt'.
Karl Heuer <kwzh@gnu.org>
parents: 24734
diff changeset
1925 (provide 'byte-opt)
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1926
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1927
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1928 ;; To avoid "lisp nesting exceeds max-lisp-eval-depth" when this file compiles
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1929 ;; itself, compile some of its most used recursive functions (at load time).
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1930 ;;
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1931 (eval-when-compile
1818
7e3322619e46 compiled-function-p has been renamed to byte-code-function-p.
Jim Blandy <jimb@redhat.com>
parents: 957
diff changeset
1932 (or (byte-code-function-p (symbol-function 'byte-optimize-form))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1933 (assq 'byte-code (symbol-function 'byte-optimize-form))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1934 (let ((byte-optimize nil)
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1935 (byte-compile-warnings nil))
29580
2f88e6f0d32b (byte-compile-log-lap-1)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29053
diff changeset
1936 (mapcar (lambda (x)
2f88e6f0d32b (byte-compile-log-lap-1)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29053
diff changeset
1937 (or noninteractive (message "compiling %s..." x))
2f88e6f0d32b (byte-compile-log-lap-1)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29053
diff changeset
1938 (byte-compile x)
2f88e6f0d32b (byte-compile-log-lap-1)
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29053
diff changeset
1939 (or noninteractive (message "compiling %s...done" x)))
757
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1940 '(byte-optimize-form
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1941 byte-optimize-body
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1942 byte-optimize-predicate
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1943 byte-optimize-binary-predicate
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1944 ;; Inserted some more than necessary, to speed it up.
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1945 byte-optimize-form-code-walker
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1946 byte-optimize-lapcode))))
745b7fc3a3d3 Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1947 nil)
848
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
1948
58d3ed08f776 *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 767
diff changeset
1949 ;;; byte-opt.el ends here