]> git.eshelyaron.com Git - emacs.git/commitdiff
Handle too long syntactic fontifications
authorEli Zaretskii <eliz@gnu.org>
Fri, 17 Jun 2022 15:24:33 +0000 (18:24 +0300)
committerEli Zaretskii <eliz@gnu.org>
Fri, 17 Jun 2022 15:24:33 +0000 (18:24 +0300)
* src/syntax.c (scan_sexps_forward): Call 'update_redisplay_ticks'
after finishing the loop.

* src/dispnew.c (make_current): Make sure enabled rows of the
current matrix have a valid hash, even if redisplay of a window
was aborted due to slowness.  This avoids assertion violations in
'scrolling_window' due to the wrong hash value.

src/dispnew.c
src/syntax.c

index 7a4d9f8710b708de7c8b5591dbf731340be8c8e3..9d587ea00e34c70a2f6058e89c229a21a6120182 100644 (file)
@@ -2738,6 +2738,14 @@ make_current (struct glyph_matrix *desired_matrix, struct glyph_matrix *current_
   struct glyph_row *desired_row = MATRIX_ROW (desired_matrix, row);
   bool mouse_face_p = current_row->mouse_face_p;
 
+  /* If we aborted redisplay of this window, a row in the desired
+     matrix might not have its hash computed.  */
+  if (!(!desired_row->used[0]
+       && !desired_row->used[1]
+       && !desired_row->used[2])
+      && !desired_row->hash)
+    desired_row->hash = row_hash (desired_row);
+
   /* Do current_row = desired_row.  This exchanges glyph pointers
      between both rows, and does a structure assignment otherwise.  */
   assign_row (current_row, desired_row);
index f9022d18d2605c8568b8edf961d50dfea8358dfa..de9193e2deb57387a92a523ac1b64c29d9ecdc97 100644 (file)
@@ -20,6 +20,7 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
 #include <config.h>
 
 #include "lisp.h"
+#include "dispextern.h"
 #include "character.h"
 #include "buffer.h"
 #include "regex-emacs.h"
@@ -3195,6 +3196,7 @@ scan_sexps_forward (struct lisp_parse_state *state,
   ptrdiff_t out_bytepos, out_charpos;
   int temp;
   unsigned short int quit_count = 0;
+  ptrdiff_t started_from = from;
 
   prev_from = from;
   prev_from_byte = from_byte;
@@ -3474,6 +3476,12 @@ do { prev_from = from;                           \
                                 state->levelstarts);
   state->prev_syntax = (SYNTAX_FLAGS_COMSTARTEND_FIRST (prev_from_syntax)
                         || state->quoted) ? prev_from_syntax : Smax;
+
+  /* The factor of 10 below is a heuristic that needs to be tuned.  It
+     means we consider 10 buffer positions examined by this function
+     roughly equivalent to the display engine iterating over a single
+     buffer position.  */
+  update_redisplay_ticks ((from - started_from) / 10 + 1, NULL);
 }
 
 /* Convert a (lisp) parse state to the internal form used in