Port interval trees to --enable-checking=structs

Some names under the interval_* namespace were renamed under the
itree_* namespace in commits:

  0. f421b58db5 of 2022-10-19
  "Prefix all itree.h type names with itree_".
  1. 37a1145410 of 2022-10-19
  "Rename all exported itree.h functions with the itree_ prefix"

Further, some values still referenced in commentary were removed in
commits:

  2. 258e618364 of 2022-10-17
  "Delete the itree_null sentinel node, use NULL everywhere."
  3. 2c4a3910b3 of 2022-10-02
  "itree: Use a single iterator object"

* src/emacs.c (main): Allocate global itree iterator once and for
all.
* src/alloc.c (mark_overlay):
* src/buffer.c (set_overlays_multibyte):
* src/itree.c (itree_destroy): Update commentary.
(interval_stack_ensure_space, itree_insert_gap): Prefer
unsigned-to-unsigned comparisons over signed-to-unsigned.
(interval_stack_push_flagged, interval_tree_insert)
(interval_tree_contains, itree_iterator_start)
(itree_iterator_finish, itree_iterator_next, itree_iterator_narrow):
Improve assertions.
(itree_init): Rename...
(init_itree): ...to this, for consistency with other global init
functions.
(itree_create): Stop leaking a global iterator allocation on each
call.
(interval_tree_init): Complete renames of
interval_tree -> itree_tree and interval_tree_clear -> itree_clear.
(interval_tree_remove_fix): Fix indentation.
* src/itree.h: Declare init_itree.
(ITREE_FOREACH): Fix typo in commentary.

