diff options
| author | Dmitry Antipov | 2013-03-28 06:41:05 +0400 |
|---|---|---|
| committer | Dmitry Antipov | 2013-03-28 06:41:05 +0400 |
| commit | 5c89ca240d7efa68b29651b34b8fbca172a5f75a (patch) | |
| tree | 4f5331a0283148733836f43b271b9b0863f10a24 /src | |
| parent | 115694a3d83c3c248ad068a0330eea9e1eb4ff59 (diff) | |
| download | emacs-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/ChangeLog | 11 | ||||
| -rw-r--r-- | src/editfns.c | 2 | ||||
| -rw-r--r-- | src/xdisp.c | 22 |
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 @@ | |||
| 1 | 2013-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 | |||
| 1 | 2013-03-27 Stefan Monnier <monnier@iro.umontreal.ca> | 12 | 2013-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 | ||