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)