Mercurial > emacs
comparison lisp/emacs-lisp/byte-opt.el @ 90813:e6fdae9180d4
Merge from emacs--devo--0
Patches applied:
* emacs--devo--0 (patch 698-710)
- Update from CVS
- Merge from gnus--rel--5.10
* gnus--rel--5.10 (patch 216)
- Update from CVS
Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-196
author | Miles Bader <miles@gnu.org> |
---|---|
date | Tue, 24 Apr 2007 21:56:25 +0000 |
parents | 4ef881a120fe d09092672432 |
children | f55f9811f5d7 |
comparison
equal
deleted
inserted
replaced
90812:6137cc8ddf90 | 90813:e6fdae9180d4 |
---|---|
555 | 555 |
556 (t | 556 (t |
557 ;; Otherwise, no args can be considered to be for-effect, | 557 ;; Otherwise, no args can be considered to be for-effect, |
558 ;; even if the called function is for-effect, because we | 558 ;; even if the called function is for-effect, because we |
559 ;; don't know anything about that function. | 559 ;; don't know anything about that function. |
560 (cons fn (mapcar 'byte-optimize-form (cdr form))))))) | 560 (let ((args (mapcar #'byte-optimize-form (cdr form)))) |
561 | 561 (if (and (get fn 'pure) |
562 (byte-optimize-all-constp args)) | |
563 (list 'quote (apply fn (mapcar #'eval args))) | |
564 (cons fn args))))))) | |
565 | |
566 (defun byte-optimize-all-constp (list) | |
567 "Non-nil iff all elements of LIST satisfy `byte-compile-constp'." | |
568 (let ((constant t)) | |
569 (while (and list constant) | |
570 (unless (byte-compile-constp (car list)) | |
571 (setq constant nil)) | |
572 (setq list (cdr list))) | |
573 constant)) | |
562 | 574 |
563 (defun byte-optimize-form (form &optional for-effect) | 575 (defun byte-optimize-form (form &optional for-effect) |
564 "The source-level pass of the optimizer." | 576 "The source-level pass of the optimizer." |
565 ;; | 577 ;; |
566 ;; First, optimize all sub-forms of this one. | 578 ;; First, optimize all sub-forms of this one. |
1114 (while (>= (setq count (1- count)) 0) | 1126 (while (>= (setq count (1- count)) 0) |
1115 (setq form (list 'cdr form))) | 1127 (setq form (list 'cdr form))) |
1116 form) | 1128 form) |
1117 (byte-optimize-predicate form)) | 1129 (byte-optimize-predicate form)) |
1118 form)) | 1130 form)) |
1119 | |
1120 ;; Avoid having to write forward-... with a negative arg for speed. | |
1121 ;; Fixme: don't be limited to constant args. | |
1122 (put 'backward-char 'byte-optimizer 'byte-optimize-backward-char) | |
1123 (defun byte-optimize-backward-char (form) | |
1124 (cond ((and (= 2 (safe-length form)) | |
1125 (numberp (nth 1 form))) | |
1126 (list 'forward-char (eval (- (nth 1 form))))) | |
1127 ((= 1 (safe-length form)) | |
1128 '(forward-char -1)) | |
1129 (t form))) | |
1130 | |
1131 (put 'backward-word 'byte-optimizer 'byte-optimize-backward-word) | |
1132 (defun byte-optimize-backward-word (form) | |
1133 (cond ((and (= 2 (safe-length form)) | |
1134 (numberp (nth 1 form))) | |
1135 (list 'forward-word (eval (- (nth 1 form))))) | |
1136 ((= 1 (safe-length form)) | |
1137 '(forward-word -1)) | |
1138 (t form))) | |
1139 | 1131 |
1140 ;; Fixme: delete-char -> delete-region (byte-coded) | 1132 ;; Fixme: delete-char -> delete-region (byte-coded) |
1141 ;; optimize string-as-unibyte, string-as-multibyte, string-make-unibyte, | 1133 ;; optimize string-as-unibyte, string-as-multibyte, string-make-unibyte, |
1142 ;; string-make-multibyte for constant args. | 1134 ;; string-make-multibyte for constant args. |
1143 | 1135 |
1264 (while side-effect-and-error-free-fns | 1256 (while side-effect-and-error-free-fns |
1265 (put (car side-effect-and-error-free-fns) 'side-effect-free 'error-free) | 1257 (put (car side-effect-and-error-free-fns) 'side-effect-free 'error-free) |
1266 (setq side-effect-and-error-free-fns (cdr side-effect-and-error-free-fns))) | 1258 (setq side-effect-and-error-free-fns (cdr side-effect-and-error-free-fns))) |
1267 nil) | 1259 nil) |
1268 | 1260 |
1261 | |
1262 ;; pure functions are side-effect free functions whose values depend | |
1263 ;; only on their arguments. For these functions, calls with constant | |
1264 ;; arguments can be evaluated at compile time. This may shift run time | |
1265 ;; errors to compile time. | |
1266 | |
1267 (let ((pure-fns | |
1268 '(concat symbol-name regexp-opt regexp-quote string-to-syntax))) | |
1269 (while pure-fns | |
1270 (put (car pure-fns) 'pure t) | |
1271 (setq pure-fns (cdr pure-fns))) | |
1272 nil) | |
1269 | 1273 |
1270 (defun byte-compile-splice-in-already-compiled-code (form) | 1274 (defun byte-compile-splice-in-already-compiled-code (form) |
1271 ;; form is (byte-code "..." [...] n) | 1275 ;; form is (byte-code "..." [...] n) |
1272 (if (not (memq byte-optimize '(t lap))) | 1276 (if (not (memq byte-optimize '(t lap))) |
1273 (byte-compile-normal-call form) | 1277 (byte-compile-normal-call form) |