From 6016ece202eef94ed76bd20d4f7879ccc71cc2e6 Mon Sep 17 00:00:00 2001 From: chai Date: Tue, 12 Mar 2019 23:08:31 +0800 Subject: *luax --- Source/3rdParty/Luax/luax_class.h | 95 ++++++++++++++++++++++++++------------- 1 file changed, 64 insertions(+), 31 deletions(-) (limited to 'Source/3rdParty/Luax/luax_class.h') diff --git a/Source/3rdParty/Luax/luax_class.h b/Source/3rdParty/Luax/luax_class.h index d241030..bde9990 100644 --- a/Source/3rdParty/Luax/luax_class.h +++ b/Source/3rdParty/Luax/luax_class.h @@ -6,6 +6,7 @@ #include "lua.hpp" #include "luax_config.h" #include "luax_state.h" +#include "luax_runtime.h" namespace Luax { @@ -46,55 +47,80 @@ namespace Luax void Retain(); void Release(); - //------------------------------------------------------------------------------------------------------------ - // 公共内容 + protected: - template - static void RegisterLuaxClass(LuaxState& state); + LuaxClass(); + virtual ~LuaxClass(); - template - LUAX_DECL_METHOD(l_GetClassName); + /// + /// 将userdata push到栈顶,如果没有初始化mUserdata,初始化设置好元表并把初始化好的userdata留在栈顶。 + /// + bool PushLuaUserdata(LuaxState& state); //------------------------------------------------------------------------------------------------------------ - // 工厂类相关 - template - static void RegisterLuaxFactoryClass(LuaxState& state); + /// + /// 对类的reftable的管理 + /// + void Ref(); - template - static void RegisterLuaxInterface(LuaxState& state); + private: - LUAX_DECL_METHOD(l_GC); + friend class LuaxState; - //------------------------------------------------------------------------------------------------------------ - // 单例类相关 + template static void RegisterLuaxClass(LuaxState& state); + template static void RegisterLuaxFactoryClass(LuaxState& state); + template static void RegisterLuaxInterface(LuaxState& state); + template static void RegisterLuaxSingletonClass(LuaxState& state); - template - static void RegisterLuaxSingletonClass(LuaxState& state); + /// + /// 屏蔽取地址运算符,如果需要地址,只能通过在堆上创建实例得到。在栈上和静态区的变量不能取地址。保证引用计数的准确。如 + /// 果需要穿引用,使用引用传递而不是传递地址。 + /// + void* operator &(); - protected: + /// + /// 绑定到state,如果本类是工厂 + /// + void BindFactoryToLua(LuaxState& state); - LuaxClass(); - ~LuaxClass(); + /// + /// 绑定到state,如果本类是单例 + /// + void BindSingletonToLua(LuaxState& state); + + //------------------------------------------------------------------------------------------------------------ + + LuaxStrongRef mInterfaceTable; // interface table + LuaxStrongRef mClassTable; // class table /// - /// 将userdata push到栈顶,如果没有初始化mUserdata,初始化设置好元表并把初始化好的userdata留在栈顶。 + /// 引用计数,用来处理线程间共享 /// - bool PushLuaUserdata(LuaxState& state); - - private: + int mRC; /// - /// 屏蔽取地址运算符,如果需要地址,只能通过在堆上创建实例得到。在栈上和静态区的变量不能取地址。保证引用计数的准确。如 - /// 果需要穿引用,使用引用传递而不是传递地址。 + /// 确保析构函数只能通过Release调用的safer,这样只要继承了LuaxClass的类,如果使用delete直接析构,就会报错 /// - void* operator &(); + bool mSafer; - void BindToLua(LuaxState& state); + public: - int mRefCount; + //------------------------------------------------------------------------------------------------------------ + // 公共内容 + + template LUAX_DECL_METHOD(l_GetClassName); + template LUAX_DECL_METHOD(l_GetClassName2); + + LUAX_DECL_METHOD(l_ToString); // __tostring + + //------------------------------------------------------------------------------------------------------------ + // 工厂类相关 - void* mUserdata; + LUAX_DECL_METHOD(l_GC); // __gc + + //------------------------------------------------------------------------------------------------------------ + // 单例类相关 }; @@ -102,8 +128,15 @@ namespace Luax /// 在成员方法里创建LuaxState并对参数进行检查。 /// #define LUAX_SETUP(L, params) \ - LuaxState state(L);\ - if(!state.CheckParams(1, params)) return 0; + LuaxRuntime& runtime = LuaxRuntime::Get(); \ + LuaxState& state = runtime[L].state; \ + if(!state.CheckParams(1, params)) return 0 + +#define LUAX_STATE(L) \ + LuaxState& state = LuaxRuntime::Get().GetLuaxState(L) + +#define LUAX_RUNTIME() \ + LuaxRuntime& runtime = LuaxRuntime::Get() #include "luax_class.inl" -- cgit v1.1-26-g67d0