changeset 59970:cf4b913c7074

(Fprimitive_undo): Record max one dummmy apply element.
author Kim F. Storm <storm@cua.dk>
date Mon, 07 Feb 2005 11:44:00 +0000
parents 6af50633a8f1
children c20f0be3ae10
files src/undo.c
diffstat 1 files changed, 18 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/undo.c	Sun Feb 06 22:32:31 2005 +0000
+++ b/src/undo.c	Mon Feb 07 11:44:00 2005 +0000
@@ -1,5 +1,6 @@
 /* undo handling for GNU Emacs.
-   Copyright (C) 1990, 1993, 1994, 2000 Free Software Foundation, Inc.
+   Copyright (C) 1990, 1993, 1994, 2000, 2002, 2004, 2005
+	Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -454,6 +455,8 @@
   Lisp_Object next;
   int count = SPECPDL_INDEX ();
   register int arg;
+  Lisp_Object oldlist;
+  int did_apply = 0;
 
 #if 0  /* This is a good feature, but would make undo-start
 	  unable to do what is expected.  */
@@ -470,6 +473,8 @@
   arg = XINT (n);
   next = Qnil;
   GCPRO2 (next, list);
+  /* I don't think we need to gcpro oldlist, as we use it only
+     to check for EQ.  ++kfs  */
 
   /* In a writable buffer, enable undoing read-only text that is so
      because of text properties.  */
@@ -479,6 +484,8 @@
   /* Don't let `intangible' properties interfere with undo.  */
   specbind (Qinhibit_point_motion_hooks, Qt);
 
+  oldlist = current_buffer->undo_list;
+
   while (arg > 0)
     {
       while (CONSP (list))
@@ -549,7 +556,6 @@
 		}
 	      else if (EQ (car, Qapply))
 		{
-		  Lisp_Object oldlist = current_buffer->undo_list;
 		  /* Element (apply FUNNAME . ARGS) means call FUNNAME to undo.  */
 		  car = Fcar (cdr);
 		  if (INTEGERP (car))
@@ -560,13 +566,7 @@
 		    }
 		  cdr = Fcdr (cdr);
 		  apply1 (car, cdr);
-
-		  /* Make sure this produces at least one undo entry,
-		     so the test in `undo' for continuing an undo series
-		     will work right.  */
-		  if (EQ (oldlist, current_buffer->undo_list))
-		    current_buffer->undo_list
-		      = Fcons (list3 (Qapply, Qcdr, Qnil), current_buffer->undo_list);
+		  did_apply = 1;
 		}
 	      else if (STRINGP (car) && INTEGERP (cdr))
 		{
@@ -611,6 +611,15 @@
       arg--;
     }
 
+
+  /* Make sure an apply entry produces at least one undo entry,
+     so the test in `undo' for continuing an undo series
+     will work right.  */
+  if (did_apply
+      && EQ (oldlist, current_buffer->undo_list))
+    current_buffer->undo_list
+      = Fcons (list3 (Qapply, Qcdr, Qnil), current_buffer->undo_list);
+
   UNGCPRO;
   return unbind_to (count, list);
 }