summaryrefslogtreecommitdiff
path: root/source/3rd-party/Luax/luax_class.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/3rd-party/Luax/luax_class.hpp')
-rw-r--r--source/3rd-party/Luax/luax_class.hpp168
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