mirror of
git://git.sv.gnu.org/emacs.git
synced 2025-12-26 07:11:34 -08:00
(byte-optimize-form-code-walker): Evaluate pure function calls if possible.
(byte-optimize-all-constp): New function.
This commit is contained in:
parent
f782c3293c
commit
fb67ebdf16
1 changed files with 25 additions and 1 deletions
|
|
@ -557,8 +557,20 @@
|
|||
;; Otherwise, no args can be considered to be for-effect,
|
||||
;; even if the called function is for-effect, because we
|
||||
;; don't know anything about that function.
|
||||
(cons fn (mapcar 'byte-optimize-form (cdr form)))))))
|
||||
(let ((args (mapcar #'byte-optimize-form (cdr form))))
|
||||
(if (and (get fn 'pure)
|
||||
(byte-optimize-all-constp args))
|
||||
(list 'quote (apply fn (mapcar #'eval args)))
|
||||
(cons fn args)))))))
|
||||
|
||||
(defun byte-optimize-all-constp (list)
|
||||
"Non-nil iff all elements of LIST satisfy `byte-compile-constp'."
|
||||
(let ((constant t))
|
||||
(while (and list constant)
|
||||
(unless (byte-compile-constp (car list))
|
||||
(setq constant nil))
|
||||
(setq list (cdr list)))
|
||||
constant))
|
||||
|
||||
(defun byte-optimize-form (form &optional for-effect)
|
||||
"The source-level pass of the optimizer."
|
||||
|
|
@ -1241,6 +1253,18 @@
|
|||
(setq side-effect-and-error-free-fns (cdr side-effect-and-error-free-fns)))
|
||||
nil)
|
||||
|
||||
|
||||
;; pure functions are side-effect free functions whose values depend
|
||||
;; only on their arguments. For these functions, calls with constant
|
||||
;; arguments can be evaluated at compile time. This may shift run time
|
||||
;; errors to compile time.
|
||||
|
||||
(let ((pure-fns
|
||||
'(concat symbol-name regexp-opt regexp-quote string-to-syntax)))
|
||||
(while pure-fns
|
||||
(put (car pure-fns) 'pure t)
|
||||
(setq pure-fns (cdr pure-fns)))
|
||||
nil)
|
||||
|
||||
(defun byte-compile-splice-in-already-compiled-code (form)
|
||||
;; form is (byte-code "..." [...] n)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue