An extent-info structure consists of a list of the buffer or string’s extents and a stack of extents that lists all of the extents over a particular position. The stack-of-extents info is used for optimization purposes—it basically caches some info that might be expensive to compute. Certain otherwise hard computations are easy given the stack of extents over a particular position, and if the stack of extents over a nearby position is known (because it was calculated at some prior point in time), it’s easy to move the stack of extents to the proper position.
Given that the stack of extents is an optimization, and given that
it requires memory, a string’s stack of extents is wiped out each
time a garbage collection occurs. Therefore, any time you retrieve
the stack of extents, it might not be there. If you need it to
be there, use the
Similarly, a string may or may not have an extent_info structure.
(Generally it won’t if there haven’t been any extents added to the
string.) So use the
_force version if you need the extent_info
structure to be there.
A list of extents is maintained as a double gap array: one gap array is ordered by start index (the display order) and the other is ordered by end index (the e-order). Note that positions in an extent list should logically be conceived of as referring to a particular extent (as is the norm in programs) rather than sitting between two extents. Note also that callers of these functions should not be aware of the fact that the extent list is implemented as an array, except for the fact that positions are integers (this should be generalized to handle integers and linked list equally well).