emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

master 0cbcc62: 'assoc' is not side-effect-free; constprop its pure subs


From: Mattias Engdegård
Subject: master 0cbcc62: 'assoc' is not side-effect-free; constprop its pure subset
Date: Sat, 31 Oct 2020 09:31:57 -0400 (EDT)

branch: master
commit 0cbcc6223a75fee4af9211107ed392cb987c0a91
Author: Mattias Engdegård <mattiase@acm.org>
Commit: Mattias Engdegård <mattiase@acm.org>

    'assoc' is not side-effect-free; constprop its pure subset
    
    Since a supplied test function can do anything, assoc is not
    side-effect-free (bug#44018).  However, with only two arguments it is
    pure and should be optimised accordingly.
    
    * lisp/emacs-lisp/byte-opt.el (side-effect-free-fns): Remove 'assoc'.
    (byte-optimize-assoc): Constant-propagate through 2-arg assoc calls.
    * test/lisp/emacs-lisp/bytecomp-tests.el
    (byte-opt-testsuite-arith-data): Add test cases.
---
 lisp/emacs-lisp/byte-opt.el            | 14 ++++++++------
 test/lisp/emacs-lisp/bytecomp-tests.el |  7 ++++++-
 2 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el
index 65e4e44..1dc83dd 100644
--- a/lisp/emacs-lisp/byte-opt.el
+++ b/lisp/emacs-lisp/byte-opt.el
@@ -830,11 +830,13 @@
 (defun byte-optimize-assoc (form)
   ;; Replace 2-argument `assoc' with `assq', `rassoc' with `rassq',
   ;; if the first arg is a symbol.
-  (if (and (= (length form) 3)
-           (byte-optimize--constant-symbol-p (nth 1 form)))
-      (cons (if (eq (car form) 'assoc) 'assq 'rassq)
-            (cdr form))
-    form))
+  (cond
+   ((/= (length form) 3)
+    form)
+   ((byte-optimize--constant-symbol-p (nth 1 form))
+    (cons (if (eq (car form) 'assoc) 'assq 'rassq)
+          (cdr form)))
+   (t (byte-optimize-constant-args form))))
 
 (defun byte-optimize-memq (form)
   ;; (memq foo '(bar)) => (and (eq foo 'bar) '(bar))
@@ -1144,7 +1146,7 @@
 ;; I wonder if I missed any :-\)
 (let ((side-effect-free-fns
        '(% * + - / /= 1+ 1- < <= = > >= abs acos append aref ash asin atan
-        assoc assq
+        assq
         boundp buffer-file-name buffer-local-variables buffer-modified-p
         buffer-substring byte-code-function-p
         capitalize car-less-than-car car cdr ceiling char-after char-before
diff --git a/test/lisp/emacs-lisp/bytecomp-tests.el 
b/test/lisp/emacs-lisp/bytecomp-tests.el
index ea5aacd..13cbedf 100644
--- a/test/lisp/emacs-lisp/bytecomp-tests.el
+++ b/test/lisp/emacs-lisp/bytecomp-tests.el
@@ -365,7 +365,12 @@
             '(((a b)) a b (c) (d)))
     (mapcar (lambda (x) (cond ((memq '(a b) x) 1)
                               ((equal x '(c)) 2)))
-            '(((a b)) a b (c) (d))))
+            '(((a b)) a b (c) (d)))
+
+    (assoc 'b '((a 1) (b 2) (c 3)))
+    (assoc "b" '(("a" 1) ("b" 2) ("c" 3)))
+    (let ((x '((a 1) (b 2) (c 3)))) (assoc 'c x))
+    (assoc 'a '((a 1) (b 2) (c 3)) (lambda (u v) (not (equal u v)))))
   "List of expression for test.
 Each element will be executed by interpreter and with
 bytecompiled code, and their results compared.")



reply via email to

[Prev in Thread] Current Thread [Next in Thread]