summaryrefslogtreecommitdiff
path: root/source/3rd-party/Luax/luax_class.inl
diff options
context:
space:
mode:
Diffstat (limited to 'source/3rd-party/Luax/luax_class.inl')
-rw-r--r--source/3rd-party/Luax/luax_class.inl196
1 files changed, 122 insertions, 74 deletions
diff --git a/source/3rd-party/Luax/luax_class.inl b/source/3rd-party/Luax/luax_class.inl
index 45e6552..95965ff 100644
--- a/source/3rd-party/Luax/luax_class.inl
+++ b/source/3rd-party/Luax/luax_class.inl
@@ -2,17 +2,16 @@ namespace Luax
{
//--------------------------------------------------------------------------------//
- // ӿ
///
/// ԲͬͣͨGetLuaClassName࣬GetClassNameᱻǣָluax_c_getupvalue
///
- template<typename T>
- int LuaxNativeClass<T>::l_GetClassName(lua_State* L)
+ template<class TYPE, class BASE>
+ int LuaxNativeClass<TYPE, BASE>::_GetClassName(lua_State* L)
{
LUAX_SETUP(L, "*");
- cc8* type = T::GetLuaxClassName();
+ cc8* type = TYPE::GetLuaxClassName();
state.Push(type);
return 1;
}
@@ -22,12 +21,12 @@ namespace Luax
///
/// עṤ͵еԱ
///
- template<typename T>
- void LuaxNativeClass<T>::RegisterLuaxClass(LuaxState& state)
+ template<class TYPE, class BASE>
+ void LuaxNativeClass<TYPE, BASE>::RegisterLuaxClassShared(LuaxState& state)
{
luaL_Reg regTable[] = {
- { "GetClass", l_GetClass },
- { "GetClassName", l_GetClassName },
+ { "GetClass", _GetClass },
+ { "GetClassName", _GetClassName },
{ NULL, NULL }
};
@@ -37,11 +36,11 @@ namespace Luax
///
/// ijԱעclass table
///
- template<typename T>
- void LuaxNativeClass<T>::RegisterLuaxFactoryClass(LuaxState& state)
+ template<class TYPE, class BASE>
+ void LuaxNativeClass<TYPE, BASE>::RegisterLuaxFactoryClass(LuaxState& state)
{
luaL_Reg regTable[] = {
- { "GetRefTable", l_GetRefTable },
+ { "GetRefTable", _GetRefTable },
{ NULL, NULL }
};
@@ -51,8 +50,8 @@ namespace Luax
///
/// ijԱעclass table
///
- template<typename T>
- void LuaxNativeClass<T>::RegisterLuaxSingletonClass(LuaxState& state)
+ template<class TYPE, class BASE>
+ void LuaxNativeClass<TYPE, BASE>::RegisterLuaxSingletonClass(LuaxState& state)
{
luaL_Reg regTable[] = {
{ NULL, NULL }
@@ -61,33 +60,70 @@ namespace Luax
state.RegisterMethods(regTable);
}
- template<typename T>
- void LuaxNativeClass<T>::PushLuaxClassTable(LuaxState& state)
+ template<class TYPE, class BASE>
+ void LuaxNativeClass<TYPE, BASE>::PushLuaxClassTable(LuaxState& state)
{
assert(mClassTable);
mClassTable.PushRef(state);
}
- template<typename T>
- void LuaxNativeClass<T>::SetLuaxClassTableRef(LuaxState& state, int idx)
+ template<class TYPE, class BASE>
+ void LuaxNativeClass<TYPE, BASE>::SetLuaxClassTableRef(LuaxState& state, int idx)
{
mClassTable.SetRef(state, idx);
}
- template<typename T>
- LuaxNativeClass<T>::LuaxNativeClass()
+ template<class TYPE, class BASE>
+ LuaxNativeClass<TYPE, BASE>::LuaxNativeClass()
+ : mWatchDog()
+#if LUAX_PROFILER
+ , mSafer(false)
+#endif
+ {
+ }
+
+ template<class TYPE, class BASE>
+ LuaxNativeClass<TYPE, BASE>::~LuaxNativeClass()
+ {
+ }
+
+#if LUAX_PROFILER
+ template<class TYPE, class BASE>
+ void LuaxNativeClass<TYPE, BASE>::operator delete(void* pdead, size_t size)
+ {
+ if (pdead == nullptr)
+ return;
+ // ϴʵʹReleaseͷš
+ LuaxNativeClass* p = static_cast<LuaxNativeClass*>(pdead);
+ assert(p->mSafer);
+ ::operator delete(pdead, size);
+ }
+#endif
+
+ template<class TYPE, class BASE>
+ void LuaxNativeClass<TYPE, BASE>::Retain()
{
+ ++mWatchDog.mNativeRef;
}
- template<typename T>
- LuaxNativeClass<T>::~LuaxNativeClass()
+ template<class TYPE, class BASE>
+ void LuaxNativeClass<TYPE, BASE>::Release()
{
+ if (mWatchDog.mNativeRef > 0)
+ --mWatchDog.mNativeRef;
+ if (mWatchDog)
+ {
+#if LUAX_PROFILER
+ mSafer = true;
+#endif
+ delete this;
+ }
}
- template<typename T>
+ template<class TYPE, class BASE>
template<typename U>
- void LuaxNativeClass<T>::LuaxRetain(LuaxState& state, U* userdata)
+ void LuaxNativeClass<TYPE, BASE>::LuaxRetain(LuaxState& state, U* userdata)
{
if (PushLuaxRefTable(state))
{
@@ -103,9 +139,9 @@ namespace Luax
}
}
- template<typename T>
+ template<class TYPE, class BASE>
template<typename U>
- void LuaxNativeClass<T>::LuaxRelease(LuaxState& state, U* userdata)
+ void LuaxNativeClass<TYPE, BASE>::LuaxRelease(LuaxState& state, U* userdata)
{
if (PushLuaxRefTable(state))
{
@@ -139,10 +175,10 @@ namespace Luax
}
}
- template<typename T>
- bool LuaxNativeClass<T>::PushLuaxUserdata(LuaxState& state)
+ template<class TYPE, class BASE>
+ bool LuaxNativeClass<TYPE, BASE>::PushLuaxUserdata(LuaxState& state)
{
- assert(!T::IsLuaxClassSingleton());
+ assert(!TYPE::IsLuaxClassSingleton());
if (!mUserdata)
{
BindToLua(state);
@@ -151,8 +187,8 @@ namespace Luax
return mUserdata.PushRef(state);
}
- template<typename T>
- bool LuaxNativeClass<T>::PushLuaxMemberTable(LuaxState& state)
+ template<class TYPE, class BASE>
+ bool LuaxNativeClass<TYPE, BASE>::PushLuaxMemberTable(LuaxState& state)
{
int top = state.GetTop();
if (this->PushLuaxUserdata(state))
@@ -172,11 +208,11 @@ namespace Luax
return false;
}
- template<typename T>
- bool LuaxNativeClass<T>::PushLuaxRefTable(LuaxState& state)
+ template<class TYPE, class BASE>
+ bool LuaxNativeClass<TYPE, BASE>::PushLuaxRefTable(LuaxState& state)
{
// Singleton
- if (T::IsLuaxClassSingleton())
+ if (TYPE::IsLuaxClassSingleton())
{
if (!this->mSingletonRefTable) {
lua_newtable(state);
@@ -209,19 +245,21 @@ namespace Luax
/// member table luaʵijԱ
/// class table б͵ʵеĺ
///
- template<typename T>
- void LuaxNativeClass<T>::BindToLua(LuaxState& state)
+ /// BindToLuaֻڵһעLuaʱá
+ ///
+ template<class TYPE, class BASE>
+ void LuaxNativeClass<TYPE, BASE>::BindToLua(LuaxState& state)
{
// ܰuserdata
- assert(!T::IsLuaxClassSingleton());
+ assert(!TYPE::IsLuaxClassSingleton());
assert(!mUserdata);
///
- /// userdataջעַҪתΪT*ֱthisܻᵼ¶ؼ̳еɥʧ̬
+ /// userdataջעַҪתΪTYPE*ֱthisܻᵼ¶ؼ̳еɥʧ̬
/// ֱӴthisȥڶؼ̳£òһͷ麯ġҪthis
/// תΪĵ͵ַõһ麯ͨһʵֶ̬
///
- T* p = static_cast<T*>(this);
+ TYPE* p = static_cast<TYPE*>(this);
state.PushPtrUserdata(p);
lua_newtable(state); // ref table޷luaʣC
@@ -239,10 +277,10 @@ namespace Luax
int refTable = top - 2;
// ref table ע __tostring __gc
- lua_pushcfunction(state, _Tostring);
+ lua_pushcfunction(state, __tostring);
lua_setfield(state, refTable, "__tostring");
- lua_pushcfunction(state, _GC);
+ lua_pushcfunction(state, __gc);
lua_setfield(state, refTable, "__gc");
// ref table __index __newindex Ϊ member table
@@ -260,13 +298,19 @@ namespace Luax
// һuserdataãͨPushLuaUserdatalua
mUserdata.SetRef(state, -1);
assert(mUserdata);
+
+ // һãGCʱ-1
+ ++mWatchDog.mVMRef;
+#if LUAX_PROFILER
+ mRefVMs.insert(state.GetVM());
+#endif
}
///
/// Աù
///
- template<typename T>
- void LuaxNativeClass<T>::SetLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef, int idx)
+ template<class TYPE, class BASE>
+ void LuaxNativeClass<TYPE, BASE>::SetLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef, int idx)
{
ClearLuaxMemberRef(state, memRef);
if (!lua_isnil(state, idx))
@@ -281,8 +325,8 @@ namespace Luax
}
}
- template<typename T>
- bool LuaxNativeClass<T>::PushLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef)
+ template<class TYPE, class BASE>
+ bool LuaxNativeClass<TYPE, BASE>::PushLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef)
{
if (memRef)
{
@@ -301,8 +345,8 @@ namespace Luax
return false;
}
- template<typename T>
- bool LuaxNativeClass<T>::PushLuaxMemberRef(LuaxState& state, int refID)
+ template<class TYPE, class BASE>
+ bool LuaxNativeClass<TYPE, BASE>::PushLuaxMemberRef(LuaxState& state, int refID)
{
if (PushLuaxRefTable(state))
{
@@ -317,8 +361,8 @@ namespace Luax
return false;
}
- template<typename T>
- void LuaxNativeClass<T>::ClearLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef)
+ template<class TYPE, class BASE>
+ void LuaxNativeClass<TYPE, BASE>::ClearLuaxMemberRef(LuaxState& state, LuaxMemberRef& memRef)
{
if (memRef)
{
@@ -336,16 +380,20 @@ namespace Luax
///
/// ͷŹʵ
///
- template<typename T>
- int LuaxNativeClass<T>::_GC(lua_State* L)
+ template<class TYPE, class BASE>
+ int LuaxNativeClass<TYPE, BASE>::__gc(lua_State* L)
{
+ LUAX_STATE(L);
+ TYPE* self = state.GetUserdata<TYPE>(1);
+ assert(self);
+
#if LUAX_PROFILER
- std::cout << "Luax: GC<" << T::GetLuaxClassName() << ">\n";
+ std::cout << "Luax: GC<" << TYPE::GetLuaxClassName() << ">\n";
#endif
- LUAX_SETUP(L, "U");
- T* self = state.GetUserdata<T>(1);
- delete self;
+ --self->mWatchDog.mVMRef;
+ self->LuaxNativeClass<TYPE, BASE>::Release();
+
return 0;
}
@@ -353,14 +401,14 @@ namespace Luax
/// ʽ:
/// ַ
///
- template<typename T>
- int LuaxNativeClass<T>::_Tostring(lua_State* L)
+ template<class TYPE, class BASE>
+ int LuaxNativeClass<TYPE, BASE>::__tostring(lua_State* L)
{
// params:
// 1: userdata
LUAX_STATE(L);
- T* self = state.GetUserdata<T>(1);
+ TYPE* self = state.GetUserdata<TYPE>(1);
if (self)
{
cc8* classname = "";
@@ -373,7 +421,7 @@ namespace Luax
}
else
{
- classname = T::GetLuaxClassName();
+ classname = TYPE::GetLuaxClassName();
}
lua_pushfstring(L, "%s: %p", classname, self);
return 1;
@@ -386,8 +434,8 @@ namespace Luax
/// ࣬luaijԱΪƣDZ֤userdataͳһNative classṩ__init֧֣
/// nativeʵ崴ʹ__initгʼӵкͻһNewбnativeһ͡
///
- template<typename T>
- int LuaxNativeClass<T>::l_ExtendFactory(lua_State* L)
+ template<class TYPE, class BASE>
+ int LuaxNativeClass<TYPE, BASE>::_ExtendFactory(lua_State* L)
{
// upvalues:
// 1: base class
@@ -414,13 +462,13 @@ namespace Luax
// .Extend()
lua_pushvalue(L, inheritClass);
- lua_pushcclosure(L, l_ExtendFactory, 1);
+ lua_pushcclosure(L, _ExtendFactory, 1);
lua_setfield(L, -2, "Extend");
// .New()
lua_pushvalue(L, inheritClass);
lua_getfield(L, baseClass, "New");
- lua_pushcclosure(L, l_New, 2);
+ lua_pushcclosure(L, _New, 2);
lua_setfield(L, -2, "New");
// __base = baseClass
@@ -438,8 +486,8 @@ namespace Luax
return 1;
}
- template<typename T>
- int LuaxNativeClass<T>::l_ExtendSingleton(lua_State* L)
+ template<class TYPE, class BASE>
+ int LuaxNativeClass<TYPE, BASE>::_ExtendSingleton(lua_State* L)
{
// upvalues:
// 1: base class
@@ -466,7 +514,7 @@ namespace Luax
// .Extend()
lua_pushvalue(L, inheritClass);
- lua_pushcclosure(L, l_ExtendFactory, 1);
+ lua_pushcclosure(L, _ExtendFactory, 1);
lua_setfield(L, -2, "Extend");
// __base = baseClass
@@ -485,8 +533,8 @@ namespace Luax
}
#endif /*LUAX_ENABLE_NATIVE_EXTEND*/
- template<typename T>
- int LuaxNativeClass<T>::l_GetClass(lua_State* L)
+ template<class TYPE, class BASE>
+ int LuaxNativeClass<TYPE, BASE>::_GetClass(lua_State* L)
{
LUAX_STATE(L);
if (!mClassTable)
@@ -496,19 +544,19 @@ namespace Luax
return 1;
}
- template<typename T>
- int LuaxNativeClass<T>::l_GetRefTable(lua_State* L)
+ template<class TYPE, class BASE>
+ int LuaxNativeClass<TYPE, BASE>::_GetRefTable(lua_State* L)
{
LUAX_STATE(L);
- T* self = state.GetUserdata<T>(1);
+ TYPE* self = state.GetUserdata<TYPE>(1);
bool success = self->PushLuaxRefTable(state);
if (!success)
lua_pushnil(L);
return 1;
}
- template<typename T>
- int LuaxNativeClass<T>::l_New(lua_State* L)
+ template<class TYPE, class BASE>
+ int LuaxNativeClass<TYPE, BASE>::_New(lua_State* L)
{
LUAX_STATE(L);
@@ -580,7 +628,7 @@ namespace Luax
return 0;
}
- template<typename T> LuaxStrongRef LuaxNativeClass<T>::mClassTable; // class table
- template<typename T> LuaxStrongRef LuaxNativeClass<T>::mSingletonRefTable; //
+ template<class TYPE, class BASE> LuaxStrongRef LuaxNativeClass<TYPE, BASE>::mClassTable; // class table
+ template<class TYPE, class BASE> LuaxStrongRef LuaxNativeClass<TYPE, BASE>::mSingletonRefTable; //
} \ No newline at end of file