From dba8296c00f035fcf7e200e846a890445606f307 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Thu, 20 Feb 2014 19:17:54 +0200 Subject: [PATCH] Fix assertion violation in redisplay. src/xdisp.c (try_cursor_movement): Don't use cursor position if set_cursor_from_row failed to compute it. This avoids assertion violations in MATRIX_ROW. --- src/ChangeLog | 3 +++ src/xdisp.c | 47 +++++++++++++++++++++++++---------------------- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index b46650a76db..3c063ca3c0b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -2,6 +2,9 @@ * xdisp.c (init_iterator): Don't dereference a bogus face pointer. (Bug#16819) + (try_cursor_movement): Don't use cursor position if + set_cursor_from_row failed to compute it. This avoids assertion + violations in MATRIX_ROW. 2014-02-20 Glenn Morris diff --git a/src/xdisp.c b/src/xdisp.c index 6d5b9d18260..94dd65c5d0b 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -15470,29 +15470,32 @@ try_cursor_movement (Lisp_Object window, struct text_pos startp, int *scroll_ste /* As soon as we've found the exact match for point, or the first suitable row whose ends_at_zv_p flag is set, we are done. */ - at_zv_p = - MATRIX_ROW (w->current_matrix, w->cursor.vpos)->ends_at_zv_p; - if (rv && !at_zv_p - && w->cursor.hpos >= 0 - && w->cursor.hpos < MATRIX_ROW_USED (w->current_matrix, - w->cursor.vpos)) + if (rv) { - struct glyph_row *candidate = - MATRIX_ROW (w->current_matrix, w->cursor.vpos); - struct glyph *g = - candidate->glyphs[TEXT_AREA] + w->cursor.hpos; - ptrdiff_t endpos = MATRIX_ROW_END_CHARPOS (candidate); - - exact_match_p = - (BUFFERP (g->object) && g->charpos == PT) - || (INTEGERP (g->object) - && (g->charpos == PT - || (g->charpos == 0 && endpos - 1 == PT))); - } - if (rv && (at_zv_p || exact_match_p)) - { - rc = CURSOR_MOVEMENT_SUCCESS; - break; + at_zv_p = MATRIX_ROW (w->current_matrix, + w->cursor.vpos)->ends_at_zv_p; + if (!at_zv_p + && w->cursor.hpos >= 0 + && w->cursor.hpos < MATRIX_ROW_USED (w->current_matrix, + w->cursor.vpos)) + { + struct glyph_row *candidate = + MATRIX_ROW (w->current_matrix, w->cursor.vpos); + struct glyph *g = + candidate->glyphs[TEXT_AREA] + w->cursor.hpos; + ptrdiff_t endpos = MATRIX_ROW_END_CHARPOS (candidate); + + exact_match_p = + (BUFFERP (g->object) && g->charpos == PT) + || (INTEGERP (g->object) + && (g->charpos == PT + || (g->charpos == 0 && endpos - 1 == PT))); + } + if (at_zv_p || exact_match_p) + { + rc = CURSOR_MOVEMENT_SUCCESS; + break; + } } if (MATRIX_ROW_BOTTOM_Y (row) == last_y) break; -- 2.39.2