Improve byte-switch execution.
* lisp/emacs-lisp/byte-opt.el, lisp/emacs-lisp/bytecomp.el (byte-decompile-bytecode-1), (byte-compile-lapcode): Calculate the actual jump address while compiling, store it in the jump table. * src/bytecode.c: Jump to the looked up value directly, do a linear search when the number of elements is <= 5.
This commit is contained in:
parent
96c4e367f9
commit
dde800c8c9
3 changed files with 33 additions and 15 deletions
|
@ -1411,10 +1411,8 @@
|
|||
;; Replace all addresses with TAGs.
|
||||
(maphash #'(lambda (value tag)
|
||||
(let (newtag)
|
||||
(cl-assert (consp tag)
|
||||
nil "Invalid address for byte-switch")
|
||||
(setq newtag (byte-compile-make-tag))
|
||||
(push (cons (+ (car tag) (lsh (cdr tag) 8)) newtag) tags)
|
||||
(push (cons tag newtag) tags)
|
||||
(puthash value newtag last-constant)))
|
||||
last-constant)
|
||||
;; Replace the hash table referenced in the lapcode with our
|
||||
|
|
|
@ -917,10 +917,11 @@ CONST2 may be evaluated multiple times."
|
|||
(if (> (car bytes-tail) 255) (error "Bytecode overflow")))
|
||||
|
||||
(dolist (hash-table byte-compile-jump-tables)
|
||||
(cl-loop for k being the hash-keys of hash-table do
|
||||
(let ((tag (cdr (gethash k hash-table))))
|
||||
(setq pc (car tag))
|
||||
(puthash k (cons (logand pc 255) (lsh pc -8)) hash-table))))
|
||||
(maphash #'(lambda (value tag)
|
||||
(setq pc (cadr tag))
|
||||
(puthash value (+ (logand pc 255) (lsh (lsh pc -8) 8))
|
||||
hash-table))
|
||||
hash-table))
|
||||
(apply 'unibyte-string (nreverse bytes))))
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue