diff options
Diffstat (limited to 'source/3rd-party/Luax/luax_class.inl')
-rw-r--r-- | source/3rd-party/Luax/luax_class.inl | 196 |
1 files changed, 122 insertions, 74 deletions
diff --git a/source/3rd-party/Luax/luax_class.inl b/source/3rd-party/Luax/luax_class.inl index 45e6552..95965ff 100644 --- a/source/3rd-party/Luax/luax_class.inl +++ b/source/3rd-party/Luax/luax_class.inl @@ -2,17 +2,16 @@ namespace Luax { //--------------------------------------------------------------------------------// - // ӿ /// /// ԲͬͣͨGetLuaClassName࣬GetClassNameᱻǣָluax_c_getupvalue /// - template<typename T> - int LuaxNativeClass<T>::l_GetClassName(lua_State* L) + template<class TYPE, class BASE> + int LuaxNativeClass<TYPE, BASE>::_GetClassName(lua_State* L) { LUAX_SETUP(L, "*"); - cc8* type = T::GetLuaxClassName(); + cc8* type = TYPE::GetLuaxClassName(); state.Push(type); return 1; } @@ -22,12 +21,12 @@ namespace Luax /// /// עṤ͵еԱ /// - template<typename T> - void LuaxNativeClass<T>::RegisterLuaxClass(LuaxState& state) + template<class TYPE, class BASE> + void LuaxNativeClass<TYPE, BASE>::RegisterLuaxClassShared(LuaxState& state) { luaL_Reg regTable[] = { - { "GetClass", l_GetClass }, - { "GetClassName", l_GetClassName }, + { "GetClass", _GetClass }, + { "GetClassName", _GetClassName }, { NULL, NULL } }; @@ -37,11 +36,11 @@ namespace Luax /// /// ijԱעclass table /// - template<typename T> - void LuaxNativeClass<T>::RegisterLuaxFactoryClass(LuaxState& state) + template<class TYPE, class BASE> + void LuaxNativeClass<TYPE, BASE>::RegisterLuaxFactoryClass(LuaxState& state) { luaL_Reg regTable[] = { - { "GetRefTable", l_GetRefTable }, + { "GetRefTable", _GetRefTable }, { NULL, NULL } }; @@ -51,8 +50,8 @@ namespace Luax /// /// ijԱעclass table /// - template<typename T> - void LuaxNativeClass<T>::RegisterLuaxSingletonClass(LuaxState& state) + template<class TYPE, class BASE> + void LuaxNativeClass<TYPE, BASE>::RegisterLuaxSingletonClass(LuaxState& state) { luaL_Reg regTable[] = { { NULL, NULL } @@ -61,33 +60,70 @@ namespace Luax state.RegisterMethods(regTable); } - template<typename T> - void LuaxNativeClass<T>::PushLuaxClassTable(LuaxState& state) + template<class TYPE, class BASE> + void LuaxNativeClass<TYPE, BASE>::PushLuaxClassTable(LuaxState& state) { assert(mClassTable); mClassTable.PushRef(state); } - template<typename T> - void LuaxNativeClass<T>::SetLuaxClassTableRef(LuaxState& state, int idx) + template<class TYPE, class BASE> + void LuaxNativeClass<TYPE, BASE>::SetLuaxClassTableRef(LuaxState& state, int idx) { mClassTable.SetRef(state, idx); } - template<typename T> - LuaxNativeClass<T>::LuaxNativeClass() + template<class TYPE, class BASE> + LuaxNativeClass<TYPE, BASE>::LuaxNativeClass() + : mWatchDog() +#if LUAX_PROFILER + , mSafer(false) +#endif + { + } + + template<class TYPE, class BASE> + LuaxNativeClass<TYPE, BASE>::~LuaxNativeClass() + { + } + +#if LUAX_PROFILER + template<class TYPE, class BASE> + void LuaxNativeClass<TYPE, BASE>::operator delete(void* pdead, size_t size) + { + if (pdead == nullptr) + return; + // ϴʵʹReleaseͷš + LuaxNativeClass* p = static_cast<LuaxNativeClass*>(pdead); + assert(p->mSafer); + ::operator delete(pdead, size); + } +#endif + + template<class TYPE, class BASE> + void LuaxNativeClass<TYPE, BASE>::Retain() { + ++mWatchDog.mNativeRef; } - template<typename T> - LuaxNativeClass<T>::~LuaxNativeClass() + template<class TYPE, class BASE> + void LuaxNativeClass<TYPE, BASE>::Release() { + if (mWatchDog.mNativeRef > 0) + --mWatchDog.mNativeRef; + if (mWatchDog) + { +#if LUAX_PROFILER + mSafer = true; +#endif + delete this; + } } - template<typename T> + template<class TYPE, class BASE> template<typename U> - void LuaxNativeClass<T>::LuaxRetain(LuaxState& state, U* userdata) + void LuaxNativeClass<TYPE, BASE>::LuaxRetain(LuaxState& state, U* userdata) { if (PushLuaxRefTable(state)) { @@ -103,9 +139,9 @@ namespace Luax } } - template<typename T> + template<class TYPE, class BASE> template<typename U> - void LuaxNativeClass<T>::LuaxRelease(LuaxState& state, U* userdata) + void LuaxNativeClass<TYPE, BASE>::LuaxRelease(LuaxState& state, U* userdata) { if (PushLuaxRefTable(state)) { @@ -139,10 +175,10 @@ namespace Luax } } - template<typename T> - bool LuaxNativeClass<T>::PushLuaxUserdata(LuaxState& state) + template<class TYPE, class BASE> + bool LuaxNativeClass<TYPE, BASE>::PushLuaxUserdata(LuaxState& state) { - assert(!T::IsLuaxClassSingleton()); + assert(!TYPE::IsLuaxClassSingleton()); if (!mUserdata) { BindToLua(state); @@ -151,8 +187,8 @@ namespace Luax return mUserdata.PushRef(state); } - template<typename T> - bool LuaxNativeClass<T>::PushLuaxMemberTable(LuaxState& state) + template<class TYPE, class BASE> + bool LuaxNativeClass<TYPE, BASE>::PushLuaxMemberTable(LuaxState& state) { int top = state.GetTop(); if (this->PushLuaxUserdata(state)) @@ -172,11 +208,11 @@ namespace Luax return false; } - template<typename T> - bool LuaxNativeClass<T>::PushLuaxRefTable(LuaxState& state) + template<class TYPE, class BASE> + bool LuaxNativeClass<TYPE, BASE>::PushLuaxRefTable(LuaxState& state) { // Singleton - if (T::IsLuaxClassSingleton()) + if (TYPE::IsLuaxClassSingleton()) { if (!this->mSingletonRefTable) { lua_newtable(state); @@ -209,19 +245,21 @@ namespace Luax /// member table luaʵijԱ /// class table б͵ʵеĺ /// - template<typename T> - void LuaxNativeClass<T>::BindToLua(LuaxState& state) + /// BindToLuaֻڵһעLuaʱá + /// + template<class TYPE, class BASE> + void LuaxNativeClass<TYPE, BASE>::BindToLua(LuaxState& state) { // ܰuserdata - assert(!T::IsLuaxClassSingleton()); + assert(!TYPE::IsLuaxClassSingleton()); assert(!mUserdata); /// - /// userdataջעַҪתΪT*ֱthisܻᵼ¶ؼ̳еɥʧ̬ + /// userdataջעַҪתΪTYPE*ֱthisܻᵼ¶ؼ̳еɥʧ̬ /// ֱӴthisȥڶؼ̳£òһͷ麯ġҪthis /// תΪĵ͵ַõһ麯ͨһʵֶ̬ /// - T* p = static_cast<T*>(this); + TYPE* p = static_cast<TYPE*>(this); state.PushPtrUserdata(p); lua_newtable(state); // ref tableluaʣC @@ -239,10 +277,10 @@ namespace Luax int refTable = top - 2; // ref table ע __tostring __gc - lua_pushcfunction(state, _Tostring); + lua_pushcfunction(state, __tostring); lua_setfield(state, refTable, "__tostring"); - lua_pushcfunction(state, _GC); + lua_pushcfunction(state, __gc); lua_setfield(state, refTable, "__gc"); // ref table __index __newindex Ϊ member table @@ -260,13 +298,19 @@ namespace Luax // һuserdataãͨPushLuaUserdatalua mUserdata.SetRef(state, -1); assert(mUserdata); + + // һãGCʱ-1 + ++mWatchDog.mVMRef; +#if LUAX_PROFILER + mRefVMs.insert(state.GetVM()); +#endif } /// /// Աù /// - template<typename T> - void LuaxNativeClass<T>::SetLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef, int idx) + template<class TYPE, class BASE> + void LuaxNativeClass<TYPE, BASE>::SetLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef, int idx) { ClearLuaxMemberRef(state, memRef); if (!lua_isnil(state, idx)) @@ -281,8 +325,8 @@ namespace Luax } } - template<typename T> - bool LuaxNativeClass<T>::PushLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef) + template<class TYPE, class BASE> + bool LuaxNativeClass<TYPE, BASE>::PushLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef) { if (memRef) { @@ -301,8 +345,8 @@ namespace Luax return false; } - template<typename T> - bool LuaxNativeClass<T>::PushLuaxMemberRef(LuaxState& state, int refID) + template<class TYPE, class BASE> + bool LuaxNativeClass<TYPE, BASE>::PushLuaxMemberRef(LuaxState& state, int refID) { if (PushLuaxRefTable(state)) { @@ -317,8 +361,8 @@ namespace Luax return false; } - template<typename T> - void LuaxNativeClass<T>::ClearLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef) + template<class TYPE, class BASE> + void LuaxNativeClass<TYPE, BASE>::ClearLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef) { if (memRef) { @@ -336,16 +380,20 @@ namespace Luax /// /// ͷŹʵ /// - template<typename T> - int LuaxNativeClass<T>::_GC(lua_State* L) + template<class TYPE, class BASE> + int LuaxNativeClass<TYPE, BASE>::__gc(lua_State* L) { + LUAX_STATE(L); + TYPE* self = state.GetUserdata<TYPE>(1); + assert(self); + #if LUAX_PROFILER - std::cout << "Luax: GC<" << T::GetLuaxClassName() << ">\n"; + std::cout << "Luax: GC<" << TYPE::GetLuaxClassName() << ">\n"; #endif - LUAX_SETUP(L, "U"); - T* self = state.GetUserdata<T>(1); - delete self; + --self->mWatchDog.mVMRef; + self->LuaxNativeClass<TYPE, BASE>::Release(); + return 0; } @@ -353,14 +401,14 @@ namespace Luax /// ʽ: /// ַ /// - template<typename T> - int LuaxNativeClass<T>::_Tostring(lua_State* L) + template<class TYPE, class BASE> + int LuaxNativeClass<TYPE, BASE>::__tostring(lua_State* L) { // params: // 1: userdata LUAX_STATE(L); - T* self = state.GetUserdata<T>(1); + TYPE* self = state.GetUserdata<TYPE>(1); if (self) { cc8* classname = ""; @@ -373,7 +421,7 @@ namespace Luax } else { - classname = T::GetLuaxClassName(); + classname = TYPE::GetLuaxClassName(); } lua_pushfstring(L, "%s: %p", classname, self); return 1; @@ -386,8 +434,8 @@ namespace Luax /// ࣬luaijԱΪƣDZ֤userdataͳһNative classṩ__init֧֣ /// nativeʵ崴ʹ__initгʼӵкͻһNewбnativeһ͡ /// - template<typename T> - int LuaxNativeClass<T>::l_ExtendFactory(lua_State* L) + template<class TYPE, class BASE> + int LuaxNativeClass<TYPE, BASE>::_ExtendFactory(lua_State* L) { // upvalues: // 1: base class @@ -414,13 +462,13 @@ namespace Luax // .Extend() lua_pushvalue(L, inheritClass); - lua_pushcclosure(L, l_ExtendFactory, 1); + lua_pushcclosure(L, _ExtendFactory, 1); lua_setfield(L, -2, "Extend"); // .New() lua_pushvalue(L, inheritClass); lua_getfield(L, baseClass, "New"); - lua_pushcclosure(L, l_New, 2); + lua_pushcclosure(L, _New, 2); lua_setfield(L, -2, "New"); // __base = baseClass @@ -438,8 +486,8 @@ namespace Luax return 1; } - template<typename T> - int LuaxNativeClass<T>::l_ExtendSingleton(lua_State* L) + template<class TYPE, class BASE> + int LuaxNativeClass<TYPE, BASE>::_ExtendSingleton(lua_State* L) { // upvalues: // 1: base class @@ -466,7 +514,7 @@ namespace Luax // .Extend() lua_pushvalue(L, inheritClass); - lua_pushcclosure(L, l_ExtendFactory, 1); + lua_pushcclosure(L, _ExtendFactory, 1); lua_setfield(L, -2, "Extend"); // __base = baseClass @@ -485,8 +533,8 @@ namespace Luax } #endif /*LUAX_ENABLE_NATIVE_EXTEND*/ - template<typename T> - int LuaxNativeClass<T>::l_GetClass(lua_State* L) + template<class TYPE, class BASE> + int LuaxNativeClass<TYPE, BASE>::_GetClass(lua_State* L) { LUAX_STATE(L); if (!mClassTable) @@ -496,19 +544,19 @@ namespace Luax return 1; } - template<typename T> - int LuaxNativeClass<T>::l_GetRefTable(lua_State* L) + template<class TYPE, class BASE> + int LuaxNativeClass<TYPE, BASE>::_GetRefTable(lua_State* L) { LUAX_STATE(L); - T* self = state.GetUserdata<T>(1); + TYPE* self = state.GetUserdata<TYPE>(1); bool success = self->PushLuaxRefTable(state); if (!success) lua_pushnil(L); return 1; } - template<typename T> - int LuaxNativeClass<T>::l_New(lua_State* L) + template<class TYPE, class BASE> + int LuaxNativeClass<TYPE, BASE>::_New(lua_State* L) { LUAX_STATE(L); @@ -580,7 +628,7 @@ namespace Luax return 0; } - template<typename T> LuaxStrongRef LuaxNativeClass<T>::mClassTable; // class table - template<typename T> LuaxStrongRef LuaxNativeClass<T>::mSingletonRefTable; // + template<class TYPE, class BASE> LuaxStrongRef LuaxNativeClass<TYPE, BASE>::mClassTable; // class table + template<class TYPE, class BASE> LuaxStrongRef LuaxNativeClass<TYPE, BASE>::mSingletonRefTable; // }
\ No newline at end of file |