summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/lisp-mode.el
diff options
context:
space:
mode:
authorYuan Fu <casouri@gmail.com>2024-06-29 00:16:36 -0700
committerYuan Fu <casouri@gmail.com>2024-06-29 16:49:52 -0700
commit8819e5a45d503b62c38e6310ceda9266606cd6d1 (patch)
treef73509aec9a65d077f1541c158538389542f4951 /lisp/emacs-lisp/lisp-mode.el
parenteaf2dc96c1f44fe8e07cf19614d7b73df9397ea0 (diff)
downloademacs-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