diff options
author | Mattias EngdegÄrd <mattiase@acm.org> | 2019-05-21 11:56:14 +0200 |
---|---|---|
committer | Mattias EngdegÄrd <mattiase@acm.org> | 2019-06-19 11:20:58 +0200 |
commit | 36ab408207d7adf94fd1396922e0df38d746a948 (patch) | |
tree | 8c0a40db0b370296b32f8681c6aae377072e3ff6 /lisp/emacs-lisp/byte-opt.el | |
parent | 2419fa3937f07f8e2e4a79f77fe367a9979cb578 (diff) | |
download | emacs-36ab408207d7adf94fd1396922e0df38d746a948.tar.gz |
Compile list member functions in cond to switch (bug#36139)
* lisp/emacs-lisp/bytecomp.el (byte-compile-cond-jump-table-info):
Expand `memq', `memql' and `member' to their corresponding
equality tests.
(byte-compile-cond-jump-table): Cases now have multiple values.
* lisp/emacs-lisp/byte-opt.el (byte-decompile-bytecode-1)
(byte-optimize-lapcode): Don't assume switch hash tables to be injective.
Diffstat (limited to 'lisp/emacs-lisp/byte-opt.el')
-rw-r--r-- | lisp/emacs-lisp/byte-opt.el | 21 |
1 files changed, 11 insertions, 10 deletions
diff --git a/lisp/emacs-lisp/byte-opt.el b/lisp/emacs-lisp/byte-opt.el index 44cca6136c0..b0aa407c8b4 100644 --- a/lisp/emacs-lisp/byte-opt.el +++ b/lisp/emacs-lisp/byte-opt.el @@ -1376,11 +1376,15 @@ do (setq last-constant (copy-hash-table e)) and return nil) ;; Replace all addresses with TAGs. - (maphash #'(lambda (value tag) - (let (newtag) - (setq newtag (byte-compile-make-tag)) - (push (cons tag newtag) tags) - (puthash value newtag last-constant))) + (maphash #'(lambda (value offset) + (let ((match (assq offset tags))) + (puthash value + (if match + (cdr match) + (let ((tag (byte-compile-make-tag))) + (push (cons offset tag) tags) + tag)) + last-constant))) last-constant) ;; Replace the hash table referenced in the lapcode with our ;; modified one. @@ -1722,13 +1726,10 @@ If FOR-EFFECT is non-nil, the return value is assumed to be of no importance." keep-going t) ;; replace references to tag in jump tables, if any (dolist (table byte-compile-jump-tables) - (catch 'break (maphash #'(lambda (value tag) (when (equal tag lap0) - ;; each tag occurs only once in the jump table - (puthash value lap1 table) - (throw 'break nil))) - table)))) + (puthash value lap1 table))) + table))) ;; ;; unused-TAG: --> <deleted> ;; |