1
0
mirror of https://git.savannah.gnu.org/git/emacs.git synced 2025-01-24 19:03:29 +00:00

Centralize Bug#30931 fix

* src/marker.c (detach_marker): New function.
* src/editfns.c (save_restriction_restore):
* src/insdel.c (signal_before_change): Use it.
This commit is contained in:
Paul Eggert 2018-03-30 14:23:55 -07:00
parent 96b8747d5c
commit 6f66a43d7a
4 changed files with 18 additions and 14 deletions

View File

@ -3899,12 +3899,9 @@ save_restriction_restore (Lisp_Object data)
buf->clip_changed = 1; /* Remember that the narrowing changed. */
}
/* This isnt needed anymore, so dont wait for GC. Do not call
free_marker on XCAR (data) or XCDR (data), though, since
record_marker_adjustments may have put them on the buffers
undo list (Bug#30931). Just detach them instead. */
Fset_marker (XCAR (data), Qnil, Qnil);
Fset_marker (XCDR (data), Qnil, Qnil);
/* Detach the markers, and free the cons instead of waiting for GC. */
detach_marker (XCAR (data));
detach_marker (XCDR (data));
free_cons (XCONS (data));
}
else

View File

@ -2148,13 +2148,10 @@ signal_before_change (ptrdiff_t start_int, ptrdiff_t end_int,
FETCH_START, FETCH_END, Qnil);
}
/* Detach the markers now that we're done with them. Don't directly
free them, since the change functions could have caused them to
be inserted into the undo list (Bug#30931). */
if (! NILP (start_marker))
Fset_marker (start_marker, Qnil, Qnil);
detach_marker (start_marker);
if (! NILP (end_marker))
Fset_marker (end_marker, Qnil, Qnil);
detach_marker (end_marker);
RESTORE_VALUE;
unbind_to (count, Qnil);

View File

@ -4104,7 +4104,8 @@ extern ptrdiff_t marker_byte_position (Lisp_Object);
extern void clear_charpos_cache (struct buffer *);
extern ptrdiff_t buf_charpos_to_bytepos (struct buffer *, ptrdiff_t);
extern ptrdiff_t buf_bytepos_to_charpos (struct buffer *, ptrdiff_t);
extern void unchain_marker (struct Lisp_Marker *marker);
extern void detach_marker (Lisp_Object);
extern void unchain_marker (struct Lisp_Marker *);
extern Lisp_Object set_marker_restricted (Lisp_Object, Lisp_Object, Lisp_Object);
extern Lisp_Object set_marker_both (Lisp_Object, Lisp_Object, ptrdiff_t, ptrdiff_t);
extern Lisp_Object set_marker_restricted_both (Lisp_Object, Lisp_Object,

View File

@ -560,7 +560,7 @@ POSITION is nil, makes marker point nowhere so it no longer slows down
editing in any buffer. Returns MARKER. */)
(Lisp_Object marker, Lisp_Object position, Lisp_Object buffer)
{
return set_marker_internal (marker, position, buffer, 0);
return set_marker_internal (marker, position, buffer, false);
}
/* Like the above, but won't let the position be outside the visible part. */
@ -569,7 +569,7 @@ Lisp_Object
set_marker_restricted (Lisp_Object marker, Lisp_Object position,
Lisp_Object buffer)
{
return set_marker_internal (marker, position, buffer, 1);
return set_marker_internal (marker, position, buffer, true);
}
/* Set the position of MARKER, specifying both the
@ -616,6 +616,15 @@ set_marker_restricted_both (Lisp_Object marker, Lisp_Object buffer,
return marker;
}
/* Detach a marker so that it no longer points anywhere and no longer
slows down editing. Do not free the marker, though, as a change
function could have inserted it into an undo list (Bug#30931). */
void
detach_marker (Lisp_Object marker)
{
Fset_marker (marker, Qnil, Qnil);
}
/* Remove MARKER from the chain of whatever buffer it is in,
leaving it points to nowhere. This is called during garbage
collection, so we must be careful to ignore and preserve