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上,我使用:

问题:

代码中是否有任何错误,我只是没有捕捉到? 是否有任何已知的“怪癖”或32位D和Lua在Windows上使用? 由于编译器和库编译和链接在一起没有任何错误,而且大部分lua调用都有效(例如打开lua状态,将_G推送到堆栈等),因此不能有任何大问题。

在谷歌上搜索时,我找不到任何相关的内容,因此我很确定我的设置有问题(某些不匹配)。 对于Lua库中的问题,我很难怀疑,因为它们已经稳定了相当长的一段时间(甚至包括32位版本)。

我想知道人们是否已成功使用64位Windows DMD + Lua。 当然,如果人们成功使用32位Windows DMD + Lua,我将非常感激。

我已经试尽了解决方案的想法。 有任何下一步尝试的想法吗?

预先感谢!

点赞
用户4257814
用户4257814

我从 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。

2019-05-09 10:01:10