Mercurial > emacs
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))