aboutsummaryrefslogtreecommitdiff
path: root/src/nvim/marktree.c
diff options
context:
space:
mode:
authorLuuk van Baal <luukvbaal@gmail.com>2024-09-02 16:21:34 +0200
committerLuuk van Baal <luukvbaal@gmail.com>2024-09-04 15:13:12 +0200
commit34ded4d97b78063f5174b0e8dfb9d9bafdcb3110 (patch)
treecbeadc591a84250a8f49b1bea3674b0a515960c6 /src/nvim/marktree.c
parentb6e350a6b4df40fcc99931c460668c36fadc9989 (diff)
downloadrneovim-34ded4d97b78063f5174b0e8dfb9d9bafdcb3110.tar.gz
rneovim-34ded4d97b78063f5174b0e8dfb9d9bafdcb3110.tar.bz2
rneovim-34ded4d97b78063f5174b0e8dfb9d9bafdcb3110.zip
fix(decor): exclude invalid marks from meta total
Problem: Marktree meta count still includes invalidated marks, making guards that check the meta total ineffective. Solution: Revise marktree metadata when in/revalidating a mark.
Diffstat (limited to 'src/nvim/marktree.c')
-rw-r--r--src/nvim/marktree.c12
1 files changed, 4 insertions, 8 deletions
diff --git a/src/nvim/marktree.c b/src/nvim/marktree.c
index 9e3005b6a3..555fef5bbd 100644
--- a/src/nvim/marktree.c
+++ b/src/nvim/marktree.c
@@ -446,7 +446,7 @@ static MTNode *marktree_alloc_node(MarkTree *b, bool internal)
// really meta_inc[kMTMetaCount]
static void meta_describe_key_inc(uint32_t *meta_inc, MTKey *k)
{
- if (!mt_end(*k)) {
+ if (!mt_end(*k) && !mt_invalid(*k)) {
meta_inc[kMTMetaInline] += (k->flags & MT_FLAG_DECOR_VIRT_TEXT_INLINE) ? 1 : 0;
meta_inc[kMTMetaLines] += (k->flags & MT_FLAG_DECOR_VIRT_LINES) ? 1 : 0;
meta_inc[kMTMetaSignHL] += (k->flags & MT_FLAG_DECOR_SIGNHL) ? 1 : 0;
@@ -774,14 +774,10 @@ uint64_t marktree_del_itr(MarkTree *b, MarkTreeIter *itr, bool rev)
return other;
}
-void marktree_revise_flags(MarkTree *b, MarkTreeIter *itr, uint16_t new_flags)
+void marktree_revise_meta(MarkTree *b, MarkTreeIter *itr, MTKey old_key)
{
- uint32_t meta_old[4];
- meta_describe_key(meta_old, rawkey(itr));
- rawkey(itr).flags &= (uint16_t) ~MT_FLAG_EXTERNAL_MASK;
- rawkey(itr).flags |= new_flags;
-
- uint32_t meta_new[4];
+ uint32_t meta_old[4], meta_new[4];
+ meta_describe_key(meta_old, old_key);
meta_describe_key(meta_new, rawkey(itr));
if (!memcmp(meta_old, meta_new, sizeof(meta_old))) {