Preciso utilizar lua_remove/lua_pop após uma lua_pcall, mas não sei qual é a abordagem correta

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Preciso utilizar lua_remove/lua_pop após uma lua_pcall, mas não sei qual é a abordagem correta

Vicente Neto
Boa tarde, pessoal!

Estou trabalhando em uma camada de scripts Lua 5.1 para um engine de games C++(realizei o binding com a ferramenta toLua).

A camada está funcionando muito bem, mas tem uma questão que não entendo perfeitamente:

O engine é capaz de notificar eventos para os objetos Lua realizando chamadas lua_pcall para a função EventDispatcher.OnUpdate(GameObject,timeElapsed),
mas se eu não por um lua_remove/lua_pop ao fim da chamada, o uso de memoria não coletada pelo gc aumenta rapidamente até a aplicação "crashar".

Encontrei esta solução(lua_remove) há um tempo atrás em um fórum, mas não entendi exatamente por que é necessário, como funciona, e qual o parâmetro correto.

Intuitivamente, o que me pareceria correto seria uma chamada a lua_pop, removendo dois elementos, mas esta abordagem faz a aplicação "crashar" imediatamente.

As seguintes abordagens funcionam(nao "crasha" nem aumenta o garbage):

lua_remove(GameEngine::LUA_STATE, -1);
ou
lua_remove(GameEngine::LUA_STATE, -2);
ou
lua_pop(GameEngine::LUA_STATE,1);

Mas qual é a correta? Alguém saberia me dizer dado o seguinte trecho de código?

/*******************************************************************************************/
    static inline void doUpdateEvent(GameObject *obj, long timeElapsed)
        {
           
            lua_getglobal(GameEngine::LUA_STATE,"EventDispatcher");
            lua_getfield(GameEngine::LUA_STATE,-1,"OnUpdate");
            tolua_pushusertype(GameEngine::LUA_STATE,obj,"GameObject");
            tolua_pushnumber(GameEngine::LUA_STATE,(lua_Number)timeElapsed);
       
            if(lua_pcall(GameEngine::LUA_STATE,2,0,0)!=0)
            {
                GameEngine::getInstance()->registerError("LUA: %s - <%s [%d]>", lua_tostring(GameEngine::LUA_STATE, -1),__FILE__,__LINE__);
            }
       
            //removes userdata from the stack(otherwise garbage will grow until an eventual crash)                                
            //lua_remove(GameEngine::LUA_STATE, -1); FUNCIONA
            //lua_remove(GameEngine::LUA_STATE, -2); FUNCIONA

            //lua_pop(GameEngine::LUA_STATE,2);//NAO FUNCIONA (CRASHA)
            lua_pop(GameEngine::LUA_STATE,1);//FUNCIONA
           
        }

/*******************************************************************************************/

Grato,
Vicente

--
Lua BR - http://groups.google.com/group/lua-br