gpt4 book ai didi

c - 将 upvalue 传递给 C 中的 Lua 5.2 模块

转载 作者:太空宇宙 更新时间:2023-11-04 02:47:30 26 4
gpt4 key购买 nike

我正在尝试为自己创建一个实验环境,在该环境中,我的应用程序作为 telnet 服务器运行,理论上无限的 telnet 客户端可以在自己的 Lua 环境中执行 Lua 命令。为此,每个客户端都有自己的线程,因为我希望他们有自己的 Windows 消息循环以满足自己的特定需求。

我已经创建了几个可在 Lua 中访问的模块来做一些有趣的事情。我还希望能够从 Lua 创建一个窗口,所以我想添加一个名为“window”的模块并添加一个“new”方法。问题是,我需要知道我在哪个线程中(好吧,更具体地说,我需要我用来定义线程正在处理的客户端的类)并且我不知道如何将它放入window.new 的 C Lua 函数。

使用普通函数,您可以添加上值(我已经有了一个简单的 window 函数,它能够创建一个由运行它的线程管理的窗口),但是在创建模块时,当您尝试以标准方式进行操作时,这并不是那么简单。

我的窗口模块有以下典型的 luaopen 函数:

LUALIB_API int luaopen_window(lua_State *L)
{
luaL_newmetatable(L, "window");
luaL_setfuncs(L, reg_window_m, 0);
luaL_newlib(L, reg_window_f);
return 1;
}

我的线程创建一个 Lua 状态并打开必要的库,包括窗口:

luaL_requiref(L, "window", luaopen_window, 1);
lua_pop(L, 1);

我知道 luaL_setfuncs 函数支持上值,但已经太晚了。我没有办法传递值以放入向上值。

我试图在调用 luaL_requiref 之前推送它们并将它们弹出到 luaopen_window 函数中,在调用 luaL_setfuncs 之前再次推送它们但是它不起作用:由于 luaL_setfuncs 的内部工作方式,推送的值消失了。我当然可以编写自己的支持上值的 luaL_setfuncs(好吧,我想我可以),但是一定已经存在更好的方法了吗?

编辑:顺便说一句。我想阻止使用全局 Lua 变量来存储指向我的类的指针。这可能会成为一个安全风险,虽然这个工具可能永远不会在我的计算机之外使用,但我只想正确编写代码。

最佳答案

luaopen_* 函数应该由 require 调用,并且 require 不传递额外的参数(除了模块名称和文件path) 以避免在使用不同参数的第二次调用返回第一次调用的缓存结果时造成混淆。

但是,您可以在创建 Lua 状态后将线程/类存储在注册表中(在伪索引 LUA_REGISTRYINDEX)。如果没有 debug 库,Lua 就无法访问注册表,所以你应该是安全的。您可以在 luaopen_window 函数中检索该类并将其作为上值放入您的方法中,或者从您的方法中访问注册表。

为避免与在注册表中存储信息的其他模块发生冲突,您可以在代码中使用静态变量的地址作为表键。

关于c - 将 upvalue 传递给 C 中的 Lua 5.2 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25739594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com