aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDmitry Antipov2013-03-28 06:41:05 +0400
committerDmitry Antipov2013-03-28 06:41:05 +0400
commit5c89ca240d7efa68b29651b34b8fbca172a5f75a (patch)
tree4f5331a0283148733836f43b271b9b0863f10a24 /src
parent115694a3d83c3c248ad068a0330eea9e1eb4ff59 (diff)
downloademacs-5c89ca240d7efa68b29651b34b8fbca172a5f75a.tar.gz
emacs-5c89ca240d7efa68b29651b34b8fbca172a5f75a.zip
* xdisp.c (with_echo_area_buffer_unwind_data): Save window
start marker... (unwind_with_echo_area_buffer): ...to restore it here. This is needed to ensure that... (redisplay_window): ...both window markers are valid here, which is verified by eassert. * editfns.c (save_excursion_save): Do not assume that selected_window always displays the buffer.
Diffstat (limited to 'src')
-rw-r--r--src/ChangeLog11
-rw-r--r--src/editfns.c2
-rw-r--r--src/xdisp.c22
3 files changed, 26 insertions, 9 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index 6698cfe0fcf..1b5259811b1 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,14 @@
12013-03-28 Dmitry Antipov <dmantipov@yandex.ru>
2
3 * xdisp.c (with_echo_area_buffer_unwind_data): Save window
4 start marker...
5 (unwind_with_echo_area_buffer): ...to restore it here. This
6 is needed to ensure that...
7 (redisplay_window): ...both window markers are valid here,
8 which is verified by eassert.
9 * editfns.c (save_excursion_save): Do not assume that
10 selected_window always displays the buffer.
11
12013-03-27 Stefan Monnier <monnier@iro.umontreal.ca> 122013-03-27 Stefan Monnier <monnier@iro.umontreal.ca>
2 13
3 * casetab.c (init_casetab_once): Don't abuse the ascii eqv table for 14 * casetab.c (init_casetab_once): Don't abuse the ascii eqv table for
diff --git a/src/editfns.c b/src/editfns.c
index 2d87b8e0064..0ab7c143c99 100644
--- a/src/editfns.c
+++ b/src/editfns.c
@@ -846,7 +846,7 @@ save_excursion_save (void)
846 ? Fcopy_marker (BVAR (current_buffer, mark), Qnil) 846 ? Fcopy_marker (BVAR (current_buffer, mark), Qnil)
847 : Qnil), 847 : Qnil),
848 /* Selected window if current buffer is shown in it, nil otherwise. */ 848 /* Selected window if current buffer is shown in it, nil otherwise. */
849 ((XBUFFER (XWINDOW (selected_window)->buffer) == current_buffer) 849 (EQ (XWINDOW (selected_window)->buffer, Fcurrent_buffer ())
850 ? selected_window : Qnil), 850 ? selected_window : Qnil),
851 BVAR (current_buffer, mark_active)); 851 BVAR (current_buffer, mark_active));
852} 852}
diff --git a/src/xdisp.c b/src/xdisp.c
index d42e53fc314..dff8f719c0d 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -9994,7 +9994,7 @@ with_echo_area_buffer_unwind_data (struct window *w)
9994 Vwith_echo_area_save_vector = Qnil; 9994 Vwith_echo_area_save_vector = Qnil;
9995 9995
9996 if (NILP (vector)) 9996 if (NILP (vector))
9997 vector = Fmake_vector (make_number (7), Qnil); 9997 vector = Fmake_vector (make_number (9), Qnil);
9998 9998
9999 XSETBUFFER (tmp, current_buffer); ASET (vector, i, tmp); ++i; 9999 XSETBUFFER (tmp, current_buffer); ASET (vector, i, tmp); ++i;
10000 ASET (vector, i, Vdeactivate_mark); ++i; 10000 ASET (vector, i, Vdeactivate_mark); ++i;
@@ -10006,10 +10006,12 @@ with_echo_area_buffer_unwind_data (struct window *w)
10006 ASET (vector, i, w->buffer); ++i; 10006 ASET (vector, i, w->buffer); ++i;
10007 ASET (vector, i, make_number (marker_position (w->pointm))); ++i; 10007 ASET (vector, i, make_number (marker_position (w->pointm))); ++i;
10008 ASET (vector, i, make_number (marker_byte_position (w->pointm))); ++i; 10008 ASET (vector, i, make_number (marker_byte_position (w->pointm))); ++i;
10009 ASET (vector, i, make_number (marker_position (w->start))); ++i;
10010 ASET (vector, i, make_number (marker_byte_position (w->start))); ++i;
10009 } 10011 }
10010 else 10012 else
10011 { 10013 {
10012 int end = i + 4; 10014 int end = i + 6;
10013 for (; i < end; ++i) 10015 for (; i < end; ++i)
10014 ASET (vector, i, Qnil); 10016 ASET (vector, i, Qnil);
10015 } 10017 }
@@ -10032,16 +10034,18 @@ unwind_with_echo_area_buffer (Lisp_Object vector)
10032 if (WINDOWP (AREF (vector, 3))) 10034 if (WINDOWP (AREF (vector, 3)))
10033 { 10035 {
10034 struct window *w; 10036 struct window *w;
10035 Lisp_Object buffer, charpos, bytepos; 10037 Lisp_Object buffer;
10036 10038
10037 w = XWINDOW (AREF (vector, 3)); 10039 w = XWINDOW (AREF (vector, 3));
10038 buffer = AREF (vector, 4); 10040 buffer = AREF (vector, 4);
10039 charpos = AREF (vector, 5);
10040 bytepos = AREF (vector, 6);
10041 10041
10042 wset_buffer (w, buffer); 10042 wset_buffer (w, buffer);
10043 set_marker_both (w->pointm, buffer, 10043 set_marker_both (w->pointm, buffer,
10044 XFASTINT (charpos), XFASTINT (bytepos)); 10044 XFASTINT (AREF (vector, 5)),
10045 XFASTINT (AREF (vector, 6)));
10046 set_marker_both (w->start, buffer,
10047 XFASTINT (AREF (vector, 7)),
10048 XFASTINT (AREF (vector, 8)));
10045 } 10049 }
10046 10050
10047 Vwith_echo_area_save_vector = vector; 10051 Vwith_echo_area_save_vector = vector;
@@ -15231,12 +15235,14 @@ redisplay_window (Lisp_Object window, int just_this_one_p)
15231 SET_TEXT_POS (lpoint, PT, PT_BYTE); 15235 SET_TEXT_POS (lpoint, PT, PT_BYTE);
15232 opoint = lpoint; 15236 opoint = lpoint;
15233 15237
15234 /* W must be a leaf window here. */
15235 eassert (!NILP (w->buffer));
15236#ifdef GLYPH_DEBUG 15238#ifdef GLYPH_DEBUG
15237 *w->desired_matrix->method = 0; 15239 *w->desired_matrix->method = 0;
15238#endif 15240#endif
15239 15241
15242 /* Make sure that both W's markers are valid. */
15243 eassert (XMARKER (w->start)->buffer == buffer);
15244 eassert (XMARKER (w->pointm)->buffer == buffer);
15245
15240 restart: 15246 restart:
15241 reconsider_clip_changes (w, buffer); 15247 reconsider_clip_changes (w, buffer);
15242 15248