Я исследую странную проблему: в Windows lua_rawgeti () возвращает не значение, на которое я создал ссылку, а ноль. Код:
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
Компиляция и запуск:
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 помещает ноль в стек):
$ 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);
Я также добавил writeln () в test.d, чтобы сообщить мне, в какой момент мы вызываем 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 (commit 5549c1a)
- DerelictUtil новейшая версия (commit 8dda339)
Вопросы:
Есть ли в коде ошибка, которую я просто не улавливаю? Есть ли какие-то известные "причуды" или что-то подобное для использования 32-битных D и Lua в Windows? Не может быть больших проблем с моим компилятором и библиотеками, потому что они компилируются и связываются вместе без каких-либо ошибок, и вызовы lua в основном работают (например, открытие состояния lua, проталкивание _G в стек и т. Д.).
Мне не удалось найти что-либо связанное с поиском в Google, поэтому я почти уверен, что что-то не так в моей настройке (что-то не соответствует). Мне трудно заподозрить проблемы в библиотеках Lua, потому что они были стабильны довольно долгое время (даже 32-битные версии).
Хотелось бы знать, успешно ли люди использовали 64-битную Windows DMD + Lua. Конечно, я был бы рад услышать, если люди успешно используют 32-битную Windows DMD + Lua.
У меня немного нет идей, где искать решение. Есть идеи, что попробовать дальше?
Заранее спасибо!