D: (Win32) lua_rawgeti () толкает ноль - PullRequest
3 голосов
/ 08 мая 2019

Я исследую странную проблему: в 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.

У меня немного нет идей, где искать решение. Есть идеи, что попробовать дальше?

Заранее спасибо!

1 Ответ

3 голосов
/ 09 мая 2019

Я получил ответ из списка рассылки 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 .

...