From 7a7270ddb6e2a0b5f8c7404277a46272d80a8100 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sat, 12 Nov 2011 13:56:57 +0200 Subject: [PATCH] Verify glyph row's hash values. 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 | 3 +++ src/dispnew.c | 23 +++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/ChangeLog b/src/ChangeLog index 71c2ff3131..286896be6e 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -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 diff --git a/src/dispnew.c b/src/dispnew.c index dafb8127eb..7b594c5b4e 100644 --- a/src/dispnew.c +++ b/src/dispnew.c @@ -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) -- 2.20.1