]> git.eshelyaron.com Git - emacs.git/commit
itree.c: Make the iterator reentrant (bug#59183)
authorStefan Monnier <monnier@iro.umontreal.ca>
Thu, 17 Nov 2022 22:00:22 +0000 (17:00 -0500)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 17 Nov 2022 22:00:22 +0000 (17:00 -0500)
commitfb7f1864da4aa4c09756cfe47db6c56b4e87bd14
tree4ccd8ca7e29c5609fa437884c739106a4f1b2cc2
parent13003105a8edf746a8e8819122bd1bcdf7f9ecdd
itree.c: Make the iterator reentrant (bug#59183)

Get rid of the global iterator object and instead allocate
a separate iterator for every loop.  This still uses the "duplicate
iterator" code, including the old iterator which needs a stack,
make ITREE_FOREACH a bit more expensive than we'd like.

* src/itree.h (init_itree, forget_itree, itree_iterator_busy_p):
Delete declarations.
(itree_iterator_start): Add iterator arg and remove `line` and `file` args.
(struct itree_iterator): Move from `itree.c`.  Remove `line` and
`file` fields.
(ITREE_FOREACH): Stack allocate an iterator object and pass it to
`itree_iterator_start`.

* src/itree.c (struct itree_iterator): Move to itree.h.
(iter): Delete global variable.
(itree_iterator_create, init_itree, forget_itree, itree_iterator_busy_p):
Delete functions.
(itree_contains): Adjust assertion.
(itree_iterator_finish): Deallocate the iterator's stack.
(itree_iterator_start): Take the (uninitialized) iterator as argument.
Allocate a fresh new stack.  Remove `file` and `line` arguments.
Don't check `running` any more since the iterator is not expected to be
initialized at all.

* src/eval.c (signal_or_quit):
* src/alloc.c (garbage_collect): Don't check `itree_iterator_busy_p`
any more.

* src/emacs.c (main): No need to `init_itree` any more.
(Fdump_emacs): No need to `forget_itree` any more.
src/alloc.c
src/emacs.c
src/eval.c
src/itree.c
src/itree.h