lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


I have done some reading and I guess my question is whether
the following scheme will work?

    if (luaL_loadfile(L, my_script_file_name))  /* from lauxlib.h */
        lua_error(L);

    /* get a C function on the stack from the global env somehow */
    <some code> 
    lua_getfenv(L, ,-1);

    /* set it as the loaded chunk's environment
       (it will act as the chunk's table of globals) */
    lua_setfenv(L, -1);

    /* run chunk */
    lua_call(L, 0, 0);

    /* set the global env back to what it was b4 the lua_call */
    lua_setfenv(L, -1);


+++++++++++++++++++++++++++++++++
>D Burgess wrote:
>> Can someone explain to me how one saves/restores the state
>> of Lua Globals from within a C program (not via Lua script)?
>> Assume I have one Lua VM executing and I wish to save the
>> global state, execute a script then restore the state of
>> globals to what was prior to the script execution.
>
>In Lua 5 each closure maintains its own environment (globals.)  In
>particular you can load a chunk, then set its environment to some prepared
>table before execution:
>
>    if (luaL_loadfile(L, my_script_file_name))  /* from lauxlib.h */
>        lua_error(L);
>
>    /* prepare environment */
>    lua_newtable(L);
>    /* add some data here ... */
>
>    /* set it as the loaded chunk's environment
>       (it will act as the chunk's table of globals) */
>    lua_setfenv(L, -2);
>
>    /* run chunk */
>    lua_call(L, 0, 0);
>
>Note that all closures that are created by the chunk will (by default)
>inherit this environment and _hold on to it_ even if you store them
>somewhere else.  You can read some more about environments in the manual
>(see getfenv/setfenv and lua_getfenv/lua_setfenv.)
>
>--
>Wim