D:(Win32) lua_rawgeti()推送nil
我正在调查一个奇怪的问题:在Windows上,lua_rawgeti()不会将值返回到我已创建引用的位置,而是将nil。 代码:
lua_State * L = luaL_newstate();
luaL_requiref(L,“ _G”,luaopen_base,1);
lua_pop(L,1);
lua_getglobal(L,toStringz(“ _G”));
int t1 = lua_type(L,-1);
auto r = luaL_ref(L,LUA_REGISTRYINDEX);
lua_rawgeti(L,LUA_REGISTRYINDEX,r);
int t2 = lua_type(L,-1);
lua_close(L);
writefln(“ Ref:%d,types:%d,%d”),r,t1,t2);
assert(r!= LUA_REFNIL);
assert((t1!= LUA_TNIL)&&(t1 == t2));
完整的源代码和构建批处理:[https://github.com/mkoskim/games/tree/master/tests/luaref](https://github.com/mkoskim/games/tree/master/tests/luaref)
编译和运行:
rdmd-I<path>/DerelictLua/source/-I<path>/DerelictUtil/source/ testref.d
64位Linux(_G是表格,rawgeti将表格放在堆栈上):
$ build.bat
Ref:3,types:5,5
32位Windows(_G是表格,但rawgeti将nil放在堆栈上):
$ build.bat
Ref:3,types:5,0
<assertion fail>
因此,要么luaL_ref()未正确存储对_G的引用,要么lua_rawgeti()未正确检索到_G。
更新:我从源代码编译了Lua库,并在lua_rawgeti()(lapi.c:660)中添加了printf()以打印引用:
printf(“ lua_rawgeti(%d)\ n”,n);
我还在test.d中添加了writeln(),以告诉我何时调用lua_rawgeti()。 它显示D正确发送了引用号码:
lua_rawgeti(2)
lua_rawgeti(0)
取消引用:
lua_rawgeti(3)
Ref:3,types:5,0
在Windows上,我使用:
- DMD 2.086.0(32位Windows)
- lua53.dll(32位Windows,我尝试过lua-5.3.4和lua-5.3.5),从这里:[http://luabinaries.sourceforge.net/download.html](http://luabinaries.sourceforge.net/download.html)
- DerelictLua最新版本(提交5549c1a)
- DerelictUtil最新版本(提交8dda339)
问题:
代码中是否有任何错误,我只是没有捕捉到? 是否有任何已知的“怪癖”或32位D和Lua在Windows上使用? 由于编译器和库编译和链接在一起没有任何错误,而且大部分lua调用都有效(例如打开lua状态,将_G推送到堆栈等),因此不能有任何大问题。
在谷歌上搜索时,我找不到任何相关的内容,因此我很确定我的设置有问题(某些不匹配)。 对于Lua库中的问题,我很难怀疑,因为它们已经稳定了相当长的一段时间(甚至包括32位版本)。
我想知道人们是否已成功使用64位Windows DMD + Lua。 当然,如果人们成功使用32位Windows DMD + Lua,我将非常感激。
我已经试尽了解决方案的想法。 有任何下一步尝试的想法吗?
预先感谢!
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我从 lua 邮件列表中得到了答案:http://lua-users.org/lists/lua-l/2019-05/msg00076.html
我怀疑这是 DerelictLua 的一个 bug。 Lua 定义了 lua_rawgeti 如下: int lua_rawgeti (lua_State *L, int index, lua_Integer n); 而 DerelictLua 则定义了如下函数绑定: alias da_lua_rawgeti = int function(lua_State*, int, int);我修复了这个问题,并向 DerelictLua 创建了 pull request。