Esempio n. 1
0
        /*
         * Pushes a CLR object into the Lua stack as an userdata
         * with the provided metatable
         */
        internal void pushObject(LuaCore.lua_State luaState, object o, string metatable)
        {
            int index = -1;

            // Pushes nil
            if (o.IsNull())
            {
                LuaLib.lua_pushnil(luaState);
                return;
            }

            // Object already in the list of Lua objects? Push the stored reference.
            bool found = objectsBackMap.TryGetValue(o, out index);

            if (found)
            {
                LuaLib.luaL_getmetatable(luaState, "luaNet_objects");
                LuaLib.lua_rawgeti(luaState, -1, index);

                // Note: starting with lua5.1 the garbage collector may remove weak reference items (such as our luaNet_objects values) when the initial GC sweep
                // occurs, but the actual call of the __gc finalizer for that object may not happen until a little while later.  During that window we might call
                // this routine and find the element missing from luaNet_objects, but collectObject() has not yet been called.  In that case, we go ahead and call collect
                // object here
                // did we find a non nil object in our table? if not, we need to call collect object
                var type = LuaLib.lua_type(luaState, -1);
                if (type != LuaTypes.Nil)
                {
                    LuaLib.lua_remove(luaState, -2);                             // drop the metatable - we're going to leave our object on the stack
                    return;
                }

                // MetaFunctions.dumpStack(this, luaState);
                LuaLib.lua_remove(luaState, -1);                        // remove the nil object value
                LuaLib.lua_remove(luaState, -1);                        // remove the metatable
                collectObject(o, index);                                // Remove from both our tables and fall out to get a new ID
            }

            index = addObject(o);
            pushNewObject(luaState, o, index, metatable);
        }