gpt4 book ai didi

lua - D: (Win32) lua_rawgeti() 推送 nil

转载 作者:行者123 更新时间:2023-12-04 16:48:24 24 4
gpt4 key购买 nike

我正在调查一个奇怪的问题:在 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));

完整源代码和构建 bat: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 库,并将 printf() 添加到 lua_rawgeti() (lapi.c:660) 以打印出引用:

printf("lua_rawgeti(%d)\n", n);

我还在 test.d 中添加了 writeln() 以告诉我我们在哪个点调用 lua_rawgeti()。说明D正确发送了引用号:

lua_rawgeti(2)
lua_rawgeti(0)
Dereferencing:
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
  • DerelictLua 最新版本(提交 5549c1a)
  • DerelictUtil 最新版本(提交 8dda339)

问题:

代码中是否存在我没​​有发现的错误?在 Windows 上使用 32 位 D 和 Lua 是否有任何已知的“怪癖”?我的编译器和库不会有任何大问题,因为它们编译和链接在一起没有任何错误,而且 lua 调用大部分工作(例如打开 lua 状态,将 _G 插入堆栈等)。

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

我想知道,是否有人成功地使用了 64 位 Windows DMD + Lua。当然,如果有人成功使用 32 位 Windows DMD + Lua,我将不胜感激。

我不知道去哪里寻找解决方案。有什么想法接下来要尝试什么吗?

提前致谢!

最佳答案

我从 lua 邮件列表得到了答案:http://lua-users.org/lists/lua-l/2019-05/msg00076.html

I suspect this is a bug in DerelictLua.

Lua defines lua_rawgeti thus:

int lua_rawgeti (lua_State *L, int index, lua_Integer n);

While DerelictLua defines its binding thus:

alias da_lua_rawgeti = int function(lua_State*, int, int);

我修复了这个问题并创建了对 DerelictLua 的拉取请求.

关于lua - D: (Win32) lua_rawgeti() 推送 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56036831/

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