annotate lisp/emacs-lisp/byte-opt.el @ 51010:f79532778159

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