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:
parent
96b8747d5c
commit
6f66a43d7a
@ -3899,12 +3899,9 @@ save_restriction_restore (Lisp_Object data)
|
||||
|
||||
buf->clip_changed = 1; /* Remember that the narrowing changed. */
|
||||
}
|
||||
/* This isn’t needed anymore, so don’t 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 buffer’s
|
||||
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
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
13
src/marker.c
13
src/marker.c
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user