]> git.eshelyaron.com Git - emacs.git/commitdiff
bytecomp.el: Avoid unnecessary calculation for jump table addresses.
authorVibhav Pant <vibhavp@gmail.com>
Thu, 16 Feb 2017 14:48:55 +0000 (20:18 +0530)
committerVibhav Pant <vibhavp@gmail.com>
Thu, 16 Feb 2017 15:00:04 +0000 (20:30 +0530)
* lisp/emacs-lisp/bytecomp.el (byte-compile-lapcode): Don't do
  redundant operations while calculating the correct jump addresses
  from TAGs in jump tables.

lisp/emacs-lisp/bytecomp.el

index 75e6b904aa6ffbc6695e0766c4b010cf10f10d75..e96ba0b6eddd1c160b8aa2e34a544ce20cbea162 100644 (file)
@@ -911,16 +911,21 @@ CONST2 may be evaluated multiple times."
     ;; Patch tag PCs into absolute jumps.
     (dolist (bytes-tail patchlist)
       (setq pc (caar bytes-tail))      ; Pick PC from goto's tag.
+      ;; Splits PC's value into 2 bytes. The jump address is
+      ;; "reconstructued" by the `FETCH2' macro in `bytecode.c'.
       (setcar (cdr bytes-tail) (logand pc 255))
       (setcar bytes-tail (lsh pc -8))
       ;; FIXME: Replace this by some workaround.
       (if (> (car bytes-tail) 255) (error "Bytecode overflow")))
 
+    ;; Similarly, replace TAGs in all jump tables with the correct PC index.
     (dolist (hash-table byte-compile-jump-tables)
       (maphash #'(lambda (value tag)
                    (setq pc (cadr tag))
-                   (puthash value (+ (logand pc 255) (lsh (lsh pc -8) 8))
-                            hash-table))
+                   ;; We don't need to split PC here, as it is stored as a lisp
+                   ;; object in the hash table (whereas other goto-* ops store
+                   ;; it within 2 bytes in the byte string).
+                   (puthash value pc hash-table))
                hash-table))
     (apply 'unibyte-string (nreverse bytes))))