Ejemplo n.º 1
0
        private void pushNewObject(IntPtr luaState, object o, int index, string metatable)
        {
            LuaAPI.ulua_rawgeti(luaState, LuaAPI.LUA_REGISTRYINDEX, weakTableRef);
            LuaAPI.luanet_newudata(luaState, index);

            if (metatable == "luaNet_metatable")
            {
                Type t = o.GetType();
                PushMetaTable(luaState, o.GetType());

                if (LuaAPI.lua_isnil(luaState, -1))
                {
                    string meta = t.AssemblyQualifiedName;
                    Debugger.LogWarning("Create not wrap ulua type:" + meta);
                    LuaAPI.lua_settop(luaState, -2);
                    LuaAPI.luaL_newmetatable(luaState, meta);
                    LuaAPI.lua_pushstring(luaState, "cache");
                    LuaAPI.lua_newtable(luaState);
                    LuaAPI.lua_rawset(luaState, -3);
                    LuaAPI.lua_pushlightuserdata(luaState, LuaAPI.luanet_gettag());
                    LuaAPI.lua_pushnumber(luaState, 1);
                    LuaAPI.lua_rawset(luaState, -3);
                    LuaAPI.lua_pushstring(luaState, "__index");
                    LuaAPI.lua_pushstring(luaState, "luaNet_indexfunction");
                    LuaAPI.lua_rawget(luaState, LuaAPI.LUA_REGISTRYINDEX);
                    LuaAPI.lua_rawset(luaState, -3);
                    LuaAPI.lua_pushstring(luaState, "__gc");
                    LuaAPI.lua_pushstdcallcfunction(luaState, metaFunctions.gcFunction);
                    LuaAPI.lua_rawset(luaState, -3);
                    LuaAPI.lua_pushstring(luaState, "__tostring");
                    LuaAPI.lua_pushstdcallcfunction(luaState, metaFunctions.toStringFunction);
                    LuaAPI.lua_rawset(luaState, -3);
                    LuaAPI.lua_pushstring(luaState, "__newindex");
                    LuaAPI.lua_pushstdcallcfunction(luaState, metaFunctions.newindexFunction);
                    LuaAPI.lua_rawset(luaState, -3);
                }
            }
            else
            {
                LuaAPI.luaL_getmetatable(luaState, metatable);
            }
            LuaAPI.lua_setmetatable(luaState, -2);
            LuaAPI.lua_pushvalue(luaState, -1);
            LuaAPI.ulua_rawseti(luaState, -3, index);
            LuaAPI.lua_remove(luaState, -2);
        }
Ejemplo n.º 2
0
        static void PushMetaTable(IntPtr L, Type t)
        {
            int reference = -1;

            if (!typeMetaMap.TryGetValue(t, out reference))
            {
                LuaAPI.luaL_getmetatable(L, t.AssemblyQualifiedName);

                if (!LuaAPI.lua_isnil(L, -1))
                {
                    LuaAPI.lua_pushvalue(L, -1);
                    reference = LuaAPI.luaL_ref(L, LuaAPI.LUA_REGISTRYINDEX);
                    typeMetaMap.Add(t, reference);
                }
            }
            else
            {
                LuaAPI.ulua_rawgeti(L, LuaAPI.LUA_REGISTRYINDEX, reference);
            }
        }