diff options
Diffstat (limited to 'source/3rd-party/Luax/luax_class.hpp')
-rw-r--r-- | source/3rd-party/Luax/luax_class.hpp | 168 |
1 files changed, 105 insertions, 63 deletions
diff --git a/source/3rd-party/Luax/luax_class.hpp b/source/3rd-party/Luax/luax_class.hpp index ba8d16a..c41adbd 100644 --- a/source/3rd-party/Luax/luax_class.hpp +++ b/source/3rd-party/Luax/luax_class.hpp @@ -1,27 +1,36 @@ #ifndef __LUAX_CLASS_H__ #define __LUAX_CLASS_H__ +#include "luax_config.h" + +#if LUAX_PROFILER +#include <unordered_set> +#endif + #include <vector> -#include "luax_config.h" #include "luax_ref.h" #include "luax_memberref.h" #include "luax_cfunctions.h" +#include "luax_dog.h" namespace Luax { + class LuaxVM; + /// /// RegisterLuaxClass עķͳԱö١ȵclass table /// LuaxGetFactoryName ùͬʱעʱעΪsingletonͨ /// ʱ /// #define LUAX_DECL_FACTORY(type) \ - static void RegisterLuaxClass(Luax::LuaxState&);\ - static void RegisterLuaxPostprocess(Luax::LuaxState&); \ + friend class Luax::LuaxState; \ + static void RegisterLuaxClass(Luax::LuaxState&); \ + static void RegisterLuaxPostprocess(Luax::LuaxState&); \ static const char* GetLuaxFactoryName() { return #type; };\ static const char* GetLuaxClassName() { return #type; };\ - static bool IsLuaxClassSingleton() { return false; } + static bool IsLuaxClassSingleton() { return false; } /// /// Ϊijʹô˺꣬עһڣעắеãעЩ @@ -30,21 +39,22 @@ namespace Luax #define LUAX_DECL_ABSTRACT_FACTORY() \ static void RegisterLuaxClass(Luax::LuaxState&);\ static void RegisterLuaxPostprocess(Luax::LuaxState&) - + /// /// RegisterLuaxClass עķͳԱö١ȵclass table /// LuaxGetSingletonName õ /// #define LUAX_DECL_SINGLETON(type) \ - static void RegisterLuaxClass(Luax::LuaxState&); \ - static void RegisterLuaxPostprocess(Luax::LuaxState&); \ + friend class Luax::LuaxState; \ + static void RegisterLuaxClass(Luax::LuaxState&); \ + static void RegisterLuaxPostprocess(Luax::LuaxState&); \ static const char* GetLuaxSingletonName() { return #type; }; \ static const char* GetLuaxClassName() { return #type; }; \ - static bool IsLuaxClassSingleton() { return true; } - + static bool IsLuaxClassSingleton() { return true; } + #define LUAX_DECL_METHOD(mtd) static int mtd(lua_State* L) -#define LUAX_DECL_ENUM(e, under_line_index) static void _luax_decl_enum_##e() +#define LUAX_DECL_ENUM(e, under_line_index) static void _luax_dec_enum_##e() /// /// ʵֵĺꡣһL @@ -58,10 +68,10 @@ namespace Luax #define LUAX_POSTPROCESS(type) void type::RegisterLuaxPostprocess(Luax::LuaxState& state) /// - /// עĺꡣ + /// עĺꡣ֮ǰÿɱ꣬ûluaclastable refûעԡ /// -#define LUAX_REGISTER_FACTORY(state, type) state.RegisterFactory<type>() -#define LUAX_REGISTER_SINGLETON(state, type) state.RegisterSingleton<type>() +#define LUAX_REGISTER_FACTORY(state, param) state.RegisterFactory<param>() +#define LUAX_REGISTER_SINGLETON(state, param) state.RegisterSingleton<param>() #define LUAX_REGISTER_ABSTRACT_FACTORY(state, type) type::RegisterLuaxPostprocess(state) #define LUAX_REGISTER_METHODS(state, ...) \ do{ \ @@ -89,56 +99,82 @@ namespace Luax /// ݳԱݳԱʼɵһЩ⡣һ㣬vpbӽӽC#Java /// InterfaceԣIͷʶһӿڡ /// - class ILuaxNativeAccessor + class LuaxObject { public: + LuaxObject() {}; + virtual ~LuaxObject() {}; /// - /// Աùʵref tableáȡ + /// Աùʵref tableáȡ /// - virtual bool PushLuaxMemberRef(LuaxState& state, int refID) { assert(false); return false; }; + virtual bool PushLuaxMemberRef(LuaxState& state, int refID) = 0; + virtual bool PushLuaxUserdata(LuaxState& state) = 0; + virtual bool PushLuaxMemberTable(LuaxState& state) = 0; + virtual bool PushLuaxRefTable(LuaxState& state) = 0; - virtual bool PushLuaxUserdata(LuaxState& state) { assert(false); return false; }; - virtual bool PushLuaxMemberTable(LuaxState& state) { assert(false); return false; }; - virtual bool PushLuaxRefTable(LuaxState& state) { assert(false); return false; }; + /// + /// LuaxNativeClassʵ֡ + /// + virtual void Retain() = 0; + virtual void Release() = 0; }; + //class LuaxNativeClassBase + //{ + //} + /// /// Ҫ¶luanative classҪ̳дࡣͨluaʵҪȷüȷԣ /// ߳Ҫȷͷš /// - template<class T> - class LuaxNativeClass : virtual public ILuaxNativeAccessor + template<class TYPE, class BASE = LuaxObject> + class LuaxNativeClass : public BASE { public: - static bool IsTypeOf(ILuaxNativeAccessor); - /// /// userdataΪkeyref tableuserdataһãάuserdataڡ /// Ƚmember refʵᱻαͬʵõƵЩʵ壬 - ///luaƵĵgc⡣ + /// luaƵĵgc⡣ /// - template<class U> void LuaxRetain(LuaxState& state, U* userdata); + template<class USERDATA> void LuaxRetain(LuaxState& state, USERDATA* userdata); /// /// userdataһref tableԳԻuserdata /// - template<class U> void LuaxRelease(LuaxState& state, U* userdata); - - bool PushLuaxMemberRef(LuaxState& state, int refID) override; + template<class USERDATA> void LuaxRelease(LuaxState& state, USERDATA* userdata); /// /// userdata pushջûгʼmUserdataʼúԪѳʼõ /// userdataջһáһnativeȨƽluaƵķ /// - bool PushLuaxUserdata(LuaxState& state); - bool PushLuaxMemberTable(LuaxState& state); - bool PushLuaxRefTable(LuaxState& state); + bool PushLuaxMemberRef(LuaxState& state, int refID) override; + bool PushLuaxUserdata(LuaxState& state) override; + bool PushLuaxMemberTable(LuaxState& state) override; + bool PushLuaxRefTable(LuaxState& state) override; + + /// + /// Watch dog һnativeáluaVMòṩⲿӿڡ̳дֱʹ + /// deleteӦʹReleaseͷšһ__gcУû + /// nativeиͷţҪʹRelease + /// + /// nativeӿڡ + /// + void Retain() override; + void Release() override; + +#if LUAX_PROFILER + // Զϴʵdeleteռ + static void operator delete(void* pdead, size_t size); +#endif protected: + LuaxNativeClass(); + virtual ~LuaxNativeClass(); + /// /// Աùʵref tableáȡ /// @@ -146,36 +182,49 @@ namespace Luax bool PushLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef); void ClearLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef); - LuaxNativeClass(); - virtual ~LuaxNativeClass(); - private: friend class LuaxState; - static void RegisterLuaxClass(LuaxState& state); + static void RegisterLuaxClassShared(LuaxState& state); static void RegisterLuaxFactoryClass(LuaxState& state); static void RegisterLuaxSingletonClass(LuaxState& state); static void SetLuaxClassTableRef(LuaxState& state, int idx); - static void PushLuaxClassTable(LuaxState& state); - - /// - /// ȡַҪַֻͨڶϴʵõջϺ;̬ı - /// ȡַ֤üȷҪãʹôݶǴݵַ - /// - //void* operator &(); /// /// userdataʵstate /// void BindToLua(LuaxState& state); + //------------------------------------------------------------------------------// + + // + LUAX_DECL_METHOD(__tostring); + LUAX_DECL_METHOD(_GetClass); + LUAX_DECL_METHOD(_GetClassName); + + // + LUAX_DECL_METHOD(__gc); +#if LUAX_ENABLE_NATIVE_EXTEND + LUAX_DECL_METHOD(_ExtendFactory); +#endif + LUAX_DECL_METHOD(_GetRefTable); + LUAX_DECL_METHOD(_New); + + // +#if LUAX_ENABLE_NATIVE_EXTEND + LUAX_DECL_METHOD(_ExtendSingleton); +#endif + + //--------------------------------------------------------------------------------// + /// /// class table͵С /// static LuaxStrongRef mClassTable; + /// /// ǵsingletonùϵԱ֤ᱻͨref table /// ijԱȫڵģֱ_LUAX_STRONGREF_TABLEuserdata @@ -183,7 +232,7 @@ namespace Luax /// ģtable_LUAX_STRONGREF_TABLE /// static LuaxStrongRef mSingletonRefTable; - + /// /// ͨuserdataõ: /// 1: ref table @@ -192,27 +241,20 @@ namespace Luax /// LuaxWeakRef mUserdata; - // - LUAX_DECL_METHOD( _Tostring ); - LUAX_DECL_METHOD( l_GetClass ); - LUAX_DECL_METHOD( l_GetClassName ); + /// + /// ͨɾ + /// + LuaxDog mWatchDog; - // - LUAX_DECL_METHOD( _GC ); -#if LUAX_ENABLE_NATIVE_EXTEND - LUAX_DECL_METHOD( l_ExtendFactory ); +#if LUAX_PROFILER + // йܴ˶ + std::unordered_set<LuaxVM*> mRefVMs; + // գⲿʹdeleteֱɾӦʹRelease + bool mSafer; #endif - LUAX_DECL_METHOD( l_GetRefTable ); - LUAX_DECL_METHOD( l_New ); - // -#if LUAX_ENABLE_NATIVE_EXTEND - LUAX_DECL_METHOD( l_ExtendSingleton ); -#endif }; - //--------------------------------------------------------------------------------// - #if LUAX_ENABLE_PLAIN_CLASS /// /// lua @@ -226,10 +268,10 @@ namespace Luax /// static int registry(lua_State* L); - LUAX_DECL_METHOD( _Tostring ); - LUAX_DECL_METHOD( l_Extend ); - LUAX_DECL_METHOD( l_New ); - LUAX_DECL_METHOD( l_TypeOf ); + LUAX_DECL_METHOD(__tostring); + LUAX_DECL_METHOD(_Extend); + LUAX_DECL_METHOD(_New); + LUAX_DECL_METHOD(_TypeOf); }; #endif |