diff options
author | Eli Zaretskii <eliz@gnu.org> | 2011-11-12 13:56:57 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2011-11-12 13:56:57 +0200 |
commit | 7a7270ddb6e2a0b5f8c7404277a46272d80a8100 (patch) | |
tree | b9e8782cc3e3df961e821a5e8648f2e68834e601 /src/dispnew.c | |
parent | 1e5b2111b6ebfa6f8e244add939de453e9feafe6 (diff) | |
download | emacs-7a7270ddb6e2a0b5f8c7404277a46272d80a8100.tar.gz |
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.
Diffstat (limited to 'src/dispnew.c')
-rw-r--r-- | src/dispnew.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/dispnew.c b/src/dispnew.c index dafb8127eb3..7b594c5b4e8 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) |