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); }
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); } }