2015-01-07 2 views
3

Я использую функцию API Lua «C» luaL_loadbuffer() для запуска кода Lua.Как я могу предварительно скомпилировать Lua, который я передаю luaL_loadbuffer()?

У меня есть небольшая горстка Lua chunks, которую я звоню много раз. Но каждый раз, когда я звоню luaL_loadbuffer(), кусок перекомпилируется. Это кажется крайне неэффективным. Большая часть кода, на который ссылается кусок, предварительно скомпилирована, но зачем мне перекомпилировать кусок каждый раз? Как я могу избежать этой перекомпиляции?

Могу ли я передать предварительно скомпилированный кусок до luaL_loadbuffer()?

Могу ли я сделать полную копию возвращенного стека Lua и повторно использовать его?

Есть ли какой-нибудь другой умный подход?

+2

Возвращенный кусок ** это ** ваш скомпилированный код. Если вы хотите запустить его более одного раза, сохраните его и запустите позже. Не стек, возвращенный кусок сам. –

+0

Под «возвращенным куском» вы имеете в виду тот, который находится в стеке, да? Могу ли я сохранить это использование в новом (чистом) стеке LUA? Или мне нужно использовать один и тот же стек, но просто убедитесь, что я все вытащил из него и снова надавил этот кусок? –

+1

Да, один в стеке. Нет, вы не можете перенести его на другой lua_State. Да, вы можете сохранить его в том же lua_State и использовать его позже. Это lua_State не стек. (Текущий) стек - это переходная вещь в большинстве случаев. Lua_State нет. –

ответ

2

Продолжить использование luaL_loadbuffer для загрузки сценариев. Нагрузка это означает прекомпиляция. Просто сохраните функцию слева в стеке где-нибудь в вашей программе (или оставьте ее в стеке, если сможете). Когда придет время запустить скрипт, lua_pushvalue и lua_pcall это.

1

Используйте luaL_loadstring для загрузки двоичного блока, который вы предварительно скомпилировали с помощью луака. Но будьте осторожны - эти двоичные файлы не переносятся на разных платформах или версиях Lua.

+0

D'oh! Да, в самом деле! lua_load говорит, что это должно быть возможно. Конечно, следующий вопрос заключается в том, как компилировать код без использования luac (т. Е. Без необходимости писать свой кусок на диск и выполнять вилку подпроцесса, так как все это yucky и немного хрупкое). –

+0

Если вы не хотите использовать luac, загрузите источник вместо этого и сбросьте объект функции с помощью lua_dump(). Это даст вам (почти) тот же результат - вам нужно будет указать имя фрагмента и т. Д., Когда вы его загрузите. – BadZen

+0

Это звучит довольно сложно! Есть ли вероятность ссылки на фрагмент кода примера? –

Смежные вопросы