From c36df52ff5c05826382d88ddbe3fffaa99d12597 Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Tue, 4 May 2021 20:37:33 +0300 Subject: [PATCH] Fix infloop in lsp-mode * src/indent.c (line_number_display_width): Make sure the selected window's buffer is current before using display code on it: redisplay assumes that the window's buffer is current at all times. Reported by Evgeny Kurnevsky via lsp-mode's issue 1621, https://github.com/emacs-lsp/lsp-mode/issues/1621. --- src/indent.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/indent.c b/src/indent.c index 6246b544fbd..de6b4895616 100644 --- a/src/indent.c +++ b/src/indent.c @@ -1967,9 +1967,13 @@ line_number_display_width (struct window *w, int *width, int *pixel_width) struct it it; struct text_pos startpos; bool saved_restriction = false; + struct buffer *old_buf = current_buffer; ptrdiff_t count = SPECPDL_INDEX (); SET_TEXT_POS_FROM_MARKER (startpos, w->start); void *itdata = bidi_shelve_cache (); + + /* Make sure W's buffer is the current one. */ + set_buffer_internal_1 (XBUFFER (w->contents)); /* We want to start from window's start point, but it could be outside the accessible region, in which case we widen the buffer temporarily. It could even be beyond the buffer's end @@ -1998,6 +2002,7 @@ line_number_display_width (struct window *w, int *width, int *pixel_width) *pixel_width = it.lnum_pixel_width; if (saved_restriction) unbind_to (count, Qnil); + set_buffer_internal_1 (old_buf); bidi_unshelve_cache (itdata, 0); } } -- 2.39.5