public static void CompleteTypeMeta(IntPtr ptr, LuaCSFunction con, Type self) { LuaNativeMethods.lua_pushstring(ptr, ObjectCache.GetAQName(self)); LuaNativeMethods.lua_setfield(ptr, -3, "__fullname"); indexFunction.Push(ptr); LuaNativeMethods.lua_setfield(ptr, -2, "__index"); newIndexFunction.Push(ptr); LuaNativeMethods.lua_setfield(ptr, -2, "__newindex"); if (con == null) { con = NoConstructor; } PushValue(ptr, con); LuaNativeMethods.lua_setfield(ptr, -2, "__call"); LuaNativeMethods.lua_pushcfunction(ptr, TypeToString); LuaNativeMethods.lua_setfield(ptr, -2, "__tostring"); LuaNativeMethods.lua_pushvalue(ptr, -1); LuaNativeMethods.lua_setmetatable(ptr, -3); LuaNativeMethods.lua_setfield(ptr, LuaIndexes.LUARegistryIndex, self.FullName); }
private static void CompleteInstanceMeta(IntPtr ptr, Type self) { LuaNativeMethods.lua_pushstring(ptr, "__typename"); LuaNativeMethods.lua_pushstring(ptr, self.Name); LuaNativeMethods.lua_rawset(ptr, -3); // for instance indexFunction.Push(ptr); LuaNativeMethods.lua_setfield(ptr, -2, "__index"); newIndexFunction.Push(ptr); LuaNativeMethods.lua_setfield(ptr, -2, "__newindex"); PushValue(ptr, luaAdd); LuaNativeMethods.lua_setfield(ptr, -2, "__add"); PushValue(ptr, luaSub); LuaNativeMethods.lua_setfield(ptr, -2, "__sub"); PushValue(ptr, luaMul); LuaNativeMethods.lua_setfield(ptr, -2, "__mul"); PushValue(ptr, luaDiv); LuaNativeMethods.lua_setfield(ptr, -2, "__div"); PushValue(ptr, luaUnm); LuaNativeMethods.lua_setfield(ptr, -2, "__unm"); PushValue(ptr, luaEq); LuaNativeMethods.lua_setfield(ptr, -2, "__eq"); PushValue(ptr, luaLe); LuaNativeMethods.lua_setfield(ptr, -2, "__le"); PushValue(ptr, luaLt); LuaNativeMethods.lua_setfield(ptr, -2, "__lt"); PushValue(ptr, luaToString); LuaNativeMethods.lua_setfield(ptr, -2, "__tostring"); LuaNativeMethods.lua_pushcfunction(ptr, LuaGC); LuaNativeMethods.lua_setfield(ptr, -2, "__gc"); if (self.IsValueType && IsImplByLua(self)) { LuaNativeMethods.lua_pushvalue(ptr, -1); LuaNativeMethods.lua_setglobal(ptr, self.FullName + ".Instance"); } LuaNativeMethods.lua_setfield(ptr, LuaIndexes.LUARegistryIndex, ObjectCache.GetAQName(self)); }
public static void CreateTypeMetatable(IntPtr ptr, LuaCSFunction con, Type self, Type parent) { CheckMethodValid(con); // set parent bool parentSet = false; LuaNativeMethods.lua_pushstring(ptr, "__parent"); while (parent != null && parent != typeof(object) && parent != typeof(ValueType)) { LuaNativeMethods.luaL_getmetatable(ptr, ObjectCache.GetAQName(parent)); // if parentType is not exported to lua if (LuaNativeMethods.lua_isnil(ptr, -1)) { LuaNativeMethods.lua_pop(ptr, 1); parent = parent.BaseType; } else { LuaNativeMethods.lua_rawset(ptr, -3); LuaNativeMethods.lua_pushstring(ptr, "__parent"); LuaNativeMethods.luaL_getmetatable(ptr, parent.FullName); LuaNativeMethods.lua_rawset(ptr, -4); parentSet = true; break; } } if (!parentSet) { LuaNativeMethods.luaL_getmetatable(ptr, "__luabaseobject"); LuaNativeMethods.lua_rawset(ptr, -3); } CompleteInstanceMeta(ptr, self); CompleteTypeMeta(ptr, con, self); LuaNativeMethods.lua_pop(ptr, 1); // pop type Table }