GNU bug report logs - #24856
25.1.50; Emacs stucks when using C-k to kill lines in python-mode if the next line is a beginning of a docstring

Previous Next

Package: emacs;

Reported by: raynewang(王磊) <raynewang <at> tencent.com>

Date: Wed, 2 Nov 2016 06:33:02 UTC

Severity: normal

Tags: confirmed, fixed, patch

Merged with 21628, 21629, 21646, 21657, 21671, 24839, 24905, 26041

Found in versions 25.0.50, 25.1, 25.1.50, 26.0.50

Fixed in version 25.2

Done: Daniel Colascione <dancol <at> dancol.org>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 24856 in the body.
You can then email your comments to 24856 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-gnu-emacs <at> gnu.org:
bug#24856; Package emacs. (Wed, 02 Nov 2016 06:33:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to raynewang(王磊) <raynewang <at> tencent.com>:
New bug report received and forwarded. Copy sent to bug-gnu-emacs <at> gnu.org. (Wed, 02 Nov 2016 06:33:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: raynewang(王磊) <raynewang <at> tencent.com>
To: "bug-gnu-emacs <at> gnu.org" <bug-gnu-emacs <at> gnu.org>
Subject: 25.1.50; Emacs stucks when using C-k to kill lines in python-mode
 if the next line is a beginning of a docstring
Date: Wed, 2 Nov 2016 02:39:52 +0000
Please look at the following python snippet:

class Test(object):
  def func(self):
    """
    This is a test.
    """

I was trying to kill lines (C-k) from line 1. Emacs stucked everytime
after I killed line 2 and was going to kill line 3 (just before the
docstring delimiters). Most time C-g would not work or just brought
Emacs back for no more than 1 sec only. When it occurred, the only thing
I could do was to kill Emacs process.

I tried to disable all of my Emacs configurations, nothing changed.

May it be a problem of built-in python-mode?

Wish you guys could help me. I love your works!

Sincerely

Lei

======================================================================


In GNU Emacs 25.1.50.1 (x86_64-apple-darwin15.6.0, NS appkit-1404.47 Version 10.11.6 (Build 15G31))
of 2016-09-20 built on raynewang-rmbp.local
Repository revision: 83fbb3a6dd75e01a768cb6b3348b7c947711ee46
Windowing system distributor 'Apple', version 10.3.1504
Recent messages:
For information about GNU Emacs and the GNU system, type C-h C-a.
<s-backspace> is undefined [2 times]
funcall-interactively: Wrong type argument: char-or-string-p, nil

Configured using:
'configure --disable-dependency-tracking --disable-silent-rules
--enable-locallisppath=/usr/local/share/emacs/site-lisp
--infodir=/usr/local/Cellar/emacs/HEAD-83fbb3a/share/info/emacs
--prefix=/usr/local/Cellar/emacs/HEAD-83fbb3a --without-x --with-xml2
--without-dbus --without-gnutls --with-rsvg --with-ns
--disable-ns-self-contained'

Configured features:
JPEG RSVG NOTIFY ACL LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Fundamental

Minor modes in effect:
  tooltip-mode: t
  global-eldoc-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  tool-bar-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  buffer-read-only: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message subr-x puny seq byte-opt gv
bytecomp byte-compile cl-extra help-mode cconv cl-loaddefs pcase cl-lib
dired dired-loaddefs format-spec rfc822 mml easymenu mml-sec
password-cache epa derived epg epg-config gnus-util rmail rmail-loaddefs
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-date mule-util tooltip eldoc electric uniquify
ediff-hook vc-hooks lisp-float-type mwheel term/ns-win ns-win
ucs-normalize term/common-win tool-bar dnd fontset image regexp-opt
fringe tabulated-list newcomment elisp-mode lisp-mode prog-mode register
page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock
font-lock syntax facemenu font-core term/tty-colors frame cl-generic
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese charscript case-table epa-hook
jka-cmpr-hook help simple abbrev obarray minibuffer cl-preloaded nadvice
loaddefs button faces cus-face macroexp files text-properties overlay
sha1 md5 base64 format env code-pages mule custom widget
hashtable-print-readable backquote kqueue cocoa ns multi-tty
make-network-process emacs)

