summaryrefslogtreecommitdiff
path: root/Source/3rdParty/Luax/luax_state.inl
diff options
context:
space:
mode:
Diffstat (limited to 'Source/3rdParty/Luax/luax_state.inl')
-rw-r--r--Source/3rdParty/Luax/luax_state.inl182
1 files changed, 106 insertions, 76 deletions
diff --git a/Source/3rdParty/Luax/luax_state.inl b/Source/3rdParty/Luax/luax_state.inl
index 1515123..2c9f7a8 100644
--- a/Source/3rdParty/Luax/luax_state.inl
+++ b/Source/3rdParty/Luax/luax_state.inl
@@ -1,110 +1,140 @@
+namespace Luax
+{
-// ͨ͵вͬע̣ͨLuaxStateRegister_ʵ
+ // ͨ͵вͬע̣ͨLuaxStateRegister_ʵ
-// עṤΪעinterface tableclass tabletype nameΪƿռϡע׶βԪȵNewõʱŻᡣ
+ // עṤΪעinterface tableclass tabletype nameΪƿռϡע׶βԪȵNewõʱŻᡣ
-template<typename T>
-void LuaxState::RegisterFactory()
-{
- lua_State* L = mState;
+ template<typename T>
+ void LuaxState::RegisterFactory()
+ {
+ lua_State* L = mState;
+ LuaxState& state = *this;
- int top = lua_gettop(L); // namespace table
+ int top = lua_gettop(L); // namespace table
- const char* type = T::GetLuaxFactoryName();
+ assert(lua_istable(L, top));
- // interface table.
- lua_newtable(L);
+ const char* type = T::GetLuaxFactoryName();
- int idx = AbsIndex(-1);
+ // interface table
+ lua_newtable(L);
- LuaxClass::RegisterLuaxInterface<T>(*this);
- T::RegisterLuaxInterface(*this);
+ // interface table[__index] = interface table
+ lua_pushvalue(L, -1);
+ lua_setfield(L, -2, "__index");
- // TǷûעķ
-#define assertMethods(I, NAME)\
- GetField(I, NAME);\
- assert(IsType(-1, LUA_TFUNCTION));\
- Pop();
+ LuaxClass<T>::RegisterLuaxInterface(state);
+ T::RegisterLuaxInterface(state);
- assertMethods(idx, "New");
+ LuaxClass<T>::SetInterfaceTableRef(state, -1);
-#undef assertMethods
+ lua_settop(L, top);
- lua_settop(L, top);
+ // class table
+ lua_newtable(L);
- // class table.
- lua_newtable(L);
+ LuaxClass<T>::RegisterLuaxClass(state);
+ LuaxClass<T>::RegisterLuaxFactoryClass(state);
+ T::RegisterLuaxClass(state);
- assert(lua_istable(L, -1));
+ // TǷûעķ
+#define _assertmethod(I, NAME) \
+ GetField(I, NAME); \
+ assert(IsType(-1, LUA_TFUNCTION)); \
+ Pop();
- lua_pushvalue(L, -1);
+ // NewûУûеĻʾһ
+ //_assertmethod(-1, "New");
- LuaxClass::RegisterLuaxClass<T>(*this);
- LuaxClass::RegisterLuaxFactoryClass<T>(*this);
- T::RegisterLuaxClass(*this);
+#undef _assertmethod
- SetField(top, type);
+ // .Extend()
+ lua_pushvalue(state, -1); // class table
+ LuaxClass<T>::PushInterfaceTable(state); // interface table
+ lua_pushcclosure(state, LuaxClass<T>::l_ExtendFactory, 2);
+ lua_setfield(state, -2, "Extend");
- // reset top
- lua_settop(L, top);
+ // .GetInterfaceTable()
+ LuaxClass<T>::PushInterfaceTable(state); // interface table
+ lua_pushcclosure(state, LuaxClass<T>::l_GetInterfaceTable, 1);
+ lua_setfield(state, -2, "GetInterfaceTable");
-}
+ LuaxClass<T>::SetClassTableRef(state, -1);
-// עᵥ
-template<typename T>
-void LuaxState::RegisterSingleton()
-{
- lua_State* L = mState;
+ SetField(top, type);
- int top = lua_gettop(L); // namespace table
+ // reset top
+ lua_settop(L, top);
+ }
- const char* type = T::GetLuaxSingletonName();
+ // עᵥ
+ template<typename T>
+ void LuaxState::RegisterSingleton()
+ {
+ lua_State* L = mState;
+ LuaxState& state = *this;
- // class table.
- lua_newtable(L);
+ int top = lua_gettop(L); // namespace table
+ assert(lua_istable(L, top));
- assert(lua_istable(L, -1));
+ const char* type = T::GetLuaxSingletonName();
- lua_pushvalue(L, -1);
+ // class table.
+ lua_newtable(L);
- LuaxClass::RegisterLuaxClass<T>(*this);
- LuaxClass::RegisterLuaxFactoryClass<T>(*this);
- T::RegisterLuaxClass(*this);
+ LuaxClass<T>::RegisterLuaxClass(state);
+ LuaxClass<T>::RegisterLuaxFactoryClass(state);
+ T::RegisterLuaxClass(state);
- SetField(top, type);
+ SetField(top, type);
- // reset top
- lua_settop(L, top);
+ // reset top
+ lua_settop(L, top);
+ }
-}
+ template<typename T>
+ void LuaxState::SetField(int idx, cc8* key, T value)
+ {
+ if (IsTableOrUserdata(idx))
+ {
+ idx = AbsIndex(idx);
+ this->Push(value);
+ lua_setfield(mState, idx, key);
+ }
+ }
-template<typename T>
-void LuaxState::SetField(int idx, cc8* key, T value)
-{
- if (IsTableOrUserdata(idx))
+ template<typename T>
+ T LuaxState::GetField(int idx, cc8* key, T value)
{
- idx = AbsIndex(idx);
- this->Push(value);
- lua_setfield(mState, idx, key);
+ GetField(idx, key);
+ T result = GetValue < T >(-1, value);
+ this->Pop();
+
+ return result;
}
-}
-template<typename T>
-T LuaxState::GetField(int idx, cc8* key, T value)
-{
- GetField(idx, key);
- T result = GetValue < T >(-1, value);
- this->Pop();
-
- return result;
-}
-
-template<typename T>
-T LuaxState::GetField(int idx, int key, T value)
-{
- GetField(idx, key);
- T result = GetValue < T >(-1, value);
- Pop();
+ template<typename T>
+ T LuaxState::GetField(int idx, int key, T value)
+ {
+ GetField(idx, key);
+ T result = GetValue < T >(-1, value);
+ Pop();
+
+ return result;
+ }
+
+ template<typename T>
+ T* LuaxState::GetLuaUserdata(int idx)
+ {
+ void* p = nullptr;
+
+ if (IsType(idx, LUA_TUSERDATA))
+ {
+ p = *(void**)lua_touserdata(mState, idx);
+ }
+
+ return static_cast<T*>(p);
+ }
- return result;
-}
+} \ No newline at end of file