Compile el código lua, almacene el código de bytes, luego cárguelo y ejecútelo

Estoy tratando de comstackr un script lua que llame a algunas funciones exportadas, guardar el bytecode resultante en un archivo y luego cargar este bytecode y ejecutarlo, pero no he encontrado ningún ejemplo sobre cómo hacerlo. ¿Hay algún ejemplo disponible sobre cómo hacer esto? ¿Cómo puedo hacer esto?

Edición: Estoy usando Lua + Luabind (C ++)

Todo esto es muy simple.

Primero, cargue el script Lua sin ejecutarlo. No importa si ha conectado el estado Lua con sus funciones exportadas; todo lo que estás haciendo es comstackr el archivo de script.

Puede usar luaL_loadfile , que utiliza funciones de biblioteca estándar C para leer un archivo del disco y cargarlo en lua_State . Alternativamente, puede cargar el archivo usted mismo en una cadena y usar luaL_loadstring para cargarlo en lua_State .

Ambas funciones emitirán valores de retorno y compiler errors según la documentación de lua_load .

Si la comstackción fue exitosa, lua_State ahora tiene el fragmento Lua comstackdo como una función Lua en la parte superior de la stack. Para obtener el binario comstackdo, debe usar la función lua_dump . Es bastante complicado, ya que utiliza una interfaz de callback para pasar sus datos. Consulte la documentación para más detalles .

Después de ese proceso, tienes el código comstackdo de byte Lua. Guarda eso en un archivo de tu elección. Solo recuerda: escríbelo como binario , no con traducción de texto.

Cuando llega el momento de cargar el código de byte, todo lo que necesita hacer es … exactamente lo que hizo antes . Bueno, casi. Lua tiene heurísticas para detectar que una “cadena” que se proporciona es una cadena fuente o código de byte de Lua. Entonces sí, puede cargar el código byte con luaL_loadfile como antes.

La diferencia es que no puede utilizar luaL_loadstring con el código de byte. Esa función espera una cadena terminada en NULL, que es mala. El código de bytes puede tener caracteres NULL incrustados en él, lo que arruinaría todo. Entonces, si quiere hacer el archivo IO usted mismo (porque está usando un sistema de archivos especial o algo así), debe usar lua_load directamente. Que también utiliza una interfaz de callback como lua_dump . Así que lea sobre cómo usarlo .

    Intereting Posts