Memory information:
((conses 16 206717 18560)
(symbols 48 20249 0)
(miscs 40 75 177)
(strings 32 18166 5363)
(string-bytes 1 584409)
(vectors 16 35204)
(vector-slots 8 670777 6763)
(floats 8 179 123)
(intervals 56 206 0)
(buffers 976 12))




Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24856; Package emacs. (Wed, 02 Nov 2016 07:00:02 GMT) Full text and rfc822 format available.

Message #8 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Clément Pit--Claudel <clement.pit <at> gmail.com>
To: bug-gnu-emacs <at> gnu.org
Subject: Re: bug#24856: 25.1.50; Emacs stucks when using C-k to kill lines in
 python-mode if the next line is a beginning of a docstring
Date: Wed, 2 Nov 2016 02:59:29 -0400
[Message part 1 (text/plain, inline)]
Thanks, I can reproduce the bug.  Here's a simpler recipe:

    emacs -Q test.py --eval '(insert " \"")'

In other words, a mis-indented string on the first line is enough to reproduce the bug.  It seems to be an infinite loop in fontification:

Debugger entered--Lisp error: (quit)
  python-info-beginning-of-statement-p()
  python-nav--forward-sexp(-1 nil nil)
  python-nav-forward-sexp(-1 nil nil)
  python-nav-backward-sexp()
  python-info-docstring-p((0 nil nil t nil nil 0 nil 5 nil nil))
  python-font-lock-syntactic-face-function((0 nil nil t nil nil 0 nil 5 nil nil))
  font-lock-fontify-syntactically-region(1 9 nil)
  font-lock-default-fontify-region(1 9 nil)
  font-lock-fontify-region(1 9)
  #[257 "\211\300\301\"\211\242\306=\203

Clément.

On 2016-11-01 22:39, raynewang (王磊) wrote:
> Please look at the following python snippet:
> 
> class Test(object):
>   def func(self):
>     """
>     This is a test.
>     """
> 
> I was trying to kill lines (C-k) from line 1. Emacs stucked everytime
> after I killed line 2 and was going to kill line 3 (just before the
> docstring delimiters). Most time C-g would not work or just brought
> Emacs back for no more than 1 sec only. When it occurred, the only thing
> I could do was to kill Emacs process.
> 
> I tried to disable all of my Emacs configurations, nothing changed.
> 
> May it be a problem of built-in python-mode?
> 
> Wish you guys could help me. I love your works!
> 
> Sincerely
> 
> Lei
> 
> ======================================================================
> 
> 
> In GNU Emacs 25.1.50.1 (x86_64-apple-darwin15.6.0, NS appkit-1404.47 Version 10.11.6 (Build 15G31))
> of 2016-09-20 built on raynewang-rmbp.local
> Repository revision: 83fbb3a6dd75e01a768cb6b3348b7c947711ee46
> Windowing system distributor 'Apple', version 10.3.1504
> Recent messages:
> For information about GNU Emacs and the GNU system, type C-h C-a.
> <s-backspace> is undefined [2 times]
> funcall-interactively: Wrong type argument: char-or-string-p, nil
> 
> Configured using:
> 'configure --disable-dependency-tracking --disable-silent-rules
> --enable-locallisppath=/usr/local/share/emacs/site-lisp
> --infodir=/usr/local/Cellar/emacs/HEAD-83fbb3a/share/info/emacs
> --prefix=/usr/local/Cellar/emacs/HEAD-83fbb3a --without-x --with-xml2
> --without-dbus --without-gnutls --with-rsvg --with-ns
> --disable-ns-self-contained'
> 
> Configured features:
> JPEG RSVG NOTIFY ACL LIBXML2 ZLIB TOOLKIT_SCROLL_BARS NS
> 
> Important settings:
>   value of $LANG: en_US.UTF-8
>   locale-coding-system: utf-8-unix
> 
> Major mode: Fundamental
> 
> Minor modes in effect:
>   tooltip-mode: t
>   global-eldoc-mode: t
>   electric-indent-mode: t
>   mouse-wheel-mode: t
>   tool-bar-mode: t
>   menu-bar-mode: t
>   file-name-shadow-mode: t
>   global-font-lock-mode: t
>   blink-cursor-mode: t
>   auto-composition-mode: t
>   auto-encryption-mode: t
>   auto-compression-mode: t
>   buffer-read-only: t
>   line-number-mode: t
>   transient-mark-mode: t
> 
> Load-path shadows:
> None found.
> 
> Features:
> (shadow sort mail-extr emacsbug message subr-x puny seq byte-opt gv
> bytecomp byte-compile cl-extra help-mode cconv cl-loaddefs pcase cl-lib
> dired dired-loaddefs format-spec rfc822 mml easymenu mml-sec
> password-cache epa derived epg epg-config gnus-util rmail rmail-loaddefs
> 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-date mule-util tooltip eldoc electric uniquify
> ediff-hook vc-hooks lisp-float-type mwheel term/ns-win ns-win
> ucs-normalize term/common-win tool-bar dnd fontset image regexp-opt
> fringe tabulated-list newcomment elisp-mode lisp-mode prog-mode register
> page menu-bar rfn-eshadow timer select scroll-bar mouse jit-lock
> font-lock syntax facemenu font-core term/tty-colors frame cl-generic
> cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
> korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
> european ethiopic indian cyrillic chinese charscript case-table epa-hook
> jka-cmpr-hook help simple abbrev obarray minibuffer cl-preloaded nadvice
> loaddefs button faces cus-face macroexp files text-properties overlay
> sha1 md5 base64 format env code-pages mule custom widget
> hashtable-print-readable backquote kqueue cocoa ns multi-tty
> make-network-process emacs)
> 
> Memory information:
> ((conses 16 206717 18560)
> (symbols 48 20249 0)
> (miscs 40 75 177)
> (strings 32 18166 5363)
> (string-bytes 1 584409)
> (vectors 16 35204)
> (vector-slots 8 670777 6763)
> (floats 8 179 123)
> (intervals 56 206 0)
> (buffers 976 12))
> 
> 
> 
> 

