summaryrefslogtreecommitdiff
path: root/Source/3rdParty
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-03-17 10:49:50 +0800
committerchai <chaifix@163.com>2019-03-17 10:49:50 +0800
commitad2805aa839892589c13a615730da52f6e474709 (patch)
treef818bbacee347f8d64d9134ffe4fbda366ba87fe /Source/3rdParty
parentfb830270c5269a22819a0c0f1ee280f9aa3f1b39 (diff)
*luax
Diffstat (limited to 'Source/3rdParty')
-rw-r--r--Source/3rdParty/Luax/luax_class.cpp104
-rw-r--r--Source/3rdParty/Luax/luax_class.hpp31
-rw-r--r--Source/3rdParty/Luax/luax_class.inl50
-rw-r--r--Source/3rdParty/Luax/luax_enum.h10
-rw-r--r--Source/3rdParty/Luax/luax_state.cpp8
-rw-r--r--Source/3rdParty/Luax/luax_state.h12
-rw-r--r--Source/3rdParty/Luax/luax_state.inl30
7 files changed, 166 insertions, 79 deletions
diff --git a/Source/3rdParty/Luax/luax_class.cpp b/Source/3rdParty/Luax/luax_class.cpp
new file mode 100644
index 0000000..bdff377
--- /dev/null
+++ b/Source/3rdParty/Luax/luax_class.cpp
@@ -0,0 +1,104 @@
+#include "luax_class.hpp"
+#include "luax_runtime.h"
+#include "luax_cfunctions.h"
+
+namespace Luax
+{
+
+ int LuaxPlainClass::registry(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ // params:
+ // 1: class name
+
+ cc8* type = state.GetValue<cc8*>(1, "");
+
+ lua_newtable(L); // class table
+
+ // GetClassName()
+ lua_pushstring(L, type);
+ lua_pushcclosure(L, luax_c_getupvalue, 1);
+ lua_setfield(L, -2, "GetClassName");
+
+ // New()
+ lua_pushvalue(L, -1); // class table
+ lua_pushcclosure(L, l_New, 1);
+ lua_setfield(L, -2, "New");
+
+ // Extend()
+
+ lua_pushvalue(L, -1); // class table
+ lua_setfield(L, -2, "__index");
+
+ return 1;
+ }
+
+ ///
+ /// NewnԻȡCtorCtorʼʵ
+ ///
+ int LuaxPlainClass::l_New(lua_State* L)
+ {
+ LUAX_STATE(L);
+
+ // upvalues:
+ // 1: class table
+
+ // params:
+ // n: params
+ int n = lua_gettop(L);
+
+ int classTable = lua_upvalueindex(1);
+
+ lua_newtable(L); // instance table
+
+ // instance metatable Ϊ class
+ lua_pushvalue(L, classTable);
+ lua_setmetatable(L, -2);
+
+ lua_getfield(L, classTable, "Ctor");
+ if (!lua_isnil(L, -1))
+ {
+ // stack:
+ // -1: Ctor()
+ // -2: instance
+ // -3~-n-2: params
+
+ lua_insert(L, -2 - n);
+ // stack:
+ // -1: instance
+ // -2~-n-1: params
+ // -n-2: Ctor()
+
+ lua_pushvalue(L, -1);
+ // stack:
+ // -1: instance
+ // -2: instance
+ // -3~-n-2: params
+ // -n-3: Ctor
+
+ lua_insert(L, -3 - n);
+ // stack:
+ // -1: instance
+ // -2~-n-1: params
+ // -n-2: Ctor()
+ // -n-3: instance
+
+ lua_insert(L, -1 - n);
+ // stack:
+ // -1~-n: params
+ // -n-1: instance
+ // -n-2: Ctor()
+ // -n-3: instance
+
+ lua_pcall(L, n + 1, 0, 0);
+ }
+ else
+ {
+ state.Pop();
+ }
+
+ return 1;
+ }
+
+} \ No newline at end of file
diff --git a/Source/3rdParty/Luax/luax_class.hpp b/Source/3rdParty/Luax/luax_class.hpp
index 539093c..6557c0b 100644
--- a/Source/3rdParty/Luax/luax_class.hpp
+++ b/Source/3rdParty/Luax/luax_class.hpp
@@ -14,12 +14,10 @@ namespace Luax
///
/// RegisterLuaxClass עķͳԱö١ȵclass table
- /// LuaxRegisterInterface עӿڷinterface table
/// LuaxGetFactoryName ùͬʱעʱעΪsingletonͨʱ
///
#define LUAX_DECL_FACTORY(type) \
static void RegisterLuaxClass(Luax::LuaxState&);\
- static void RegisterLuaxInterface(Luax::LuaxState&);\
static void RegisterLuaxPostprocess(Luax::LuaxState&); \
static const char* GetLuaxFactoryName() { return #type; };\
static const char* GetLuaxClassName() { return #type; };\
@@ -37,7 +35,7 @@ namespace Luax
static bool IsLuaxClassSingleton() { return true; };
///
- /// Ҫ¶luaclassҪ̳дࡣͨluaʵҪȷüȷԣڶ߳Ҫȷͷš
+ /// Ҫ¶luanative classҪ̳дࡣͨluaʵҪȷüȷԣڶ߳Ҫȷͷš
///
template<class T>
class LuaxClass
@@ -81,12 +79,8 @@ namespace Luax
static void RegisterLuaxFactoryClass(LuaxState& state);
static void RegisterLuaxSingletonClass(LuaxState& state);
- static void RegisterLuaxInterface(LuaxState& state);
-
- static void SetLuaxInterfaceTableRef(LuaxState& state, int idx);
static void SetLuaxClassTableRef(LuaxState& state, int idx);
- static void PushLuaxInterfaceTable(LuaxState& state);
static void PushLuaxClassTable(LuaxState& state);
///
@@ -106,7 +100,6 @@ namespace Luax
/// LuaxClass<T>͵ʵ
///
static LuaxStrongRef mClassTable; // class table͵
- static LuaxStrongRef mInterfaceTable; // ǹinterface tableʵĶĹз
static LuaxStrongRef mSingletonRefTable; // ǵsingletonijԱԱ֤ᱻͨ
// ref tableijԱȫڵģֱ_LUAX_STRONGREF_TABLE
@@ -114,7 +107,7 @@ namespace Luax
/// ͨuserdataõ:
/// 1: ref table
/// 2: member table
- /// 3: interface table
+ /// 3: class table
///
LuaxWeakRef mUserdata;
@@ -132,7 +125,6 @@ namespace Luax
LUAX_DECL_METHOD( l___gc );
LUAX_DECL_METHOD( l_ExtendFactory );
LUAX_DECL_METHOD( l_GetClass );
- LUAX_DECL_METHOD( l_GetInterfaceTable );
LUAX_DECL_METHOD( l_GetRefTable );
//------------------------------------------------------------------------------------------------------------
@@ -142,6 +134,25 @@ namespace Luax
};
+ //--------------------------------------------------------------------------------------------------------------
+
+ ///
+ /// lua
+ ///
+ class LuaxPlainClass
+ {
+ public:
+
+ ///
+ /// עںͨregistry()עࡣ
+ ///
+ static int registry(lua_State* L);
+
+ LUAX_DECL_METHOD( l_Extend );
+ LUAX_DECL_METHOD( l_New );
+
+ };
+
}
#endif \ No newline at end of file
diff --git a/Source/3rdParty/Luax/luax_class.inl b/Source/3rdParty/Luax/luax_class.inl
index bbda6de..6086b3d 100644
--- a/Source/3rdParty/Luax/luax_class.inl
+++ b/Source/3rdParty/Luax/luax_class.inl
@@ -40,20 +40,6 @@ namespace Luax
void LuaxClass<T>::RegisterLuaxFactoryClass(LuaxState& state)
{
luaL_Reg regTable[] = {
- { "GetInterfaceTable", l_GetInterfaceTable },
- { NULL, NULL }
- };
-
- state.RegisterMethods(regTable);
- }
-
- ///
- /// ʵijԱעinterface table
- ///
- template<typename T>
- void LuaxClass<T>::RegisterLuaxInterface(LuaxState& state)
- {
- luaL_Reg regTable[] = {
{ "GetClass", l_GetClass },
{ "GetRefTable", l_GetRefTable },
{ NULL, NULL }
@@ -76,14 +62,6 @@ namespace Luax
}
template<typename T>
- void LuaxClass<T>::PushLuaxInterfaceTable(LuaxState& state)
- {
- assert(mInterfaceTable);
-
- mInterfaceTable.PushRef(state);
- }
-
- template<typename T>
void LuaxClass<T>::PushLuaxClassTable(LuaxState& state)
{
assert(mClassTable);
@@ -92,12 +70,6 @@ namespace Luax
}
template<typename T>
- void LuaxClass<T>::SetLuaxInterfaceTableRef(LuaxState& state, int idx)
- {
- mInterfaceTable.SetRef(state, idx);
- }
-
- template<typename T>
void LuaxClass<T>::SetLuaxClassTableRef(LuaxState& state, int idx)
{
mClassTable.SetRef(state, idx);
@@ -221,10 +193,10 @@ namespace Luax
}
///
- /// userdataԴref tablemember tableinterface table
+ /// userdataԴref tablemember tableclass table
/// ref table kvǿtableuserdataüͨuserdataΪkeyΪvalueԼԱ
/// member table luaʵijԱ
- /// interface table б͵ʵеijԱ
+ /// class table б͵ʵеĺ
///
template<typename T>
void LuaxClass<T>::BindToLua(LuaxState& state)
@@ -238,10 +210,10 @@ namespace Luax
lua_newtable(state); // ref table޷luaʣC
lua_newtable(state); // member tableluaдĶԱ
- PushLuaxInterfaceTable(state); // interface tablemember tableûԱinterface tableҡ
+ PushLuaxClassTable(state); // class table
// stack:
- // -1: interface table
+ // -1: class table
// -2: member table
// -3: ref table
// -4: userdata
@@ -265,7 +237,7 @@ namespace Luax
lua_setfield(state, refTable, "__newindex");
// Ԫ
- lua_setmetatable(state, -2); // interface is meta of member
+ lua_setmetatable(state, -2); // class is meta of member
lua_setmetatable(state, -2); // member is meta of ref
lua_setmetatable(state, -2); // ref is meta of userdata
@@ -388,17 +360,6 @@ namespace Luax
return 0;
}
- template<typename T>
- int LuaxClass<T>::l_GetInterfaceTable(lua_State* L)
- {
- LUAX_STATE(L);
- if (!mInterfaceTable)
- lua_pushnil(L);
- else
- mInterfaceTable.PushRef(state);
- return 1;
- }
-
template<typename T>
int LuaxClass<T>::l_GetClass(lua_State* L)
{
@@ -421,7 +382,6 @@ namespace Luax
return 1;
}
- template<typename T> LuaxStrongRef LuaxClass<T>::mInterfaceTable; // interface table
template<typename T> LuaxStrongRef LuaxClass<T>::mClassTable; // class table
template<typename T> LuaxStrongRef LuaxClass<T>::mSingletonRefTable; //
diff --git a/Source/3rdParty/Luax/luax_enum.h b/Source/3rdParty/Luax/luax_enum.h
index bb96102..17fcda4 100644
--- a/Source/3rdParty/Luax/luax_enum.h
+++ b/Source/3rdParty/Luax/luax_enum.h
@@ -19,6 +19,16 @@ namespace Luax
extern int l_rmt__newindex(lua_State* L);
+ //--------------------------------------------------------------------------------------------------------------
+
+ ///
+ /// luaö٣޸ĵtable
+ ///
+ class LuaxPlainEnum
+ {
+
+ };
+
}
#endif \ No newline at end of file
diff --git a/Source/3rdParty/Luax/luax_state.cpp b/Source/3rdParty/Luax/luax_state.cpp
index a60a021..0913ee3 100644
--- a/Source/3rdParty/Luax/luax_state.cpp
+++ b/Source/3rdParty/Luax/luax_state.cpp
@@ -2,6 +2,7 @@
#include "luax_enum.h"
#include "luax_state.h"
#include "luax_runtime.h"
+#include "luax_class.hpp"
namespace Luax
{
@@ -699,4 +700,11 @@ namespace Luax
luaL_register(mState, libname, l);
}
+ void LuaxState::RegisterPlainClassRegistry(cc8* name)
+ {
+ assert(lua_istable(mState, -1));
+ lua_pushcfunction(mState, LuaxPlainClass::registry);
+ lua_setfield(mState, -2, name);
+ }
+
} \ No newline at end of file
diff --git a/Source/3rdParty/Luax/luax_state.h b/Source/3rdParty/Luax/luax_state.h
index 2bcfd9b..fee9d8a 100644
--- a/Source/3rdParty/Luax/luax_state.h
+++ b/Source/3rdParty/Luax/luax_state.h
@@ -16,7 +16,7 @@ namespace Luax
///
/// lua_StateĴ˱һlua_Stateòݡһʵmetatable£
- /// interface table
+ /// class table
/// member table
/// ref table
/// userdata
@@ -163,6 +163,16 @@ namespace Luax
///
void RegisterLib(cc8* libname, const luaL_Reg* l);
+ ///
+ /// עᴿluaעắluaࡣ
+ ///
+ void RegisterPlainClassRegistry(cc8* name);
+
+ ///
+ /// עᴿluaö٣Էֹ޸öֵ
+ ///
+ void RegisterPlainEnumRegistry(cc8* name);
+
//------------------------------------------------------------------------------------------------------------
private:
diff --git a/Source/3rdParty/Luax/luax_state.inl b/Source/3rdParty/Luax/luax_state.inl
index c9a95f6..63f849f 100644
--- a/Source/3rdParty/Luax/luax_state.inl
+++ b/Source/3rdParty/Luax/luax_state.inl
@@ -2,8 +2,7 @@ namespace Luax
{
///
- /// עṤΪעinterface tableclass tabletype nameΪƿռϡע׶βԪȵNew
- /// õʱŻᡣ
+ /// עṤעclass tabletype nameΪƿռϡע׶βԪȵNewõʱŻᡣ
///
template<typename T>
void LuaxState::RegisterFactory()
@@ -14,20 +13,7 @@ namespace Luax
int top = lua_gettop(L); // namespace table
assert(lua_istable(L, top));
- // 1) interface table
- lua_newtable(L);
- LuaxClass<T>::RegisterLuaxInterface(state);
- T::RegisterLuaxInterface(state);
-
- // interface table[__index] = interface table
- lua_pushvalue(L, -1);
- lua_setfield(L, -2, "__index");
-
- LuaxClass<T>::SetLuaxInterfaceTableRef(state, -1);
-
- lua_settop(L, top);
-
- // 2) class table
+ // class table
lua_newtable(L);
LuaxClass<T>::RegisterLuaxClass(state);
LuaxClass<T>::RegisterLuaxFactoryClass(state);
@@ -45,14 +31,12 @@ namespace Luax
// .Extend()
lua_pushvalue(state, -1); // class table
- LuaxClass<T>::PushLuaxInterfaceTable(state); // interface table
- lua_pushcclosure(state, LuaxClass<T>::l_ExtendFactory, 2);
+ lua_pushcclosure(state, LuaxClass<T>::l_ExtendFactory, 1);
lua_setfield(state, -2, "Extend");
- // .GetInterfaceTable()
- LuaxClass<T>::PushLuaxInterfaceTable(state); // interface table
- lua_pushcclosure(state, LuaxClass<T>::l_GetInterfaceTable, 1);
- lua_setfield(state, -2, "GetInterfaceTable");
+ // class["__index"] = class
+ lua_pushvalue(state, -1); // class table
+ lua_setfield(state, -2, "__index");
LuaxClass<T>::SetLuaxClassTableRef(state, -1);
@@ -67,7 +51,7 @@ namespace Luax
}
///
- /// Singletonֻһclass tableûinterface table
+ /// Singleton
///
template<typename T>
void LuaxState::RegisterSingleton()