fix(treesitter.c): improve comments on fenv usage

This commit is contained in:
Lewis Russell 2023-08-30 10:21:35 +01:00 committed by Lewis Russell
parent 62869da11c
commit f85aa2e67f

View File

@ -154,9 +154,9 @@ static void build_meta(lua_State *L, const char *tname, const luaL_Reg *meta)
lua_pop(L, 1); // [] (don't use it now) lua_pop(L, 1); // [] (don't use it now)
} }
/// init the tslua library /// Init the tslua library.
/// ///
/// all global state is stored in the regirstry of the lua_State /// All global state is stored in the registry of the lua_State.
void tslua_init(lua_State *L) void tslua_init(lua_State *L)
{ {
// type metatables // type metatables
@ -775,16 +775,17 @@ static int parser_get_logger(lua_State *L)
// Tree methods // Tree methods
/// push tree interface on lua stack. /// Push tree interface on to the lua stack.
/// ///
/// The tree is not copied. Ownership of the tree is transfered from c code to /// The tree is not copied. Ownership of the tree is transferred from C to
/// lua. if needed use ts_tree_copy() in the caller /// Lua. If needed use ts_tree_copy() in the caller
void push_tree(lua_State *L, TSTree *tree) static void push_tree(lua_State *L, TSTree *tree)
{ {
if (tree == NULL) { if (tree == NULL) {
lua_pushnil(L); lua_pushnil(L);
return; return;
} }
TSLuaTree *ud = lua_newuserdata(L, sizeof(TSLuaTree)); // [udata] TSLuaTree *ud = lua_newuserdata(L, sizeof(TSLuaTree)); // [udata]
ud->tree = tree; ud->tree = tree;
@ -792,9 +793,10 @@ void push_tree(lua_State *L, TSTree *tree)
lua_getfield(L, LUA_REGISTRYINDEX, TS_META_TREE); // [udata, meta] lua_getfield(L, LUA_REGISTRYINDEX, TS_META_TREE); // [udata, meta]
lua_setmetatable(L, -2); // [udata] lua_setmetatable(L, -2); // [udata]
// table used for node wrappers to keep a reference to tree wrapper // To prevent the tree from being garbage collected, create a reference to it
// NB: in lua 5.3 the uservalue for the node could just be the tree, but // in the fenv which will be passed to userdata nodes of the tree.
// in lua 5.1 the uservalue (fenv) must be a table. // Note: environments (fenvs) associated with userdata have no meaning in Lua
// and are only used to associate a table.
lua_createtable(L, 1, 0); // [udata, reftable] lua_createtable(L, 1, 0); // [udata, reftable]
lua_pushvalue(L, -2); // [udata, reftable, udata] lua_pushvalue(L, -2); // [udata, reftable, udata]
lua_rawseti(L, -2, 1); // [udata, reftable] lua_rawseti(L, -2, 1); // [udata, reftable]
@ -835,9 +837,9 @@ static int tree_root(lua_State *L)
// Node methods // Node methods
/// push node interface on lua stack /// Push node interface on to the Lua stack
/// ///
/// top of stack must either be the tree this node belongs to or another node /// Top of stack must either be the tree this node belongs to or another node
/// of the same tree! This value is not popped. Can only be called inside a /// of the same tree! This value is not popped. Can only be called inside a
/// cfunction with the tslua environment. /// cfunction with the tslua environment.
static void push_node(lua_State *L, TSNode node, int uindex) static void push_node(lua_State *L, TSNode node, int uindex)
@ -851,6 +853,8 @@ static void push_node(lua_State *L, TSNode node, int uindex)
*ud = node; *ud = node;
lua_getfield(L, LUA_REGISTRYINDEX, TS_META_NODE); // [udata, meta] lua_getfield(L, LUA_REGISTRYINDEX, TS_META_NODE); // [udata, meta]
lua_setmetatable(L, -2); // [udata] lua_setmetatable(L, -2); // [udata]
// Copy the fenv which contains the nodes tree.
lua_getfenv(L, uindex); // [udata, reftable] lua_getfenv(L, uindex); // [udata, reftable]
lua_setfenv(L, -2); // [udata] lua_setfenv(L, -2); // [udata]
} }