* src/pdumper.c [CHECK_STRUCTS]
(dump_interval_node): Use the correct name in the HASH condition
and #error message.
(dump_overlay, dump_buffer): Update HASH (bug#58975).
This commit is contained in:
Basil L. Contovounesios 2022-11-02 03:50:38 +02:00
parent 8b8038494c
commit a66280162f
6 changed files with 27 additions and 32 deletions

View file

@ -6508,7 +6508,7 @@ mark_char_table (struct Lisp_Vector *ptr, enum pvec_type pvectype)
static void
mark_overlay (struct Lisp_Overlay *ov)
{
/* We don't mark the `interval_node` object, because it is managed manually
/* We don't mark the `itree_node` object, because it is managed manually
rather than by the GC. */
eassert (BASE_EQ (ov->interval->data, make_lisp_ptr (ov, Lisp_Vectorlike)));
set_vectorlike_marked (&ov->header);

View file

@ -982,7 +982,7 @@ set_overlays_multibyte (bool multibyte)
struct itree_tree *tree = current_buffer->overlays;
const intmax_t size = itree_size (tree);
/* We can't use `interval_node_set_region` at the same time
/* We can't use `itree_node_set_region` at the same time
as we iterate over the itree, so we need an auxiliary storage
to keep the list of nodes. */
USE_SAFE_ALLOCA;

View file

@ -82,6 +82,7 @@ along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>. */
#endif /* HAVE_WINDOW_SYSTEM */
#include "bignum.h"
#include "itree.h"
#include "intervals.h"
#include "character.h"
#include "buffer.h"
@ -1931,6 +1932,7 @@ Using an Emacs configured with --with-x-toolkit=lucid does not have this problem
running_asynch_code = 0;
init_random ();
init_xfaces ();
init_itree ();
#if defined HAVE_JSON && !defined WINDOWSNT
init_json ();

View file

@ -191,7 +191,7 @@ interval_stack_clear (struct interval_stack *stack)
}
static inline void
interval_stack_ensure_space (struct interval_stack *stack, intmax_t nelements)
interval_stack_ensure_space (struct interval_stack *stack, uintmax_t nelements)
{
if (nelements > stack->size)
{
@ -207,7 +207,7 @@ static inline void
interval_stack_push_flagged (struct interval_stack *stack,
struct itree_node *node, bool flag)
{
eassert (node && node != NULL);
eassert (node);
/* FIXME: While the stack used in the iterator is bounded by the tree
depth and could be easily pre-allocated to a large enough size to avoid
@ -287,8 +287,8 @@ itree_iterator_create (struct itree_tree *tree)
return g;
}
static void
itree_init (void)
void
init_itree (void)
{
iter = itree_iterator_create (NULL);
}
@ -555,16 +555,11 @@ itree_node_end (struct itree_tree *tree,
return node->end;
}
/* Allocate an interval_tree. Free with interval_tree_destroy. */
/* Allocate an itree_tree. Free with itree_destroy. */
struct itree_tree *
itree_create (void)
{
/* FIXME? Maybe avoid the initialization of itree_null in the same
way that is used to call mem_init in alloc.c? It's not really
important though. */
itree_init ();
struct itree_tree *tree = xmalloc (sizeof (*tree));
itree_clear (tree);
return tree;
@ -584,10 +579,9 @@ itree_clear (struct itree_tree *tree)
/* Initialize a pre-allocated tree (presumably on the stack). */
static void
interval_tree_init (struct interval_tree *tree)
interval_tree_init (struct itree_tree *tree)
{
interval_tree_clear (tree);
/* tree->iter = itree_iterator_create (tree); */
itree_clear (tree);
}
#endif
@ -596,8 +590,6 @@ void
itree_destroy (struct itree_tree *tree)
{
eassert (tree->root == NULL);
/* if (tree->iter)
* itree_iterator_destroy (tree->iter); */
xfree (tree);
}
@ -775,7 +767,7 @@ interval_tree_insert_fix (struct itree_tree *tree,
static void
interval_tree_insert (struct itree_tree *tree, struct itree_node *node)
{
eassert (node->begin <= node->end && node != NULL);
eassert (node && node->begin <= node->end);
/* FIXME: The assertion below fails because `delete_all_overlays`
doesn't set left/right/parent to NULL. */
/* eassert (node->left == NULL && node->right == NULL
@ -868,7 +860,7 @@ itree_node_set_region (struct itree_tree *tree,
static bool
interval_tree_contains (struct itree_tree *tree, struct itree_node *node)
{
eassert (node);
eassert (iter && node);
struct itree_node *other;
ITREE_FOREACH (other, tree, node->begin, PTRDIFF_MAX, ASCENDING)
if (other == node)
@ -912,7 +904,7 @@ interval_tree_remove_fix (struct itree_tree *tree,
if (parent == NULL)
eassert (node == tree->root);
else
eassert (node == NULL || node->parent == parent);
eassert (node == NULL || node->parent == parent);
while (parent != NULL && null_safe_is_black (node))
{
@ -1151,7 +1143,7 @@ itree_iterator_start (struct itree_tree *tree, ptrdiff_t begin,
ptrdiff_t end, enum itree_order order,
const char *file, int line)
{
/* struct itree_iterator *iter = tree->iter; */
eassert (iter);
if (iter->running)
{
fprintf (stderr,
@ -1179,7 +1171,7 @@ itree_iterator_start (struct itree_tree *tree, ptrdiff_t begin,
void
itree_iterator_finish (struct itree_iterator *iter)
{
eassert (iter->running);
eassert (iter && iter->running);
iter->running = false;
}
@ -1212,7 +1204,7 @@ itree_insert_gap (struct itree_tree *tree,
&& (node->begin != node->end || node->rear_advance))
interval_stack_push (saved, node);
}
for (int i = 0; i < saved->length; ++i)
for (size_t i = 0; i < saved->length; ++i)
itree_remove (tree, nav_nodeptr (saved->nodes[i]));
/* We can't use an iterator here, because we can't effectively
@ -1352,7 +1344,7 @@ interval_node_intersects (const struct itree_node *node,
struct itree_node *
itree_iterator_next (struct itree_iterator *g)
{
eassert (g->running);
eassert (g && g->running);
struct itree_node *const null = NULL;
struct itree_node *node;
@ -1424,9 +1416,9 @@ void
itree_iterator_narrow (struct itree_iterator *g,
ptrdiff_t begin, ptrdiff_t end)
{
eassert (g->running);
eassert (g && g->running);
eassert (begin >= g->begin);
eassert (end <= g->end);
g->begin = max (begin, g->begin);
g->end = min (end, g->end);
g->begin = max (begin, g->begin);
g->end = min (end, g->end);
}

View file

@ -106,6 +106,7 @@ enum itree_order
ITREE_PRE_ORDER,
};
extern void init_itree (void);
extern void itree_node_init (struct itree_node *, bool, bool, Lisp_Object);
extern ptrdiff_t itree_node_begin (struct itree_tree *, struct itree_node *);
extern ptrdiff_t itree_node_end (struct itree_tree *, struct itree_node *);
@ -147,7 +148,7 @@ extern struct itree_node *itree_iterator_next (struct itree_iterator *);
BEWARE:
- The expression T may be evaluated more than once, so make sure
it is cheap a pure.
it is cheap and pure.
- Only a single iteration can happen at a time, so make sure none of the
code within the loop can start another tree iteration, i.e. it shouldn't
be able to run ELisp code, nor GC since GC can run ELisp by way

View file

@ -2137,8 +2137,8 @@ static dump_off
dump_interval_node (struct dump_context *ctx, struct itree_node *node,
dump_off parent_offset)
{
#if CHECK_STRUCTS && !defined (HASH_interval_node_5765524F7E)
# error "interval_node changed. See CHECK_STRUCTS comment in config.h."
#if CHECK_STRUCTS && !defined (HASH_itree_node_50DE304F13)
# error "itree_node changed. See CHECK_STRUCTS comment in config.h."
#endif
struct itree_node out;
dump_object_start (ctx, &out, sizeof (out));
@ -2179,7 +2179,7 @@ dump_interval_node (struct dump_context *ctx, struct itree_node *node,
static dump_off
dump_overlay (struct dump_context *ctx, const struct Lisp_Overlay *overlay)
{
#if CHECK_STRUCTS && !defined (HASH_Lisp_Overlay_1CD4249AEC)
#if CHECK_STRUCTS && !defined (HASH_Lisp_Overlay_EB4C05D8D2)
# error "Lisp_Overlay changed. See CHECK_STRUCTS comment in config.h."
#endif
START_DUMP_PVEC (ctx, &overlay->header, struct Lisp_Overlay, out);
@ -2748,7 +2748,7 @@ dump_hash_table (struct dump_context *ctx,
static dump_off
dump_buffer (struct dump_context *ctx, const struct buffer *in_buffer)
{
#if CHECK_STRUCTS && !defined HASH_buffer_F0F08347A5
#if CHECK_STRUCTS && !defined HASH_buffer_193CAA5E45
# error "buffer changed. See CHECK_STRUCTS comment in config.h."
#endif
struct buffer munged_buffer = *in_buffer;