]> git.eshelyaron.com Git - emacs.git/commitdiff
byte-opt: Replace merged tags in jump tables too. (bug#25716)
authorVibhav Pant <vibhavp@gmail.com>
Tue, 14 Feb 2017 16:17:59 +0000 (21:47 +0530)
committerVibhav Pant <vibhavp@gmail.com>
Tue, 14 Feb 2017 16:23:26 +0000 (21:53 +0530)
* lisp/emacs-lisp/byte-opt.el (byte-optimize-lapcode): While merging
  adjacent tags, make sure that the old tag is replaced in all jump
  tables, if any. This fixes the bytecode VM jumping to the wrong
  address in compiled cond forms where the body of a clause was a loop
  of any sort.

lisp/emacs-lisp/byte-opt.el

index 38f5dcc993b2a13b3cfc0d171200d1a9d5a7c064..f3cc3d5992e03d97c64c961320c23ca8007af63b 100644 (file)
@@ -1752,12 +1752,22 @@ If FOR-EFFECT is non-nil, the return value is assumed to be of no importance."
                 (setcdr tmp2 lap1)
                 (setq tmp3 (cdr (memq tmp2 tmp3))))
               (setq lap (delq lap0 lap)
-                    keep-going t))
+                    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))))
              ;;
              ;; unused-TAG: --> <deleted>
              ;;
              ((and (eq 'TAG (car lap0))
                    (not (rassq lap0 lap))
+                    ;; make sure this tag isn't used in a jump-table
                     (cl-loop for table in byte-compile-jump-tables
                              when (member lap0 (hash-table-values table))
                              return nil finally return t))