[signature.asc (application/pgp-signature, attachment)]

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24856; Package emacs. (Thu, 03 Nov 2016 02:23:01 GMT) Full text and rfc822 format available.

Message #11 received at 24856 <at> debbugs.gnu.org (full text, mbox):

From: npostavs <at> users.sourceforge.net
To: Clément Pit--Claudel <clement.pit <at> gmail.com>
Cc: 24856 <at> debbugs.gnu.org
Subject: Re: bug#24856: 25.1.50;
 Emacs stucks when using C-k to kill lines in python-mode if the next
 line is a beginning of a docstring
Date: Wed, 02 Nov 2016 22:22:43 -0400
[Message part 1 (text/plain, inline)]
merge 24856 24839
tags 24856 patch
quit

Clément Pit--Claudel <clement.pit <at> gmail.com> writes:

>     emacs -Q test.py --eval '(insert " \"")'
>
> In other words, a mis-indented string on the first line is enough to
> reproduce the bug.
>

Yes, seems to be the same as 24839.

> It seems to be an infinite loop in fontification:
>
> Debugger entered--Lisp error: (quit)
>   python-info-beginning-of-statement-p()
>   python-nav--forward-sexp(-1 nil nil)
>   python-nav-forward-sexp(-1 nil nil)
>   python-nav-backward-sexp()
>   python-info-docstring-p((0 nil nil t nil nil 0 nil 5 nil nil))

Here is a patch:

[v1-0001-Fix-infloop-in-python-docstring-detection.patch (text/plain, inline)]
From 5da4f196fc3c8b411936551568477d70a9046421 Mon Sep 17 00:00:00 2001
From: Noam Postavsky <npostavs <at> gmail.com>
Date: Wed, 2 Nov 2016 21:59:10 -0400
Subject: [PATCH v1] Fix infloop in python docstring detection

