Subject: Re: bug#18134: 24.3; Doxygen comments trigger anomalous C++ major mode behavior

From: Stefan Kangas <[email-masked]>
Date: Mon, 7 Oct 2019 00:42:46 +0200

found 27.0.50
thanks

Sam Varshavchik <[email-masked]> writes:

> I am seeing anomalous behavior in C++ major mode that's triggered by
> long, but not excessively long -- only a few hundred lines -- Doxygen-style
> comments.
>
> Cursor navigation at the end of the Doxygen comment block in the
> following file (just before the first typedef), and trying to add some
> additional text there, results in 3-5 seconds' worth of delays for
> nearly typed character.
>
> Highlighting the entire Doxygen comment block: M-x indent-region takes
> several minutes (!) with emacs consuming 100% CPU.
[Snipped a long C++ example file here.]

I can reproduce both issues on current master using the provided example
file.

1. Editing is very slow after the Doxygen comment block.

2. Opening the example file under "emacs -Q", pressing C-x h TAB takes
   several minutes and sees the emacs process consume 100 % CPU (on one
   core at least).

Using the profiler during step 2 gives me:

>- command-execute                                               59856  97%
> - call-interactively                                           59856  97%
>  - funcall-interactively                                       59827  97%
>   - c-indent-line-or-region                                    59820  97%
>    - c-indent-region                                           59819  97%
>     - c-guess-basic-syntax                                     59809  97%
>      - c-beginning-of-statement-1                              39327  63%
>       - c-crosses-statement-barrier-p                          39105  63%
>        - c-backward-sws                                        22222  36%
>         + c-beginning-of-macro                                   492   0%
>           #<compiled 0x1579d1980ead>                               1   0%
>          c-literal-limits                                       9508  15%
>          c-literal-start                                        6228  10%
>        + c-at-macro-vsemi-p                                      217   0%
>       + c-backward-sws                                            61   0%
>       + c-at-macro-vsemi-p                                        16   0%
>       + c-beginning-of-macro                                      10   0%
>      - c-just-after-func-arglist-p                             19872  32%
>       - c-beginning-of-statement-1                             19872  32%
>        - c-crosses-statement-barrier-p                         19795  32%
>         - c-backward-sws                                       11424  18%
>          + c-beginning-of-macro                                  287   0%
>            #<compiled 0x1579d1980ead>                              2   0%
>           c-literal-limits                                      4707   7%
>           c-literal-start                                       3095   5%
>         + c-at-macro-vsemi-p                                     121   0%
>        + c-backward-sws                                           17   0%
>          c-beginning-of-macro                                      2   0%
>          c-at-macro-vsemi-p                                        1   0%
>        + c-looking-at-inexpr-block                                 1   0%
>      + c-backward-sws                                            202   0%
>      + c-back-over-member-initializers                           106   0%
>      + c-determine-limit                                         103   0%
>      + c-parse-state                                              61   0%
>      + c-looking-at-decl-block                                    55   0%
>      + c-looking-at-inexpr-block                                  19   0%
>      + c-syntactic-skip-backward                                  13   0%
>      + c-back-over-member-initializer-braces                       4   0%
>      + c-beginning-of-decl-1                                       4   0%
>      + c-in-literal                                                3   0%
>      + c-at-macro-vsemi-p                                          1   0%
>      + c-inside-bracelist-p                                        1   0%
>      + c-at-statement-start-p                                      1   0%
>     + c-indent-line                                                9   0%
>   + execute-extended-command                                       7   0%
>  - byte-code                                                      29   0%
>   + read-extended-command                                         29   0%
>+ ...                                                            1784   2%

(Quoted above so Gmail doesn't mess it up...)

Best regards,
Stefan Kangas