]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix freeze in cperl-mode when editing a regexp
authorHarald Jörg <haj@posteo.de>
Thu, 3 Sep 2020 20:11:47 +0000 (22:11 +0200)
committerStefan Kangas <stefankangas@gmail.com>
Thu, 3 Sep 2020 20:58:07 +0000 (22:58 +0200)
* lisp/progmodes/cperl-mode.el (cperl-forward-group-in-re): Make
sure that an error is reported back to the caller (Bug#16368).

* test/lisp/progmodes/cperl-mode-tests.el (cperl-mode-test-bug-16368):
Tests for balanced (no error) and unbalanced (caught exception)
cases of `cperl-forward-group-in-re'.

lisp/progmodes/cperl-mode.el
test/lisp/progmodes/cperl-mode-tests.el

index 44579cfd386bafdae84d3897bd301843e602ac64..e2628c834ce6c6e96dad25a31a481b3754d3e158 100644 (file)
@@ -3241,8 +3241,8 @@ Return the error message (if any).  Does not work if delimiter is `)'.
 Works before syntax recognition is done."
   ;; Works *before* syntax recognition is done
   (or st-l (setq st-l (list nil)))     ; Avoid overwriting '()
-  (let (st b reset-st)
-    (condition-case b
+  (let (st result reset-st)
+    (condition-case err
        (progn
          (setq st (cperl-cached-syntax-table st-l))
          (modify-syntax-entry ?\( "()" st)
@@ -3250,8 +3250,7 @@ Works before syntax recognition is done."
          (setq reset-st (syntax-table))
          (set-syntax-table st)
          (forward-sexp 1))
-      (error (message
-             "cperl-forward-group-in-re: error %s" b)))
+      (error (setq result err)))
     ;; now restore the initial state
     (if st
        (progn
@@ -3259,7 +3258,7 @@ Works before syntax recognition is done."
          (modify-syntax-entry ?\) "." st)))
     (if reset-st
        (set-syntax-table reset-st))
-    b))
+    result))
 
 
 (defvar font-lock-string-face)
index abb13f2555753dde8d51212fde99b7defd21ca32..1efcad50078639084f028f30e10ee3b608c3b7ff 100644 (file)
@@ -33,6 +33,8 @@
 
 (defvar cperl-test-mode #'cperl-mode)
 
+(require 'cperl-mode)
+
 (defun cperl-test-ppss (text regexp)
   "Return the `syntax-ppss' of the first character matched by REGEXP in TEXT."
   (interactive)
@@ -63,4 +65,25 @@ have a face property."
   (let ((code "{ $a- / $b } # /"))
     (should (equal (nth 8 (cperl-test-ppss code "/")) 7))))
 
+(ert-deftest cperl-mode-test-bug-16368 ()
+  "Verify that `cperl-forward-group-in-re' doesn't hide errors."
+  (skip-unless (eq cperl-test-mode #'cperl-mode))
+  (let ((code "/(\\d{4})(?{2}/;")     ; the regex from the bug report
+        (result))
+    (with-temp-buffer
+      (insert code)
+      (goto-char 9)
+      (setq result (cperl-forward-group-in-re))
+      (should (equal (car result) 'scan-error))
+      (should (equal (nth 1 result) "Unbalanced parentheses"))
+      (should (= (point) 9))))        ; point remains unchanged on error
+  (let ((code "/(\\d{4})(?{2})/;")    ; here all parens are balanced
+        (result))
+    (with-temp-buffer
+      (insert code)
+      (goto-char 9)
+      (setq result (cperl-forward-group-in-re))
+      (should (equal result nil))
+      (should (= (point) 15)))))      ; point has skipped the group
+
 ;;; cperl-mode-tests.el ends here