LuaInterface.ObjectTranslator.pushObject C# (CSharp) Method

pushObject() private method

private pushObject ( IntPtr luaState, object o, string metatable ) : void
luaState IntPtr
o object
metatable string
return void
        internal void pushObject(IntPtr luaState, object o, string metatable)
        {
            int index = -1;
            // Pushes nil
            if(o==null)
            {
                LuaDLL.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)
            {
                LuaDLL.luaL_getmetatable(luaState,"luaNet_objects");
                LuaDLL.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
                LuaTypes type = LuaDLL.lua_type(luaState, -1);
                if (type != LuaTypes.LUA_TNIL)
                {
                    LuaDLL.lua_remove(luaState, -2);     // drop the metatable - we're going to leave our object on the stack

                    return;
                }

                // MetaFunctions.dumpStack(this, luaState);
                LuaDLL.lua_remove(luaState, -1);    // remove the nil object value
                LuaDLL.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);
        }

Usage Example

 public static int ctype(IntPtr luaState)
 {
     ObjectTranslator translator = ObjectTranslator.FromState(luaState);
     Type t = translator.typeOf(luaState, 1);
     if (t == null)
     {
         return translator.pushError(luaState, "not a CLR class");
     }
     translator.pushObject(luaState, t, "luaNet_metatable");
     return 1;
 }
All Usage Examples Of LuaInterface.ObjectTranslator::pushObject