* editfns.c (save_excursion_save): Use nil if mark points to nowhere.
authorDmitry Antipov <dmantipov@yandex.ru>
Thu, 11 Oct 2012 13:23:12 +0000 (17:23 +0400)
committerDmitry Antipov <dmantipov@yandex.ru>
Thu, 11 Oct 2012 13:23:12 +0000 (17:23 +0400)
(save_excursion_restore): Do not restore mark if it was not saved.

src/ChangeLog
src/editfns.c

index 0b27459..99caae5 100644 (file)
@@ -1,3 +1,8 @@
+2012-10-11  Dmitry Antipov  <dmantipov@yandex.ru>
+
+       * editfns.c (save_excursion_save): Use nil if mark points to nowhere.
+       (save_excursion_restore): Do not restore mark if it was not saved.
+
 2012-10-11  Paul Eggert  <eggert@cs.ucla.edu>
 
        * marker.c (cached_modiff): EMACS_INT, not int.
index fc6465a..19fad71 100644 (file)
@@ -819,9 +819,13 @@ save_excursion_save (void)
 {
   bool visible = (XBUFFER (XWINDOW (selected_window)->buffer)
                  == current_buffer);
+  /* Do not copy the mark if it points to nowhere.  */
+  Lisp_Object mark = (XMARKER (BVAR (current_buffer, mark))->buffer
+                     ? Fcopy_marker (BVAR (current_buffer, mark), Qnil)
+                     : Qnil);
 
   return Fcons (Fpoint_marker (),
-               Fcons (Fcopy_marker (BVAR (current_buffer, mark), Qnil),
+               Fcons (mark,
                       Fcons (visible ? Qt : Qnil,
                              Fcons (BVAR (current_buffer, mark_active),
                                     selected_window))));
@@ -856,9 +860,14 @@ save_excursion_restore (Lisp_Object info)
   info = XCDR (info);
   tem = XCAR (info);
   omark = Fmarker_position (BVAR (current_buffer, mark));
-  Fset_marker (BVAR (current_buffer, mark), tem, Fcurrent_buffer ());
-  nmark = Fmarker_position (tem);
-  unchain_marker (XMARKER (tem));
+  if (NILP (tem))
+    unchain_marker (XMARKER (BVAR (current_buffer, mark)));
+  else
+    {
+      Fset_marker (BVAR (current_buffer, mark), tem, Fcurrent_buffer ());
+      nmark = Fmarker_position (tem);
+      unchain_marker (XMARKER (tem));
+    }
 
   /* visible */
   info = XCDR (info);