diff options
author | Lewis Russell <lewis6991@gmail.com> | 2023-08-13 08:03:56 +0100 |
---|---|---|
committer | Lewis Russell <me@lewisr.dev> | 2023-08-13 11:23:17 +0100 |
commit | 8179d68dc1a90f47bfb307d73e71adc98883ae00 (patch) | |
tree | 63a85309d84f07b2061f3388e3fec2f5f8c1c0c7 /src/nvim/lua/treesitter.c | |
parent | e3ce025e55d7567dfc8ba5505ef27f112e75a8ad (diff) | |
download | rneovim-8179d68dc1a90f47bfb307d73e71adc98883ae00.tar.gz rneovim-8179d68dc1a90f47bfb307d73e71adc98883ae00.tar.bz2 rneovim-8179d68dc1a90f47bfb307d73e71adc98883ae00.zip |
fix(treesitter): logger memory leak
Diffstat (limited to 'src/nvim/lua/treesitter.c')
-rw-r--r-- | src/nvim/lua/treesitter.c | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/src/nvim/lua/treesitter.c b/src/nvim/lua/treesitter.c index 66a75f8d40..1e559316dd 100644 --- a/src/nvim/lua/treesitter.c +++ b/src/nvim/lua/treesitter.c @@ -325,6 +325,17 @@ static TSParser **parser_check(lua_State *L, uint16_t index) return luaL_checkudata(L, index, TS_META_PARSER); } +static void logger_gc(TSLogger logger) +{ + if (!logger.log) { + return; + } + + TSLuaLoggerOpts *opts = (TSLuaLoggerOpts *)logger.payload; + luaL_unref(opts->lstate, LUA_REGISTRYINDEX, opts->cb); + xfree(opts); +} + static int parser_gc(lua_State *L) { TSParser **p = parser_check(L, 1); @@ -332,12 +343,7 @@ static int parser_gc(lua_State *L) return 0; } - TSLogger logger = ts_parser_logger(*p); - if (logger.log) { - TSLuaLoggerOpts *opts = (TSLuaLoggerOpts *)logger.payload; - xfree(opts); - } - + logger_gc(ts_parser_logger(*p)); ts_parser_delete(*p); return 0; } @@ -698,7 +704,7 @@ static void logger_cb(void *payload, TSLogType logtype, const char *s) lua_State *lstate = opts->lstate; - nlua_pushref(lstate, opts->cb); + lua_rawgeti(lstate, LUA_REGISTRYINDEX, opts->cb); lua_pushstring(lstate, logtype == TSLogTypeParse ? "parse" : "lex"); lua_pushstring(lstate, s); if (lua_pcall(lstate, 2, 0, 0)) { @@ -726,11 +732,13 @@ static int parser_set_logger(lua_State *L) } TSLuaLoggerOpts *opts = xmalloc(sizeof(TSLuaLoggerOpts)); + lua_pushvalue(L, 4); + LuaRef ref = luaL_ref(L, LUA_REGISTRYINDEX); *opts = (TSLuaLoggerOpts){ .lex = lua_toboolean(L, 2), .parse = lua_toboolean(L, 3), - .cb = nlua_ref_global(L, 4), + .cb = ref, .lstate = L }; @@ -753,7 +761,7 @@ static int parser_get_logger(lua_State *L) TSLogger logger = ts_parser_logger(*p); if (logger.log) { TSLuaLoggerOpts *opts = (TSLuaLoggerOpts *)logger.payload; - nlua_pushref(L, opts->cb); + lua_rawgeti(L, LUA_REGISTRYINDEX, opts->cb); } else { lua_pushnil(L); } |