diff options
Diffstat (limited to 'source/3rd-party/Luax')
-rw-r--r-- | source/3rd-party/Luax/luax_class.hpp | 42 | ||||
-rw-r--r-- | source/3rd-party/Luax/luax_class.inl | 9 | ||||
-rw-r--r-- | source/3rd-party/Luax/luax_watchdog.cpp (renamed from source/3rd-party/Luax/luax_dog.cpp) | 0 | ||||
-rw-r--r-- | source/3rd-party/Luax/luax_watchdog.h (renamed from source/3rd-party/Luax/luax_dog.h) | 4 |
4 files changed, 29 insertions, 26 deletions
diff --git a/source/3rd-party/Luax/luax_class.hpp b/source/3rd-party/Luax/luax_class.hpp index c41adbd..e6e0696 100644 --- a/source/3rd-party/Luax/luax_class.hpp +++ b/source/3rd-party/Luax/luax_class.hpp @@ -12,7 +12,7 @@ #include "luax_ref.h" #include "luax_memberref.h" #include "luax_cfunctions.h" -#include "luax_dog.h" +#include "luax_watchdog.h" namespace Luax { @@ -24,8 +24,9 @@ namespace Luax /// LuaxGetFactoryName ùͬʱעʱעΪsingletonͨ /// ʱ /// -#define LUAX_DECL_FACTORY(type) \ +#define LUAX_DECL_FACTORY(type, ...) \ friend class Luax::LuaxState; \ + friend class Luax::LuaxNativeClass<type,##__VA_ARGS__>; \ static void RegisterLuaxClass(Luax::LuaxState&); \ static void RegisterLuaxPostprocess(Luax::LuaxState&); \ static const char* GetLuaxFactoryName() { return #type; };\ @@ -44,8 +45,9 @@ namespace Luax /// RegisterLuaxClass עķͳԱö١ȵclass table /// LuaxGetSingletonName õ /// -#define LUAX_DECL_SINGLETON(type) \ +#define LUAX_DECL_SINGLETON(type, ...) \ friend class Luax::LuaxState; \ + friend class Luax::LuaxNativeClass<type,##__VA_ARGS__>; \ static void RegisterLuaxClass(Luax::LuaxState&); \ static void RegisterLuaxPostprocess(Luax::LuaxState&); \ static const char* GetLuaxSingletonName() { return #type; }; \ @@ -114,13 +116,14 @@ namespace Luax virtual bool PushLuaxRefTable(LuaxState& state) = 0; /// - /// LuaxNativeClassʵ֡ + /// LuaxNativeClassʵֺ֡ͷnativeԴ /// virtual void Retain() = 0; virtual void Release() = 0; }; + // TODO: ȡҪظɴ //class LuaxNativeClassBase //{ //} @@ -139,12 +142,12 @@ namespace Luax /// Ƚmember refʵᱻαͬʵõƵЩʵ壬 /// luaƵĵgc⡣ /// - template<class USERDATA> void LuaxRetain(LuaxState& state, USERDATA* userdata); + template<class DATATYPE> void LuaxRetain(LuaxState& state, DATATYPE* userdata); /// /// userdataһref tableԳԻuserdata /// - template<class USERDATA> void LuaxRelease(LuaxState& state, USERDATA* userdata); + template<class DATATYPE> void LuaxRelease(LuaxState& state, DATATYPE* userdata); /// /// userdata pushջûгʼmUserdataʼúԪѳʼõ @@ -162,8 +165,8 @@ namespace Luax /// /// nativeӿڡ /// - void Retain() override; - void Release() override; + void Retain() override final; + void Release() override final; #if LUAX_PROFILER // Զϴʵdeleteռ @@ -201,21 +204,18 @@ namespace Luax //------------------------------------------------------------------------------// // - LUAX_DECL_METHOD(__tostring); - LUAX_DECL_METHOD(_GetClass); - LUAX_DECL_METHOD(_GetClassName); - + static int __tostring (lua_State*); + static int _GetClass (lua_State*); + static int _GetClassName (lua_State*); + // - LUAX_DECL_METHOD(__gc); -#if LUAX_ENABLE_NATIVE_EXTEND - LUAX_DECL_METHOD(_ExtendFactory); -#endif - LUAX_DECL_METHOD(_GetRefTable); - LUAX_DECL_METHOD(_New); + static int __gc (lua_State*); + static int _GetRefTable (lua_State*); + static int _New (lua_State*); - // #if LUAX_ENABLE_NATIVE_EXTEND - LUAX_DECL_METHOD(_ExtendSingleton); + static int _ExtendFactory (lua_State*); + static int _ExtendSingleton (lua_State*); #endif //--------------------------------------------------------------------------------// @@ -244,7 +244,7 @@ namespace Luax /// /// ͨɾ /// - LuaxDog mWatchDog; + LuaxWatchDog mWatchDog; #if LUAX_PROFILER // йܴ˶ diff --git a/source/3rd-party/Luax/luax_class.inl b/source/3rd-party/Luax/luax_class.inl index 95965ff..1d6a89f 100644 --- a/source/3rd-party/Luax/luax_class.inl +++ b/source/3rd-party/Luax/luax_class.inl @@ -95,7 +95,7 @@ namespace Luax if (pdead == nullptr) return; // ϴʵʹReleaseͷš - LuaxNativeClass* p = static_cast<LuaxNativeClass*>(pdead); + TYPE* p = static_cast<TYPE*>(pdead); assert(p->mSafer); ::operator delete(pdead, size); } @@ -384,6 +384,7 @@ namespace Luax int LuaxNativeClass<TYPE, BASE>::__gc(lua_State* L) { LUAX_STATE(L); + TYPE* self = state.GetUserdata<TYPE>(1); assert(self); @@ -391,8 +392,10 @@ namespace Luax std::cout << "Luax: GC<" << TYPE::GetLuaxClassName() << ">\n"; #endif - --self->mWatchDog.mVMRef; - self->LuaxNativeClass<TYPE, BASE>::Release(); + if(self->mWatchDog.mVMRef > 0) + --self->mWatchDog.mVMRef; + + self->Release(); return 0; } diff --git a/source/3rd-party/Luax/luax_dog.cpp b/source/3rd-party/Luax/luax_watchdog.cpp index e69de29..e69de29 100644 --- a/source/3rd-party/Luax/luax_dog.cpp +++ b/source/3rd-party/Luax/luax_watchdog.cpp diff --git a/source/3rd-party/Luax/luax_dog.h b/source/3rd-party/Luax/luax_watchdog.h index f6d95d5..b07b007 100644 --- a/source/3rd-party/Luax/luax_dog.h +++ b/source/3rd-party/Luax/luax_watchdog.h @@ -9,10 +9,10 @@ namespace Luax /// /// LuaxNativeClassʵüwatch dogֻwatch dogͨʱſdelete /// - class LuaxDog + class LuaxWatchDog { public: - LuaxDog() + LuaxWatchDog() : mVMRef(0) , mNativeRef(0) { |