Verify glyph row's hash values.
authorEli Zaretskii <eliz@gnu.org>
Sat, 12 Nov 2011 11:56:57 +0000 (13:56 +0200)
committerEli Zaretskii <eliz@gnu.org>
Sat, 12 Nov 2011 11:56:57 +0000 (13:56 +0200)
 src/dispnew.c (verify_row_hash) [XASSERTS]: New function.
 (adjust_glyph_matrix, row_equal_p): Use it in xassert to verify
 that the hash value of glyph rows is correct.

src/ChangeLog
src/dispnew.c

index 71c2ff3..286896b 100644 (file)
@@ -2,6 +2,9 @@
 
        * dispnew.c (scrolling_window): Fix incorrect indices in accessing
        current_matrix and desired_matrix.  (Bug#9990)
+       (verify_row_hash) [XASSERTS]: New function.
+       (adjust_glyph_matrix, row_equal_p): Use it in xassert to verify
+       that the hash value of glyph rows is correct.
 
 2011-11-12  Martin Rudalics  <rudalics@gmx.at>
 
index dafb812..7b594c5 100644 (file)
@@ -429,6 +429,25 @@ margin_glyphs_to_reserve (struct window *w, int total_glyphs, Lisp_Object margin
   return n;
 }
 
+#if XASSERTS
+/* Return non-zero if ROW's hash value is correct, zero if not.  */
+int
+verify_row_hash (struct glyph_row *row)
+{
+  int area, k;
+  unsigned row_hash = 0;
+
+  for (area = LEFT_MARGIN_AREA; area < LAST_AREA; ++area)
+    for (k = 0; k < row->used[area]; ++k)
+      row_hash = ((((row_hash << 4) + (row_hash >> 24)) & 0x0fffffff)
+                 + row->glyphs[area][k].u.val
+                 + row->glyphs[area][k].face_id
+                 + row->glyphs[area][k].padding_p
+                 + (row->glyphs[area][k].type << 2));
+
+  return row_hash == row->hash;
+}
+#endif
 
 /* Adjust glyph matrix MATRIX on window W or on a frame to changed
    window sizes.
@@ -600,6 +619,7 @@ adjust_glyph_matrix (struct window *w, struct glyph_matrix *matrix, int x, int y
                  row->glyphs[LAST_AREA]
                    = row->glyphs[LEFT_MARGIN_AREA] + dim.width;
                }
+             xassert (!row->enabled_p || verify_row_hash (row));
              ++row;
            }
        }
@@ -1271,6 +1291,9 @@ line_draw_cost (struct glyph_matrix *matrix, int vpos)
 static inline int
 row_equal_p (struct glyph_row *a, struct glyph_row *b, int mouse_face_p)
 {
+  xassert (verify_row_hash (a));
+  xassert (verify_row_hash (b));
+
   if (a == b)
     return 1;
   else if (a->hash != b->hash)