annotate lisp/emacs-lisp/byte-opt.el @ 55434:f88632e54afb

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