fix(treesitter): fix TSNode:tree() double free (#24796)

Problem: `push_tree`, every time its called for the same TSTree with
`do_copy=false` argument, creates a new userdata for it. Each userdata,
when garbage collected, frees the same TSTree C object.

Solution: Add flag to userdata, which indicates, should C object,
which userdata points to, be freed, when userdata is garbage collected.
This commit is contained in:
nwounkn
2023-08-29 13:48:23 +05:00
committed by Christian Clason
parent e3389c1533
commit a3c963adfc
2 changed files with 43 additions and 30 deletions

View File

@@ -4,6 +4,7 @@ local clear = helpers.clear
local eq = helpers.eq
local exec_lua = helpers.exec_lua
local insert = helpers.insert
local assert_alive = helpers.assert_alive
before_each(clear)
@@ -14,6 +15,17 @@ end
describe('treesitter node API', function()
clear()
it('double free tree', function()
insert('F')
exec_lua([[
vim.treesitter.start(0, 'lua')
vim.treesitter.get_node():tree()
vim.treesitter.get_node():tree()
collectgarbage()
]])
assert_alive()
end)
it('can move between siblings', function()
insert([[
int main(int x, int y, int z) {