From 1ab2501db0f9e14f138292880e37120e7a6184de Mon Sep 17 00:00:00 2001 From: chai Date: Sat, 16 Mar 2019 13:03:50 +0800 Subject: *luax --- Source/3rdParty/Luax/luax_state.inl | 56 ++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 26 deletions(-) (limited to 'Source/3rdParty/Luax/luax_state.inl') diff --git a/Source/3rdParty/Luax/luax_state.inl b/Source/3rdParty/Luax/luax_state.inl index b5ee5aa..bd7ca9a 100644 --- a/Source/3rdParty/Luax/luax_state.inl +++ b/Source/3rdParty/Luax/luax_state.inl @@ -1,10 +1,10 @@ namespace Luax { - // 针对普通类和单例类有不同的注册过程,通过LuaxState的两个工厂方法Register_实现 - - // 注册工厂,分为注册interface table和class table,以type name为键设置在名称空间上。在注册阶段不会设置元表,等到New方法调用的时候才会。 - + /// + /// 注册工厂,分为注册interface table和class table,以type name为键设置在名称空间上。在注册阶段不会设置元表,等到New方 + /// 法调用的时候才会。 + /// template void LuaxState::RegisterFactory() { @@ -12,56 +12,51 @@ namespace Luax LuaxState& state = *this; int top = lua_gettop(L); // namespace table - assert(lua_istable(L, top)); - const char* type = T::GetLuaxFactoryName(); - - // interface table + // 1) interface table lua_newtable(L); + LuaxClass::RegisterLuaxInterface(state); + T::RegisterLuaxInterface(state); // interface table[__index] = interface table lua_pushvalue(L, -1); lua_setfield(L, -2, "__index"); - LuaxClass::RegisterLuaxInterface(state); - T::RegisterLuaxInterface(state); - - LuaxClass::SetInterfaceTableRef(state, -1); + LuaxClass::SetLuaxInterfaceTableRef(state, -1); lua_settop(L, top); - // class table + // 2) class table lua_newtable(L); - LuaxClass::RegisterLuaxClass(state); LuaxClass::RegisterLuaxFactoryClass(state); T::RegisterLuaxClass(state); // 检测T里面是否没有注册必须的方法 -#define _assertmethod(I, NAME) \ - GetField(I, NAME); \ - assert(IsType(-1, LUA_TFUNCTION)); \ - Pop(); + #define _assertmethod(I, NAME) \ + GetField(I, NAME); \ + assert(IsType(-1, LUA_TFUNCTION)); \ + Pop(); - // New方法可以没有,如果没有的话表示这是一个抽象类 - //_assertmethod(-1, "New"); + _assertmethod(-1, "New"); -#undef _assertmethod + #undef _assertmethod // .Extend() lua_pushvalue(state, -1); // class table - LuaxClass::PushInterfaceTable(state); // interface table + LuaxClass::PushLuaxInterfaceTable(state); // interface table lua_pushcclosure(state, LuaxClass::l_ExtendFactory, 2); lua_setfield(state, -2, "Extend"); // .GetInterfaceTable() - LuaxClass::PushInterfaceTable(state); // interface table + LuaxClass::PushLuaxInterfaceTable(state); // interface table lua_pushcclosure(state, LuaxClass::l_GetInterfaceTable, 1); lua_setfield(state, -2, "GetInterfaceTable"); - LuaxClass::SetClassTableRef(state, -1); + LuaxClass::SetLuaxClassTableRef(state, -1); + const char* type = T::GetLuaxFactoryName(); SetField(top, type); // reset top @@ -71,7 +66,9 @@ namespace Luax T::RegisterLuaxPostprocess(state); } - // 注册单例 + /// + /// Singleton只有一个class table,没有interface table。 + /// template void LuaxState::RegisterSingleton() { @@ -85,11 +82,18 @@ namespace Luax // class table. lua_newtable(L); - LuaxClass::RegisterLuaxClass(state); LuaxClass::RegisterLuaxFactoryClass(state); T::RegisterLuaxClass(state); + LuaxClass::SetLuaxClassTableRef(state, -1); + + // class table的__index和__newindex指向自身 + lua_pushvalue(state, -1); + lua_setfield(state, -2, "__index"); + lua_pushvalue(state, -1); + lua_setfield(state, -2, "__newindex"); + SetField(top, type); // reset top -- cgit v1.1-26-g67d0