Fix treesit-parse-string crash (bug#71012)
authorYuan Fu <casouri@gmail.com>
Sat, 1 Jun 2024 17:33:18 +0000 (10:33 -0700)
committerYuan Fu <casouri@gmail.com>
Sat, 1 Jun 2024 17:33:18 +0000 (10:33 -0700)
Parsing a large file with treesit-parse-string and then printing the
returned node crashes Emacs, because with-temp-buffer kills the temp
buffer when treesit-parse-string returns, and print.c tries to access
the node's position in the killed buffer.

* lisp/treesit.el (treesit-parse-string): Don't use with-temp-buffer.

lisp/treesit.el

index 2676ed932dc244ef6291a316fadb0dbc94eb305d..151d930278602b3c4d14f6a476e37477ea78ee50 100644 (file)
@@ -122,10 +122,13 @@ of max unsigned 32-bit value for byte offsets into buffer text."
 (defun treesit-parse-string (string language)
   "Parse STRING using a parser for LANGUAGE.
 Return the root node of the syntax tree."
-  (with-temp-buffer
-    (insert string)
-    (treesit-parser-root-node
-     (treesit-parser-create language))))
+  ;; We can't use `with-temp-buffer' because it kills the buffer when
+  ;; returning from the form.
+  (let ((buf (generate-new-buffer " *treesit-parse-string*")))
+    (with-current-buffer buf
+      (insert string)
+      (treesit-parser-root-node
+       (treesit-parser-create language)))))
 
 (defvar-local treesit-language-at-point-function nil
   "A function that returns the language at point.