# HG changeset patch # User Kim F. Storm # Date 1107776640 0 # Node ID cf4b913c707494e8183a073df48e9432c70540b2 # Parent 6af50633a8f1e815160f1a6ba0d439c5c6520977 (Fprimitive_undo): Record max one dummmy apply element. diff -r 6af50633a8f1 -r cf4b913c7074 src/undo.c --- 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); }