help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: When are unused overlays garbage collected?


From: Eli Zaretskii
Subject: Re: When are unused overlays garbage collected?
Date: Mon, 24 May 2021 15:27:04 +0300

> From: Marcin Borkowski <mbork@mbork.pl>
> Date: Mon, 24 May 2021 07:00:54 +0200
> 
> --8<---------------cut here---------------start------------->8---
> The overlay continues to exist as a Lisp object, and its property list
> is unchanged, but it ceases to be attached to the buffer it belonged to,
> and ceases to have any effect on display.
> 
> A deleted overlay is not permanently disconnected.  You can give it
> a position in a buffer again by calling ‘move-overlay’.
> --8<---------------cut here---------------end--------------->8---
> 
> So I assume that if I `delete-overlay', it means it cannot be
> necessarily garbage-collected yet.

Yes, it _can_ be GCed right away, at least in principle.  But Emacs
will not necessarily trigger GC right away, so the overlay will not
necessarily be collected immediately, even if it isn't references from
any other variable or structure anymore.

> My guess would be that if the overlay is "deleted" (so it is not
> attached to any buffer, either by means of `delete-overlay' or when its
> buffer is killed) /and/ it can't be referenced from Elisp (e.g., there
> is no variable bound to it).

That's not entirely true.  An overlay (like any other Lisp object)
that was deleted will not be collected as long as some variable
_actually_references_ it.  That could be a Lisp variable or a C
variable not exposed to Lisp.  The difference between what I wrote and
what you wrote is that the reference must actually exist, not only be
possible.

> This would make sense, because even if there is no variable bound to
> an overlay which is not deleted, you can still get a reference to it
> using any of the overlay-finding functions (`overlays-at' or
> `overlays-in').

No, overlays-in and overlays-at will not find a deleted overlay.
These functions walk the buffer's overlay list, and a deleted overlay
is unlinked from that list.

Does that answer your questions?  (I'm not sure what is exactly your
question, because you didn't describe the context in which this issue
bothered you.)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]