2014-05-08 3 views
1

Позвольте мне сделать это простым.LUA FFI: попытка переопределить ошибку при выполнении нескольких ffi.cdef

У меня есть несколько тестов для запуска, и после каждого теста я очищаю все требования, сделанные текущим тестом, используя package.loaded [] = nil.

Проблема заключается в том, что мы удаляем требуемые файлы из глобального пространства имен, я вижу, что файл ffi.cdef, сделанный этими файлами, остается неповрежденным, а когда мне нужен agian, он выдает ошибку как «попытка переопределить» «

Есть ли у нас какой-либо метод, с помощью которого мы можем очистить загруженный cdef? или может загрузить загруженный cdef, чтобы я мог сохранить старый cdef и восстановить его после завершения теста? Или есть какой-либо другой метод, который я могу сделать с той же задачей?

Я просто ищу что-то вроде ffi.uncdef.

+0

Короткий ответ: вы не можете. –

ответ

1

Нет такой функции, и не зря.

Прежде всего, установка package.loaded[pkg] = nilне официальный способ выгрузить модуль, особенно код C. See one of my previous answers. Кроме того, разгрузка cdefs не так проста; что произойдет, если вы выгрузите cdef с объектами, использующими его?

Единственный способ протестировать код, выполняющий cdefs, - это создать новый процесс lua_State или luajit для каждого теста.

(Кроме того, это Lua, not LUA)

+0

Да, я создаю отдельный env для каждого теста, но поскольку тестовый скрипт имеет один и тот же модуль require и ffi, они повреждают глобальное пространство имен. Я сделал обходной путь для требования, удалив все модули, загруженные с помощью теста, но не нашел в любом случае для cdefs. –

+0

Среды - это не то же самое, что 'lua_State's. –

+0

Извините, что я новичок в Lua, поэтому могу показаться немного глупым. Но мы запускаем это из файла Lua, я думаю, что 'lua_state' - это тот, который мы создаем, когда мы выполняем файл C, а не файл Lua. Можете указать мне на любой пример, где мы можем создать новый' lua_state' из файл Lua. И спасибо за ваш более ранний ответ :). –