* bug#16368: 24.3; freeze in cperl mode when editing a regexp @ 2014-01-06 1:28 Vincent Lefevre 2019-09-20 23:33 ` Stefan Kangas 2020-09-02 20:06 ` bug#16368: [PATCH] cperl-mode: don't freeze over a cool regexp Harald Jörg 0 siblings, 2 replies; 8+ messages in thread From: Vincent Lefevre @ 2014-01-06 1:28 UTC (permalink / raw) To: 16368 Open a file in cperl mode containing the following line: /(\d{4})(?: +){2}/; e.g.: "emacs -Q file" then M-x cperl-mode <RET> Put the cursor over the second opening brace, and type <DEL> several times to delete what is before "{2}". When one types <DEL> at this point: /(\d{4})(?:{2}/; ^cursor Emacs freezes. One can type C-g to interrupt. One can also reproduce the bug by typing: /(\d{4})(?{2 Emacs freezes before the "2" appears. This bug is also present with Emacs 23. Bug also reported on: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=734325 In GNU Emacs 24.3.1 (x86_64-pc-linux-gnu, GTK+ Version 3.8.6) of 2013-12-22 on brahms, modified by Debian Windowing system distributor `The X.Org Foundation', version 11.0.11405000 System Description: Debian GNU/Linux unstable (sid) Configured using: `configure '--build' 'x86_64-linux-gnu' '--build' 'x86_64-linux-gnu' '--prefix=/usr' '--sharedstatedir=/var/lib' '--libexecdir=/usr/lib' '--localstatedir=/var/lib' '--infodir=/usr/share/info' '--mandir=/usr/share/man' '--with-pop=yes' '--enable-locallisppath=/etc/emacs24:/etc/emacs:/usr/local/share/emacs/24.3/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/24.3/site-lisp:/usr/share/emacs/site-lisp' '--with-crt-dir=/usr/lib/x86_64-linux-gnu' '--with-x=yes' '--with-x-toolkit=gtk3' '--with-toolkit-scroll-bars' 'build_alias=x86_64-linux-gnu' 'CFLAGS=-g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat -Werror=format-security -Wall' 'LDFLAGS=-Wl,-z,relro' 'CPPFLAGS=-D_FORTIFY_SOURCE=2'' Important settings: value of $LC_COLLATE: POSIX value of $LC_CTYPE: en_US.UTF-8 value of $LC_TIME: en_DK value of $LANG: POSIX locale-coding-system: utf-8-unix default enable-multibyte-characters: t Major mode: Lisp Interaction Minor modes in effect: display-time-mode: t show-paren-mode: t tooltip-mode: t mouse-wheel-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t column-number-mode: t line-number-mode: t transient-mark-mode: t Recent input: <escape> x r e p o r t - e m <tab> <return> Recent messages: Loading /etc/emacs/site-start.d/50latex-cjk-common.el (source)... Loading cjk-enc...done Loading /etc/emacs/site-start.d/50latex-cjk-common.el (source)...done Loading /etc/emacs/site-start.d/50latex-cjk-thai.el (source)...done Loading /etc/emacs/site-start.d/50psvn.el (source)...done Loading /etc/emacs/site-start.d/50rnc-mode.el (source)...done Loading /etc/emacs/site-start.d/50w3m-el.el (source)...done Loading /home/vinc17/share/emacs/site-lisp/mutteditor.el (source)...done Loading time...done For information about GNU Emacs and the GNU system, type C-h C-a. Load-path shadows: /usr/share/emacs24/site-lisp/css-mode/css-mode hides /usr/share/emacs/site-lisp/css-mode/css-mode /usr/share/emacs/site-lisp/autoconf/autotest-mode hides /usr/share/emacs/site-lisp/autotest-mode /usr/share/emacs24/site-lisp/html-helper-mode/tempo hides /usr/share/emacs/24.3/lisp/tempo /usr/share/emacs24/site-lisp/flim/hex-util hides /usr/share/emacs/24.3/lisp/hex-util /usr/share/emacs24/site-lisp/flim/md4 hides /usr/share/emacs/24.3/lisp/md4 /usr/share/emacs24/site-lisp/dictionaries-common/flyspell hides /usr/share/emacs/24.3/lisp/textmodes/flyspell /usr/share/emacs24/site-lisp/dictionaries-common/ispell hides /usr/share/emacs/24.3/lisp/textmodes/ispell /usr/share/emacs24/site-lisp/css-mode/css-mode hides /usr/share/emacs/24.3/lisp/textmodes/css-mode /usr/share/emacs24/site-lisp/flim/hmac-md5 hides /usr/share/emacs/24.3/lisp/net/hmac-md5 /usr/share/emacs24/site-lisp/flim/sasl-ntlm hides /usr/share/emacs/24.3/lisp/net/sasl-ntlm /usr/share/emacs24/site-lisp/flim/sasl-cram hides /usr/share/emacs/24.3/lisp/net/sasl-cram /usr/share/emacs24/site-lisp/flim/ntlm hides /usr/share/emacs/24.3/lisp/net/ntlm /usr/share/emacs24/site-lisp/flim/sasl hides /usr/share/emacs/24.3/lisp/net/sasl /usr/share/emacs24/site-lisp/flim/hmac-def hides /usr/share/emacs/24.3/lisp/net/hmac-def /usr/share/emacs24/site-lisp/flim/sasl-digest hides /usr/share/emacs/24.3/lisp/net/sasl-digest /usr/share/emacs24/site-lisp/latex-cjk-thai/thai-word hides /usr/share/emacs/24.3/lisp/language/thai-word /usr/share/emacs24/site-lisp/html-helper-mode/html-helper-mode hides /usr/share/emacs/site-lisp/html-helper-mode/html-helper-mode /usr/share/emacs24/site-lisp/html-helper-mode/hhm-config hides /usr/share/emacs/site-lisp/html-helper-mode/hhm-config /usr/share/emacs24/site-lisp/html-helper-mode/tempo hides /usr/share/emacs/site-lisp/html-helper-mode/tempo /usr/share/emacs24/site-lisp/html-helper-mode/visual-basic-mode hides /usr/share/emacs/site-lisp/html-helper-mode/visual-basic-mode Features: (shadow sort gnus-util mail-extr warnings emacsbug message format-spec rfc822 mml easymenu mml-sec mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils time cus-start cus-load paren cc-styles cc-align cc-engine cc-vars cc-defs w3m-load jabber-autoloads time-date tooltip ediff-hook vc-hooks lisp-float-type mwheel x-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list newcomment lisp-mode register page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock font-lock syntax facemenu font-core frame cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese case-table epa-hook jka-cmpr-hook help simple abbrev minibuffer loaddefs button faces cus-face macroexp files text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote make-network-process dbusbind dynamic-setting system-font-setting font-render-setting move-toolbar gtk x-toolkit x multi-tty emacs) ^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#16368: 24.3; freeze in cperl mode when editing a regexp 2014-01-06 1:28 bug#16368: 24.3; freeze in cperl mode when editing a regexp Vincent Lefevre @ 2019-09-20 23:33 ` Stefan Kangas 2020-09-02 20:06 ` bug#16368: [PATCH] cperl-mode: don't freeze over a cool regexp Harald Jörg 1 sibling, 0 replies; 8+ messages in thread From: Stefan Kangas @ 2019-09-20 23:33 UTC (permalink / raw) To: Vincent Lefevre; +Cc: 16368 Vincent Lefevre <vincent@vinc17.net> writes: > Open a file in cperl mode containing the following line: > > /(\d{4})(?: +){2}/; > > e.g.: "emacs -Q file" then M-x cperl-mode <RET> > > Put the cursor over the second opening brace, and type <DEL> > several times to delete what is before "{2}". When one types > <DEL> at this point: > > /(\d{4})(?:{2}/; > ^cursor > > Emacs freezes. One can type C-g to interrupt. I can confirm this is still an issue in Emacs 26.1 and on the current master branch. Best regards, Stefan Kangas ^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#16368: [PATCH] cperl-mode: don't freeze over a cool regexp 2014-01-06 1:28 bug#16368: 24.3; freeze in cperl mode when editing a regexp Vincent Lefevre 2019-09-20 23:33 ` Stefan Kangas @ 2020-09-02 20:06 ` Harald Jörg 2020-09-02 22:19 ` Stefan Kangas 1 sibling, 1 reply; 8+ messages in thread From: Harald Jörg @ 2020-09-02 20:06 UTC (permalink / raw) To: 16368 [-- Attachment #1: Type: text/plain, Size: 389 bytes --] That bug exists since 14 years, but only surfaces if the regexp has a closing brace in the wrong place (two characters before an unfinished group starts). The reason is that `cperl-forward-group-in-re' failed to report unbalanced parentheses: In the function, the error was too narrowly localized and gets lost before returning. Patch attached, including two test cases. -- Cheers, haj [-- Attachment #2: 0001-2020-09-02-Harald-J-rg-haj-posteo.de.patch --] [-- Type: text/x-patch, Size: 3255 bytes --] From 3e513396340736dd182e5afa562abca5641ef300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20J=C3=B6rg?= <haj@posteo.de> Date: Wed, 2 Sep 2020 21:47:10 +0200 Subject: [PATCH] =?UTF-8?q?2020-09-02=20=20Harald=20J=C3=B6rg=20=20<haj@po?= =?UTF-8?q?steo.de>?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 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 | 9 +++++---- test/lisp/progmodes/cperl-mode-tests.el | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 44579cfd38..ac22218318 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -3241,8 +3241,8 @@ cperl-forward-group-in-re 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) @@ -3251,7 +3251,8 @@ cperl-forward-group-in-re (set-syntax-table st) (forward-sexp 1)) (error (message - "cperl-forward-group-in-re: error %s" b))) + "cperl-forward-group-in-re: error %s" err) + (setq result err))) ;; now restore the initial state (if st (progn @@ -3259,7 +3260,7 @@ cperl-forward-group-in-re (modify-syntax-entry ?\) "." st))) (if reset-st (set-syntax-table reset-st)) - b)) + result)) (defvar font-lock-string-face) diff --git a/test/lisp/progmodes/cperl-mode-tests.el b/test/lisp/progmodes/cperl-mode-tests.el index be8b42d99a..3a49b91ec2 100644 --- a/test/lisp/progmodes/cperl-mode-tests.el +++ b/test/lisp/progmodes/cperl-mode-tests.el @@ -48,4 +48,25 @@ cperl-mode-test-bug-42168 (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." + (require '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 -- 2.20.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* bug#16368: [PATCH] cperl-mode: don't freeze over a cool regexp 2020-09-02 20:06 ` bug#16368: [PATCH] cperl-mode: don't freeze over a cool regexp Harald Jörg @ 2020-09-02 22:19 ` Stefan Kangas 2020-09-02 23:40 ` Harald Jörg 0 siblings, 1 reply; 8+ messages in thread From: Stefan Kangas @ 2020-09-02 22:19 UTC (permalink / raw) To: Harald Jörg, 16368 Harald Jörg <haj@posteo.de> writes: > Patch attached, including two test cases. Thanks for working on cperl-mode bugs. Testing the original recipe with your patch it is already an improvement in that it avoids the freeze. But I see these messages: cperl-forward-group-in-re: error (scan-error Unbalanced parentheses 9 94) (scan-error Unbalanced parentheses 9 94) Is that the expected and desired behavior? --- Also, some minor nits: > Subject: [PATCH] =?UTF-8?q?2020-09-02=20=20Harald=20J=C3=B6rg=20=20<haj@po?= > =?UTF-8?q?steo.de>?= Better first line: Fix freeze in cperl-mode when editing a regexp > * 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'. Format these flush to the first column (no initial space). > --- a/test/lisp/progmodes/cperl-mode-tests.el > +++ b/test/lisp/progmodes/cperl-mode-tests.el I see this: ELC lisp/progmodes/cperl-mode-tests.elc In end of data: lisp/progmodes/cperl-mode-tests.el:73:1: Warning: the function `cperl-forward-group-in-re' is not known to be defined. You should add this line to the top: (require 'cperl-mode) Best regards, Stefan Kangas ^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#16368: [PATCH] cperl-mode: don't freeze over a cool regexp 2020-09-02 22:19 ` Stefan Kangas @ 2020-09-02 23:40 ` Harald Jörg 2020-09-03 9:58 ` Stefan Kangas 0 siblings, 1 reply; 8+ messages in thread From: Harald Jörg @ 2020-09-02 23:40 UTC (permalink / raw) To: Stefan Kangas, 16368 On 9/3/20 12:19 AM, Stefan Kangas wrote: > Harald Jörg <haj@posteo.de> writes: > >> Patch attached, including two test cases. > > Thanks for working on cperl-mode bugs. > > Testing the original recipe with your patch it is already an improvement > in that it avoids the freeze. But I see these messages: > > cperl-forward-group-in-re: error (scan-error Unbalanced parentheses 9 94) > (scan-error Unbalanced parentheses 9 94) > > Is that the expected and desired behavior? Yes, it is, sort of. Maybe it should be fine-tuned. At this point we _have_ the situation of unbalanced parentheses, and cperl-mode rubs it in for every character you type. Just open a buffer in cperl-mode and start typing: $a =~ s/ At this point a message appears, with a different text when you open a parentheses, and will haunt you until you get everything closed properly. Given that regexps can be messy and heavy with punctuation, I'd say this is desired behavior. I can only guess that the first part of the message (which starts with "cperl-forward-group-in-re") was added out of frustration: The bug prevented the second part of the message (without "cperl-forward-group-in-re") from ever appearing. Only this wasn't fatal unless... there was this closing brace two characters before. I'll check that, and prepare an updated patch if that's true. > --- > > Also, some minor nits: > >> Subject: [PATCH] =?UTF-8?q?2020-09-02=20=20Harald=20J=C3=B6rg=20=20<haj@po?= >> =?UTF-8?q?steo.de>?= > > Better first line: > > Fix freeze in cperl-mode when editing a regexp > >> * 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'. > > Format these flush to the first column (no initial space). No problem, I'll do so. I thought I was supposed to create the commit messages with C-x 4 a, but probably I misunderstood and should have post-processed that text in the first place. >> --- a/test/lisp/progmodes/cperl-mode-tests.el >> +++ b/test/lisp/progmodes/cperl-mode-tests.el > > I see this: > > ELC lisp/progmodes/cperl-mode-tests.elc > > In end of data: > lisp/progmodes/cperl-mode-tests.el:73:1: Warning: the function > `cperl-forward-group-in-re' is not known to be defined. > > You should add this line to the top: > > (require 'cperl-mode) Hm. That should rather be _moving_ that line to the top? The line is there, in the test which calls this function. For me this seemed to be enough to avoid that message when byte-compiling. But of course, moving the line to the top is fine, probably more tests will follow to exercise functions which aren't autoloaded. Give me a few hours for a nap: It's past midnight here :) -- Cheers, haj ^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#16368: [PATCH] cperl-mode: don't freeze over a cool regexp 2020-09-02 23:40 ` Harald Jörg @ 2020-09-03 9:58 ` Stefan Kangas 2020-09-03 20:27 ` Harald Jörg 0 siblings, 1 reply; 8+ messages in thread From: Stefan Kangas @ 2020-09-03 9:58 UTC (permalink / raw) To: Harald Jörg, 16368 Harald Jörg <haj@posteo.de> writes: > I'd say this is desired behavior. OK, thanks. Your explanation sounds good to me. > I can only guess that the first part of the message (which starts with > "cperl-forward-group-in-re") was added out of frustration: The bug > prevented the second part of the message (without > "cperl-forward-group-in-re") from ever appearing. Only this wasn't > fatal unless... there was this closing brace two characters before. > I'll check that, and prepare an updated patch if that's true. Sounds good. > No problem, I'll do so. I thought I was supposed to create the commit > messages with C-x 4 a, but probably I misunderstood and should have > post-processed that text in the first place. I always use C-x 4 a, and then delete the spacing to the left. > Hm. That should rather be _moving_ that line to the top? Ah, right. Yup, that sounds good. ^ permalink raw reply [flat|nested] 8+ messages in thread
* bug#16368: [PATCH] cperl-mode: don't freeze over a cool regexp 2020-09-03 9:58 ` Stefan Kangas @ 2020-09-03 20:27 ` Harald Jörg 2020-09-03 21:12 ` Stefan Kangas 0 siblings, 1 reply; 8+ messages in thread From: Harald Jörg @ 2020-09-03 20:27 UTC (permalink / raw) To: Stefan Kangas, 16368 [-- Attachment #1: Type: text/plain, Size: 1874 bytes --] On 9/3/20 11:58 AM, Stefan Kangas wrote: > Harald Jörg <haj@posteo.de> writes: > >> I'd say this is desired behavior. > > OK, thanks. Your explanation sounds good to me. It wasn't quite accurate, though. My explanation assumed that the regex as a whole wasn't terminated, but in fact it was. In fact, the message comes from the fact that (?{...}) introduces a block of code into the regexp. So, by removing the colon from (?:{...}), the semantics changed from "just another shy group" to "code", and for code cperl-mode applies stricter rules than for the contents of a capture group. I'd still say the message is ok. >> I can only guess that the first part of the message (which starts with >> "cperl-forward-group-in-re") was added out of frustration: The bug >> prevented the second part of the message (without >> "cperl-forward-group-in-re") from ever appearing. Only this wasn't >> fatal unless... there was this closing brace two characters before. >> I'll check that, and prepare an updated patch if that's true. > > Sounds good. ...And done. Now you get only one message, without the unnecessary "cperl-forward-group-in-re" prefix. >> No problem, I'll do so. I thought I was supposed to create the commit >> messages with C-x 4 a, but probably I misunderstood and should have >> post-processed that text in the first place. > > I always use C-x 4 a, and then delete the spacing to the left. Ok, adapted. I have also used your recommendation for the commit summary. >> Hm. That should rather be _moving_ that line to the top? > > Ah, right. Yup, that sounds good. When I did this, I stumbled over the purpose of Stefan Monniers change to the tests - this has been taken to emacs-devel. For now, moving the line to the top and skipping the test if called in a perl-mode environment, should do the trick. Patch, mark2, is attached! -- Cheers, haj [-- Attachment #2: 0001-Fix-freeze-in-cperl-mode-when-editing-a-regexp.patch --] [-- Type: text/x-patch, Size: 3363 bytes --] From 2ae8d341de4cb9782241348b28e4f713c317925c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20J=C3=B6rg?= <haj@posteo.de> Date: Thu, 3 Sep 2020 22:11:47 +0200 Subject: [PATCH] Fix freeze in cperl-mode when editing a regexp * 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 | 9 ++++----- test/lisp/progmodes/cperl-mode-tests.el | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/lisp/progmodes/cperl-mode.el b/lisp/progmodes/cperl-mode.el index 44579cfd38..e2628c834c 100644 --- a/lisp/progmodes/cperl-mode.el +++ b/lisp/progmodes/cperl-mode.el @@ -3241,8 +3241,8 @@ cperl-forward-group-in-re 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 @@ cperl-forward-group-in-re (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 @@ cperl-forward-group-in-re (modify-syntax-entry ?\) "." st))) (if reset-st (set-syntax-table reset-st)) - b)) + result)) (defvar font-lock-string-face) diff --git a/test/lisp/progmodes/cperl-mode-tests.el b/test/lisp/progmodes/cperl-mode-tests.el index be8b42d99a..e14ff98e3f 100644 --- a/test/lisp/progmodes/cperl-mode-tests.el +++ b/test/lisp/progmodes/cperl-mode-tests.el @@ -18,6 +18,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) @@ -48,4 +50,25 @@ cperl-mode-test-bug-42168 (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 -- 2.20.1 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* bug#16368: [PATCH] cperl-mode: don't freeze over a cool regexp 2020-09-03 20:27 ` Harald Jörg @ 2020-09-03 21:12 ` Stefan Kangas 0 siblings, 0 replies; 8+ messages in thread From: Stefan Kangas @ 2020-09-03 21:12 UTC (permalink / raw) To: Harald Jörg, 16368 close 16368 28.1 thanks Harald Jörg <haj@posteo.de> writes: > Patch, mark2, is attached! LGTM, tested and works as far as I can tell. Pushed to master as commit 7921b5db10. Thanks! ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2020-09-03 21:12 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2014-01-06 1:28 bug#16368: 24.3; freeze in cperl mode when editing a regexp Vincent Lefevre 2019-09-20 23:33 ` Stefan Kangas 2020-09-02 20:06 ` bug#16368: [PATCH] cperl-mode: don't freeze over a cool regexp Harald Jörg 2020-09-02 22:19 ` Stefan Kangas 2020-09-02 23:40 ` Harald Jörg 2020-09-03 9:58 ` Stefan Kangas 2020-09-03 20:27 ` Harald Jörg 2020-09-03 21:12 ` Stefan Kangas
Code repositories for project(s) associated with this external index https://git.savannah.gnu.org/cgit/emacs.git https://git.savannah.gnu.org/cgit/emacs/org-mode.git This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.