From 957b05c615ee749b569d9fa2b214b2a2d8fa9bda Mon Sep 17 00:00:00 2001 From: Phillip Lord Date: Wed, 25 Nov 2015 21:39:49 +0000 Subject: run_undoable_changes now called from insdel. The original calls from inside undo.c are not always at a safe position to call lisp, as they originate in varied positions within insdel.c. Calling them directly from prepare_to_modify_buffer_1 ensures that they are always run at the same point. * undo.c (run_undoable_changes,syms_of_undo): Remove function and symbol used. * insdel.c (run_undoable_changes): Add function and symbol. --- src/insdel.c | 16 ++++++++++++++++ src/undo.c | 19 ------------------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/insdel.c b/src/insdel.c index 24807b1e8f4..8b08c1e59b7 100644 --- a/src/insdel.c +++ b/src/insdel.c @@ -1765,6 +1765,18 @@ modify_text (ptrdiff_t start, ptrdiff_t end) bset_point_before_scroll (current_buffer, Qnil); } +/* Signal that we are about to make a change that may result in new + undo information. + */ +static void +run_undoable_change (void) +{ + if (EQ (BVAR (current_buffer, undo_list), Qt)) + return; + + call0 (Qundo_auto__undoable_change); +} + /* Check that it is okay to modify the buffer between START and END, which are char positions. @@ -1786,6 +1798,8 @@ prepare_to_modify_buffer_1 (ptrdiff_t start, ptrdiff_t end, if (!NILP (BVAR (current_buffer, read_only))) Fbarf_if_buffer_read_only (temp); + run_undoable_change(); + bset_redisplay (current_buffer); if (buffer_intervals (current_buffer)) @@ -2187,6 +2201,8 @@ syms_of_insdel (void) combine_after_change_list = Qnil; combine_after_change_buffer = Qnil; + DEFSYM (Qundo_auto__undoable_change, "undo-auto--undoable-change"); + DEFVAR_LISP ("combine-after-change-calls", Vcombine_after_change_calls, doc: /* Used internally by the function `combine-after-change-calls' macro. */); Vcombine_after_change_calls = Qnil; diff --git a/src/undo.c b/src/undo.c index 214beaeb9ea..104c3bb3fc4 100644 --- a/src/undo.c +++ b/src/undo.c @@ -34,12 +34,6 @@ static ptrdiff_t last_boundary_position; an undo-boundary. */ static Lisp_Object pending_boundary; -static void -run_undoable_change (void) -{ - call0 (Qundo_auto__undoable_change); -} - /* Record point as it was at beginning of this command (if necessary) and prepare the undo info for recording a change. PT is the position of point that will naturally occur as a result of the @@ -58,8 +52,6 @@ record_point (ptrdiff_t pt) if (NILP (pending_boundary)) pending_boundary = Fcons (Qnil, Qnil); - run_undoable_change (); - at_boundary = ! CONSP (BVAR (current_buffer, undo_list)) || NILP (XCAR (BVAR (current_buffer, undo_list))); @@ -130,8 +122,6 @@ record_marker_adjustments (ptrdiff_t from, ptrdiff_t to) if (NILP (pending_boundary)) pending_boundary = Fcons (Qnil, Qnil); - run_undoable_change (); - for (m = BUF_MARKERS (current_buffer); m; m = m->next) { charpos = m->charpos; @@ -243,11 +233,6 @@ record_property_change (ptrdiff_t beg, ptrdiff_t length, if (NILP (pending_boundary)) pending_boundary = Fcons (Qnil, Qnil); - /* Switch temporarily to the buffer that was changed. */ - set_buffer_internal (buf); - - run_undoable_change (); - if (MODIFF <= SAVE_MODIFF) record_first_change (); @@ -256,9 +241,6 @@ record_property_change (ptrdiff_t beg, ptrdiff_t length, entry = Fcons (Qnil, Fcons (prop, Fcons (value, Fcons (lbeg, lend)))); bset_undo_list (current_buffer, Fcons (entry, BVAR (current_buffer, undo_list))); - - /* Reset the buffer */ - set_buffer_internal (obuf); } DEFUN ("undo-boundary", Fundo_boundary, Sundo_boundary, 0, 0, 0, @@ -432,7 +414,6 @@ void syms_of_undo (void) { DEFSYM (Qinhibit_read_only, "inhibit-read-only"); - DEFSYM (Qundo_auto__undoable_change, "undo-auto--undoable-change"); DEFSYM (Qundo_auto__last_boundary_cause, "undo-auto--last-boundary-cause"); DEFSYM (Qexplicit, "explicit"); -- cgit v1.2.1