diff src/undo.c @ 59992:6e49a3404a8e

(Fprimitive_undo): Check veracity of delta,start,end.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Tue, 08 Feb 2005 20:49:16 +0000
parents cf4b913c7074
children bbd61dfcbd2c
line wrap: on
line diff
--- a/src/undo.c	Tue Feb 08 16:22:25 2005 +0000
+++ b/src/undo.c	Tue Feb 08 20:49:16 2005 +0000
@@ -556,16 +556,32 @@
 		}
 	      else if (EQ (car, Qapply))
 		{
-		  /* Element (apply FUNNAME . ARGS) means call FUNNAME to undo.  */
+		  /* Element (apply FUN . ARGS) means call FUN to undo.  */
 		  car = Fcar (cdr);
+		  cdr = Fcdr (cdr);
 		  if (INTEGERP (car))
 		    {
-		      /* Long format: (apply DELTA START END FUNNAME . ARGS).  */
-		      cdr = Fcdr (Fcdr (Fcdr (cdr)));
-		      car = Fcar (cdr);
+		      /* Long format: (apply DELTA START END FUN . ARGS).  */
+		      Lisp_Object delta = car;
+		      Lisp_Object start = Fcar (cdr);
+		      Lisp_Object end   = Fcar (Fcdr (cdr));
+		      Lisp_Object start_mark = Fcopy_marker (start, Qnil);
+		      Lisp_Object end_mark   = Fcopy_marker (end, Qt);
+
+		      cdr = Fcdr (Fcdr (cdr));
+		      apply1 (Fcar (cdr), Fcdr (cdr));
+
+		      /* Check that the function did what the entry said it
+			 would do.  */
+		      if (!EQ (start, Fmarker_position (start_mark))
+			  || (XINT (delta) + XINT (end)
+			      != marker_position (end_mark)))
+			error ("Changes to be undone by function different than announced");
+		      Fset_marker (start_mark, Qnil, Qnil);
+		      Fset_marker (end_mark, Qnil, Qnil);
 		    }
-		  cdr = Fcdr (cdr);
-		  apply1 (car, cdr);
+		  else
+		    apply1 (car, cdr);
 		  did_apply = 1;
 		}
 	      else if (STRINGP (car) && INTEGERP (cdr))