Skompiluj kod lua, zachowaj kod bajtowy, a następnie załaduj i wykonaj go

Próbuję skompilować skrypt lua, który wywołuje wyeksportowane funkcje, zapisuje wynikowy bajt do pliku, a następnie ładuje ten bajt i wykonuje go, ale nie znalazłem żadnego przykładu, jak to zrobić. Czy jest jakiś przykład, jak to zrobić? Jak mogę to zrobić?

Edit: używam Lua + Luabind (C++)

Author: WoLfulus, 2012-01-20

1 answers

To wszystko jest bardzo proste.

Najpierw ładujesz skrypt Lua BEZ jego wykonywania. Nie ma znaczenia, czy połączyłeś Stan Lua z wyeksportowanymi funkcjami; jedyne, co robisz, to kompilowanie pliku skryptu.

Możesz użyć luaL_loadfile, który używa funkcji biblioteki C-standard do odczytu pliku z dysku i załadowania go do lua_State. Alternatywnie, możesz załadować plik samodzielnie do ciągu znaków i użyć luaL_loadstring, aby załadować go do lua_State.

Oba te funkcje będą emitować wartości zwrotne i błędy kompilatora zgodnie z dokumentacją dla lua_load.

Jeśli Kompilacja się powiodła, lua_State ma teraz skompilowany fragment Lua jako funkcję Lua na górze stosu. Aby uzyskać skompilowany plik binarny, należy użyć funkcji lua_dump. Jest to dość skomplikowane, ponieważ używa interfejsu zwrotnego do przekazywania danych. Zobacz dokumentację dla szczegółów .

Po tym procesie, masz skompilowany kod bajtowy Lua. Shove that do wybranego pliku. Pamiętaj tylko: zapisz to jako binarny , a nie z tłumaczeniem tekstu.

Kiedy przychodzi czas na wczytanie kodu bajtowego, wszystko, co musisz zrobić, to... Dokładnie to, co robiłeś wcześniej. Prawie. Lua ma heurystykę pozwalającą wykryć, że dany "ciąg" jest ciągiem źródłowym Lua lub kodem bajtowym. Tak więc tak, możesz załadować kod bajtowy za pomocą luaL_loadfile, tak jak wcześniej.

Różnica polega na tym, że nie można używać {[2] } z kodem bajtowym. Funkcja ta oczekuje Null-zakończony łańcuch, który jest zły. Kod bajtowy może mieć wbudowane znaki NULL, co wszystko spieprzy. Więc jeśli chcesz zrobić plik IO samodzielnie (ponieważ używasz specjalnego systemu plików lub czegoś takiego), musisz użyć lua_load bezpośrednio. Który również używa interfejsu zwrotnego jak lua_dump. Więc przeczytaj, jak go używać.

 55
Author: Nicol Bolas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-20 04:41:15