The function `python-info-docstring-p' (introduced in 2015-04-05
"python.el: Enhance docstring detection following PEP-257[...]") could
get stuck when called with point before the first expression in the
buffer.  The attempted fix in 2015-04-06 "Fix previous commit to prevent
infloop" did not handle the case where there is only whitespace between
the first expression and the beginning of buffer (Bug#24856, Bug#24839).

* lisp/progmodes/python.el (python-info-docstring-p): Stop looping when
`python-nav-backward-sexp' fails to move point.
---
 lisp/progmodes/python.el | 15 ++++++++-------
 1 file changed, 8 insertions(+), 7 deletions(-)

diff --git a/lisp/progmodes/python.el b/lisp/progmodes/python.el
index e5efc2b..de06efb 100644
--- a/lisp/progmodes/python.el
+++ b/lisp/progmodes/python.el
@@ -4867,13 +4867,14 @@ python-info-docstring-p
               2
               (progn
                 (while (save-excursion
-                         (python-nav-backward-sexp)
-                         (setq backward-sexp-point (point))
-                         (and (= indentation (current-indentation))
-                              (not (bobp)) ; Prevent infloop.
-                              (looking-at-p
-                               (concat "[uU]?[rR]?"
-                                       (python-rx string-delimiter)))))
+                         (let ((cur-point (point)))
+                           (python-nav-backward-sexp)
+                           (setq backward-sexp-point (point))
+                           (and (= indentation (current-indentation))
+                                (/= cur-point (point)) ; Prevent infloop.
+                                (looking-at-p
+                                 (concat "[uU]?[rR]?"
+                                         (python-rx string-delimiter))))))
                   ;; Previous sexp was a string, restore point.
                   (goto-char backward-sexp-point)
                   (cl-incf counter))
-- 
2.9.3


Merged 24839 24856. Request was from npostavs <at> users.sourceforge.net to control <at> debbugs.gnu.org. (Thu, 03 Nov 2016 02:23:02 GMT) Full text and rfc822 format available.

Added tag(s) patch. Request was from npostavs <at> users.sourceforge.net to control <at> debbugs.gnu.org. (Thu, 03 Nov 2016 02:23:02 GMT) Full text and rfc822 format available.

Information forwarded to bug-gnu-emacs <at> gnu.org:
bug#24856; Package emacs. (Thu, 03 Nov 2016 05:48:02 GMT) Full text and rfc822 format available.

Message #18 received at 24856 <at> debbugs.gnu.org (full text, mbox):

From: Clément Pit--Claudel <clement.pit <at> gmail.com>
To: npostavs <at> users.sourceforge.net
Cc: 24856 <at> debbugs.gnu.org
Subject: Re: bug#24856: 25.1.50; Emacs stucks when using C-k to kill lines in
 python-mode if the next line is a beginning of a docstring
Date: Thu, 3 Nov 2016 01:47:17 -0400
[Message part 1 (text/plain, inline)]
On 2016-11-02 22:22, npostavs <at> users.sourceforge.net wrote:
> Here is a patch:

Thanks; works great for me!

[signature.asc (application/pgp-signature, attachment)]

Forcibly Merged 24839 24856 24905. Request was from npostavs <at> users.sourceforge.net to control <at> debbugs.gnu.org. (Wed, 09 Nov 2016 00:27:02 GMT) Full text and rfc822 format available.

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Thu, 08 Dec 2016 12:24:04 GMT) Full text and rfc822 format available.

bug unarchived. Request was from npostavs <at> users.sourceforge.net to control <at> debbugs.gnu.org. (Wed, 01 Mar 2017 01:06:02 GMT) Full text and rfc822 format available.

Forcibly Merged 21628 21629 21646 21657 21671 24839 24856 24905. Request was from npostavs <at> users.sourceforge.net to control <at> debbugs.gnu.org. (Wed, 01 Mar 2017 01:06:02 GMT) Full text and rfc822 format available.

Merged 21628 21629 21646 21657 21671 24839 24856 24905 26041. Request was from npostavs <at> users.sourceforge.net to control <at> debbugs.gnu.org. (Thu, 09 Mar 2017 23:14:02 GMT) Full text and rfc822 format available.

bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Fri, 07 Apr 2017 11:24:04 GMT) Full text and rfc822 format available.

This bug report was last modified 8 years and 71 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.