В чем разница между dofile в lua и luaL_dofile в C API?

Используя Lua 5.3.4 C API, это работает:

luaL_dostring(lua, "dofile('mnemonics.lua')");

Но это не может выполнить файл:

luaL_dofile(lua, "mnemonics.lua");

Вместо этого он сообщает о «попытке вызвать строковое значение».

Когда я заменю его на

luaL_loadfile(lua, "mnemonics.lua");

он возвращает LUA_OK, но не помещает функцию в стек, как предполагалось. На самом деле стек после этого пуст (gettop сообщает 0).

Я могу использовать обходной путь dostring, но либо я что-то упускаю, либо есть ошибка.


person Octa9on    schedule 01.03.2017    source источник
comment
Это действительно странно. Дикое предположение: что-то, что произошло ранее в вашем коде C, испортило ваше состояние lua? Попробуйте запустить программу с помощью Valgrind.   -  person Hisham H M    schedule 02.03.2017
comment
Можете ли вы показать нам минимальный пример, который воспроизводит проблему, которую вы видите, потому что я не могу.   -  person greatwolf    schedule 02.03.2017
comment
При поиске минимального примера я обнаружил, что проблема была вызвана попыткой извлечь пустой стек. Я неправильно понял поведение вызова lua_settable. Я считаю, что причина, по которой команда Lua работала, а команда C API не работала, заключается в том, что стек очищается при переходе между кодом C и кодом Lua.   -  person Octa9on    schedule 02.03.2017


Ответы (1)


Извлечение из пустого стека вызовет неожиданное поведение. Интерпретатор Lua очищает стек между выполнением кода C и выполнением кода Lua, поэтому испорченный стек не повлиял на dofile в Lua.

person Octa9on    schedule 02.03.2017