diff options
author | Björn Linse <bjorn.linse@gmail.com> | 2021-06-22 13:48:22 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-22 13:48:22 +0200 |
commit | b601f2548c124e3a2b110abdfd62b80b12352e72 (patch) | |
tree | a549dd5d4b2100dd146a785fdc304f0b157d91a8 | |
parent | 9a39a11807d1cf682365262b7cca485a8fb38945 (diff) | |
parent | 43479f0ad6343ee04e0dd2a0251000cae1948bfd (diff) | |
download | rneovim-b601f2548c124e3a2b110abdfd62b80b12352e72.tar.gz rneovim-b601f2548c124e3a2b110abdfd62b80b12352e72.tar.bz2 rneovim-b601f2548c124e3a2b110abdfd62b80b12352e72.zip |
Merge pull request #14719 from snezhniylis/marktree_delete_node_iter_fix
Fix deletable nodes in MarkTree sometimes getting skipped
-rw-r--r-- | src/nvim/marktree.c | 1 | ||||
-rw-r--r-- | test/unit/marktree_spec.lua | 15 |
2 files changed, 16 insertions, 0 deletions
diff --git a/src/nvim/marktree.c b/src/nvim/marktree.c index 34acf64d83..feb54eae4a 100644 --- a/src/nvim/marktree.c +++ b/src/nvim/marktree.c @@ -356,6 +356,7 @@ void marktree_del_itr(MarkTree *b, MarkTreeIter *itr, bool rev) y = y->level ? y->ptr[0] : NULL; } } + itr->i--; } b->n_keys--; diff --git a/test/unit/marktree_spec.lua b/test/unit/marktree_spec.lua index 56acc0f93e..cd9c7bef13 100644 --- a/test/unit/marktree_spec.lua +++ b/test/unit/marktree_spec.lua @@ -186,5 +186,20 @@ describe('marktree', function() lib.marktree_check(tree) shadoworder(tree, shadow, iter2) end + + -- Check iterator validity for 2 specific edge cases: + -- https://github.com/neovim/neovim/pull/14719 + lib.marktree_clear(tree) + for i = 1,20 do + lib.marktree_put(tree, i, i, false) + end + + lib.marktree_itr_get(tree, 10, 10, iter) + lib.marktree_del_itr(tree, iter, false) + eq(11, iter[0].node.key[iter[0].i].pos.col) + + lib.marktree_itr_get(tree, 11, 11, iter) + lib.marktree_del_itr(tree, iter, false) + eq(12, iter[0].node.key[iter[0].i].pos.col) end) end) |