From 03b3b8ae80559745f98ef94569b421adddeb441f Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 25 Mar 2019 23:46:59 +0800 Subject: *misc --- source/3rd-party/Luax/luax_class.hpp | 65 ++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 22 deletions(-) (limited to 'source/3rd-party/Luax/luax_class.hpp') diff --git a/source/3rd-party/Luax/luax_class.hpp b/source/3rd-party/Luax/luax_class.hpp index 539ff1a..3d7ede6 100644 --- a/source/3rd-party/Luax/luax_class.hpp +++ b/source/3rd-party/Luax/luax_class.hpp @@ -62,28 +62,47 @@ namespace Luax state.RegisterEnum(name, __e); \ }while(0) +#define LUAX_PREPARE(L, T) \ + LUAX_STATE(L); \ + T* self = state.GetUserdata(1); + + /// + /// 虚基类,为了实现多态。需要访问下面这些接口的外部基类需要虚继承此类,之后再派生链中就会调用对应实体的方法。注意继承此 + /// 类时不能实现下面的方法,实现在LuaxNativeClass中,实现会导致二义性。 + /// + class ILuaxNativeAccessor + { + public: + + /// + /// 成员引用管理,在实例的ref table里。设置、取、清除 + /// + virtual bool PushLuaxMemberRef(LuaxState& state, int refID) { assert(false); return false; }; + + }; + /// /// 需要暴露给lua的native class需要继承此类。通过lua管理的实例要确保引用计数的正确性,在多个线程中需要确定不会误释放。 /// template - class LuaxNativeClass + class LuaxNativeClass : public virtual ILuaxNativeAccessor { public: + static bool IsTypeOf(ILuaxNativeAccessor); + /// - /// 将userdata作为key,在ref table里对userdata添加一个引用,以维持userdata的生命周期。 + /// 将userdata作为key,在ref table里对userdata添加一个引用,以维持userdata的生命周期。相比较member ref,这个用在 + /// 实体会被多次被不同其他实体引用的情况,并频繁销毁这些实体,避免lua频繁的调用gc检测。 /// - template void LuaRetain(LuaxState& state, U* userdata); + template void LuaxRetain(LuaxState& state, U* userdata); /// /// 对userdata减少一个引用在ref table里,以尝试回收userdata。 /// - template void LuaRelease(LuaxState& state, U* userdata); + template void LuaxRelease(LuaxState& state, U* userdata); - protected: - - LuaxNativeClass(); - virtual ~LuaxNativeClass(); + bool PushLuaxMemberRef(LuaxState& state, int refID) override; /// /// 将userdata push到栈顶,如果没有初始化mUserdata,初始化设置好元表并把初始化好的userdata留在栈顶。并添加一个引用。 @@ -92,12 +111,17 @@ namespace Luax bool PushLuaxMemberTable(LuaxState& state); bool PushLuaxRefTable(LuaxState& state); + protected: + /// /// 成员引用管理,在实例的ref table里。设置、取、清除 /// - void SetMemberRef(LuaxState& state, LuaxMemberRef& memRef, int idx); - bool PushMemberRef(LuaxState& state, LuaxMemberRef& memRef); - void ClearMemberRef(LuaxState& state, LuaxMemberRef& memRef); + void SetLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef, int idx); + bool PushLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef); + void ClearLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef); + + LuaxNativeClass(); + virtual ~LuaxNativeClass(); private: @@ -122,14 +146,16 @@ namespace Luax /// void BindToLua(LuaxState& state); - //------------------------------------------------------------------------------------------------------------ - /// - /// 所有LuaxNativeClass类型的实例共享的内容 + /// class table,工厂和单例都有。 + /// + static LuaxStrongRef mClassTable; /// - static LuaxStrongRef mClassTable; // class table,工厂和单例都有 - static LuaxStrongRef mSingletonRefTable; // 如果类是单例,这个用来保存singleton的成员,以保证不会被回收类似普通类的 - // ref table。单例的成员是全生命周期的,所以直接在_LUAX_STRONGREF_TABLE + /// 如果类是单例,这个用来保存singleton的引用关系,以保证不会被回收类似普通类的ref table。单例的成员是全生命周期的, + /// 所以直接在_LUAX_STRONGREF_TABLE。单例对userdata进行LuaxRetain\LuaxRelease和member ref操作时和工厂实例不同, + /// 是存在下面这个ref table里的,这个table在_LUAX_STRONGREF_TABLE里。 + /// + static LuaxStrongRef mSingletonRefTable; /// /// 通过userdata可以拿到: @@ -141,16 +167,12 @@ namespace Luax public: - //------------------------------------------------------------------------------------------------------------ // 公共内容 - LUAX_DECL_METHOD( l___tostring ); LUAX_DECL_METHOD( l_GetClass ); LUAX_DECL_METHOD( l_GetClassName ); - //------------------------------------------------------------------------------------------------------------ // 工厂类相关 - LUAX_DECL_METHOD( l___gc ); #if LUAX_ENABLE_NATIVE_EXTEND LUAX_DECL_METHOD( l_ExtendFactory ); @@ -158,7 +180,6 @@ namespace Luax LUAX_DECL_METHOD( l_GetRefTable ); LUAX_DECL_METHOD( l_New ); - //------------------------------------------------------------------------------------------------------------ // 单例类相关 #if LUAX_ENABLE_NATIVE_EXTEND LUAX_DECL_METHOD( l_ExtendSingleton ); -- cgit v1.1-26-g67d0