lua-users home
lua-l archive

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


David,

Hmm, I need to do this all from C, I looked into a few functions, such as

lua_newtable, lua_setfenv

but it is all really confusing, I don't suppose you could be a bit
more specific as to how I would do this in C?

Thanks,
-Raymond

On 7/10/06, David Morris-Oliveros <david.morrisoliveros@teambondi.com> wrote:
This is the basic pseudo code is below:

(the_thread == stack index index of lua_newthread())

newmetatable = {}
newmetatable.__index = _G
threadtable = {}
threadtable._G = _G
threadtable._THIS = this
threadtable._THREAD = the_thread
setmetatable ( threadtable, newmetatable )
_G._THREADS[this] = threadtable
setfenv( the_thread, threadtable )


Raymond Jacobs wrote: > David, > > That sounds like a plan, could you 'or anyone else' elaborate on how I > would do the following 'im still pretty new to lua'. > > so how can i create a new table, and add _G to it, which points to the > 'true' global environment, and then how do I set this new table as the > co-routines environment. > > some sample code, or a list of the functions I need to investigate > would be really helpful. > > Thanks again =) > > -Raymond > > On 7/10/06, David Morris-Oliveros <david.morrisoliveros@teambondi.com> > wrote: >> First of all, sorry about the chaotic email, it's still too early in the >> morning for me :) >> >> You can try sandboxing the coroutine. That's what we do in our game. >> Each coroutine gets it's own environment, but still with access to the >> global env. >> >> You create a table, whose metatable is the global global, and set that >> to be the local global's table, with an explicit entry to _G. That way, >> you can create local and global stuff: >> >> local really_local_variable = 1 >> local_variable = 1 >> _G.global_variable = 1 >> function local_function () end >> function _G.global_function () end >> >> Also, if you set the local global's metatable to be the global global, >> you get everything else for free. That is, you can access all the >> functions and variables defined in the global global as if they where >> local: >> >> _G.fibonacci(5) >> fibonacci() >> >> would be the same call (as long as you haven't created a new fibonacci() >> function in you local global). >> >> From C, you can obtain the local global and then call the function by >> name within that local global. >> >> We keep a table with all of these things: >> >> _G._THREADS = {} >> >> I then add each local global to that table using the C's substate >> pointer's numerical value as key. That way it's easy to extract the >> local global from C, and then call whatever. >> >> This way, you can easily set global variables ( _G.var = value ), or >> local ones (but still have access to them from outside), and all will be >> cleaned up on coroutine exit, because "local" functions exist only >> within the local global table. >> >> Raymond Jacobs wrote: >> > Hey all, >> > >> > In our game we utilize a single Lua_State, and create a co routine >> > (initialized with the main lua_state) for each other script we run. >> > >> > It is great that the variables we create in these other scripts remain >> > global and accessible from any other script we run, however, we run >> > into this problem: >> > >> > >> > if we load 'scriptA.lua' which contains the function onClick() >> > >> > and later load 'scriptB.lua' which doesn't contain an onClick() >> > function, the previous onClick function still remains. >> > >> > so in short, when we run a script (through a co-routine) we would like >> > to start a clean slate as far as functions are concerned, but we still >> > want to be able to access all of the global variables we've created. >> > >> > now, i noticed it is seemingly valid to create functions with the >> > 'local' prefix on them, to me this sounds like what we need (so that >> > the functions don't get embedded into the global area) however I can't >> > figure out how to call a local function from C (all of our co-routine >> > creation, script loading, and function calling happens from C). >> > >> > I am pretty sure someone has run into this issue before, any help >> > would be appreciated. >> > >> > Thanks for your time, >> > Raymond Jacobs >> > Owner, >> > Ethereal Darkness Interactive >> > >> >> -- >> >> // david morris-oliveros >> // camera & lua coder >> // david@teambondi.com >> >> >

--

// david morris-oliveros
// camera & lua coder
// david@teambondi.com