Fix bug #10035 with assertion violation in row_equal_p.
authorEli Zaretskii <eliz@gnu.org>
Mon, 14 Nov 2011 20:15:38 +0000 (22:15 +0200)
committerEli Zaretskii <eliz@gnu.org>
Mon, 14 Nov 2011 20:15:38 +0000 (22:15 +0200)
 src/xdisp.c (display_line): Move the call to
 highlight_trailing_whitespace before the call to
 compute_line_metrics, since the latter needs to see the final
 faces of all the glyphs to compute ROW's hash value.  Fixes
 assertion violations in row_equal_p.

src/ChangeLog
src/xdisp.c

index 3e2ebaa..3c93cae 100644 (file)
@@ -1,3 +1,11 @@
+2011-11-14  Eli Zaretskii  <eliz@gnu.org>
+
+       * xdisp.c (display_line): Move the call to
+       highlight_trailing_whitespace before the call to
+       compute_line_metrics, since the latter needs to see the final
+       faces of all the glyphs to compute ROW's hash value.  Fixes
+       assertion violations in row_equal_p.  (Bug#10035)
+
 2011-11-14  Juanma Barranquero  <lekktu@gmail.com>
 
        * w32proc.c (reader_thread): Don't check pending input if cp->fd < 0,
index efe7a6c..6129c5e 100644 (file)
@@ -19382,9 +19382,18 @@ display_line (struct it *it)
       overlay_arrow_seen = 1;
     }
 
+  /* Highlight trailing whitespace.  */
+  if (!NILP (Vshow_trailing_whitespace))
+    highlight_trailing_whitespace (it->f, it->glyph_row);
+
   /* Compute pixel dimensions of this line.  */
   compute_line_metrics (it);
 
+  /* Implementation note: No changes in the glyphs of ROW or in their
+     faces can be done past this point, because compute_line_metrics
+     computes ROW's hash value and stores it within the glyph_row
+     structure.  */
+
   /* Record whether this row ends inside an ellipsis.  */
   row->ends_in_ellipsis_p
     = (it->method == GET_FROM_DISPLAY_VECTOR
@@ -19419,10 +19428,6 @@ display_line (struct it *it)
       && cursor_row_p (row))
     set_cursor_from_row (it->w, row, it->w->desired_matrix, 0, 0, 0, 0);
 
-  /* Highlight trailing whitespace.  */
-  if (!NILP (Vshow_trailing_whitespace))
-    highlight_trailing_whitespace (it->f, it->glyph_row);
-
   /* Prepare for the next line.  This line starts horizontally at (X
      HPOS) = (0 0).  Vertical positions are incremented.  As a
      convenience for the caller, IT->glyph_row is set to the next