diff options
author | Yuan Fu <casouri@gmail.com> | 2024-06-29 00:16:36 -0700 |
---|---|---|
committer | Yuan Fu <casouri@gmail.com> | 2024-06-29 16:49:52 -0700 |
commit | 8819e5a45d503b62c38e6310ceda9266606cd6d1 (patch) | |
tree | f73509aec9a65d077f1541c158538389542f4951 /lisp/emacs-lisp/lisp-mode.el | |
parent | eaf2dc96c1f44fe8e07cf19614d7b73df9397ea0 (diff) | |
download | emacs-8819e5a45d503b62c38e6310ceda9266606cd6d1.tar.gz emacs-8819e5a45d503b62c38e6310ceda9266606cd6d1.tar.bz2 emacs-8819e5a45d503b62c38e6310ceda9266606cd6d1.zip |
Fix treesit crash (bug#71681)
To reproduce the problem:
0. emacs -Q
1. eval: (add-to-list 'major-mode-remap-alist '(c-mode . c-ts-mode))
2. C-x v L
3. in the *vc-change-log* buffer move point to the commit 20af58d3a13
4. type D
5. crash caused by diff-font-lock-syntax fontification that uses treesit
Emacs: 6f2036243f2 (2024-06-23, latest master)
Tree-sitter: 3da7deed (2024-06-08, version 0.22.6)
The immediate cause of the crash is that tree-sitter accessed a node's
tree, but the tree is already deleted. Commenting out the
ts_tree_delete line in treesit_ensure_parsed can "fix" the crash.
What happended, I think, is this:
1. Buffer modified, parser->need_reparse set to true,
parser->timestamp incremented.
2. A node is created from the parser, this node has the old tree but
the new timestamp (bad!).
3. Parser re-parses (treesit_ensure_parsed), new tree created, old
tree deleted.
4. Ftreesit_query_capture accessed the old node, and the old tree,
crash.
We shouldn't bump the parser timestamp when we set
parser->need_reparse to true; instead, we should bump the timestamp
when we actually reparsed and created a new tree.
* src/treesit.c (treesit_record_change): Don't bump parser timestamp.
(treesit_sync_visible_region): Don't bump parser timestamp.
(Ftreesit_parser_set_included_ranges): Don't bump parser timestamp.
(treesit_ensure_parsed): Bump parser timestamp.
(Ftreesit_query_capture): Add node check.
Diffstat (limited to 'lisp/emacs-lisp/lisp-mode.el')
0 files changed, 0 insertions, 0 deletions