More robust optimisation of ignore
Treat `ignore` as any other function during source-level optimisation, to avoid having its warning-suppression effects cancelled by repeated passes. Instead, define a custom code generation function. * lisp/emacs-lisp/byte-opt.el (byte-optimize-form-code-walker): Don't treat `ignore' specially here. (side-effect-free-fns): Don't mark `ignore` as side-effect-free or error-free (although it is), since that would allow the optimiser to elide calls. * lisp/emacs-lisp/bytecomp.el (ignore, byte-compile-ignore): Define and register a code-gen function.
This commit is contained in:
parent
fab1e220db
commit
bba48d6ee5
2 changed files with 9 additions and 8 deletions
|
@ -562,13 +562,6 @@ Same format as `byte-optimize--lexvars', with shared structure and contents.")
|
|||
`(catch ,(byte-optimize-form tag nil)
|
||||
. ,(byte-optimize-body exps for-effect))))
|
||||
|
||||
(`(ignore . ,exps)
|
||||
;; Don't treat the args to `ignore' as being
|
||||
;; computed for effect. We want to avoid the warnings
|
||||
;; that might occur if they were treated that way.
|
||||
;; However, don't actually bother calling `ignore'.
|
||||
`(progn ,@(mapcar #'byte-optimize-form exps) nil))
|
||||
|
||||
;; Needed as long as we run byte-optimize-form after cconv.
|
||||
(`(internal-make-closure . ,_)
|
||||
;; Look up free vars and mark them to be kept, so that they
|
||||
|
@ -1419,7 +1412,9 @@ See Info node `(elisp) Integer Basics'."
|
|||
fixnump floatp following-char framep
|
||||
get-largest-window get-lru-window
|
||||
hash-table-p
|
||||
identity ignore integerp integer-or-marker-p interactive-p
|
||||
;; `ignore' isn't here because we don't want calls to it elided;
|
||||
;; see `byte-compile-ignore'.
|
||||
identity integerp integer-or-marker-p interactive-p
|
||||
invocation-directory invocation-name
|
||||
keymapp keywordp
|
||||
list listp
|
||||
|
|
|
@ -4207,6 +4207,7 @@ discarding."
|
|||
(byte-defop-compiler-1 funcall)
|
||||
(byte-defop-compiler-1 let)
|
||||
(byte-defop-compiler-1 let* byte-compile-let)
|
||||
(byte-defop-compiler-1 ignore)
|
||||
|
||||
(defun byte-compile-progn (form)
|
||||
(byte-compile-body-do-effect (cdr form)))
|
||||
|
@ -4222,6 +4223,11 @@ discarding."
|
|||
(if ,discard 'byte-goto-if-nil 'byte-goto-if-nil-else-pop))
|
||||
,tag))
|
||||
|
||||
(defun byte-compile-ignore (form)
|
||||
(dolist (arg (cdr form))
|
||||
(byte-compile-form arg t))
|
||||
(byte-compile-form nil))
|
||||
|
||||
;; Return the list of items in CONDITION-PARAM that match PRED-LIST.
|
||||
;; Only return items that are not in ONLY-IF-NOT-PRESENT.
|
||||
(defun byte-compile-find-bound-condition (condition-param
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue