summaryrefslogtreecommitdiff
path: root/Runner/Scripting/luax_state.inc
diff options
context:
space:
mode:
Diffstat (limited to 'Runner/Scripting/luax_state.inc')
-rw-r--r--Runner/Scripting/luax_state.inc180
1 files changed, 0 insertions, 180 deletions
diff --git a/Runner/Scripting/luax_state.inc b/Runner/Scripting/luax_state.inc
deleted file mode 100644
index 6671bb5..0000000
--- a/Runner/Scripting/luax_state.inc
+++ /dev/null
@@ -1,180 +0,0 @@
-namespace Luax
-{
-
- ///
- /// 注册工厂,注册class table,以type name为键设置在名称空间上。在注册阶段不会设置元表,等到New方法调用的时候才会。
- ///
- template<class TYPE>
- void LuaxState::RegisterFactory()
- {
- cc8* type = TYPE::GetLuaxFactoryName();
-
- lua_State* L = mState;
- LuaxState& state = *this;
-
- int top = lua_gettop(L); // namespace table
- assert(lua_istable(L, top));
-
- // class table
- lua_newtable(L);
- TYPE::RegisterLuaxClassShared(state);
- TYPE::RegisterLuaxFactoryClass(state);
- TYPE::RegisterLuaxClass(state);
-
- // 检测TYPE里面是否没有注册必须的方法
-#define _assertmethod(I, NAME) \
- GetField(I, NAME); \
- assert(IsType(-1, LUA_TFUNCTION)); \
- Pop();
-
- //_assertmethod(-1, "New");
-
-#undef _assertmethod
-
-#if LUAX_ENABLE_NATIVE_EXTEND
- // .Extend()
- lua_pushvalue(state, -1); // class table
- lua_pushcclosure(state, TYPE::_ExtendFactory, 1);
- lua_setfield(state, -2, "Extend");
-#endif
-
- // class["__index"] = class
- lua_pushvalue(state, -1); // class table
- lua_setfield(state, -2, "__index");
-
- TYPE::SetLuaxClassTableRef(state, -1);
-
- SetField(top, type);
-
- // reset top
- lua_settop(L, top);
-
- // 后处理
- TYPE::RegisterLuaxPostprocess(state);
- }
-
- ///
- /// Singleton
- ///
- template<typename TYPE>
- void LuaxState::RegisterSingleton()
- {
- lua_State* L = mState;
- LuaxState& state = *this;
-
- int top = lua_gettop(L); // namespace table
- assert(lua_istable(L, top));
-
- // class table.
- lua_newtable(L);
- TYPE::RegisterLuaxClassShared(state);
- TYPE::RegisterLuaxSingletonClass(state);
- TYPE::RegisterLuaxClass(state);
-
- TYPE::SetLuaxClassTableRef(state, -1);
-
- lua_pushvalue(state, -1);
- lua_setfield(state, -2, "__index");
-
-#if LUAX_ENABLE_NATIVE_EXTEND
- // .Extend()
- lua_pushvalue(state, -1); // class table
- lua_pushcclosure(state, TYPE::_ExtendSingleton, 1);
- lua_setfield(state, -2, "Extend");
-#endif
-
- cc8* type = TYPE::GetLuaxSingletonName();
- SetField(top, type);
-
- // reset top
- lua_settop(L, top);
-
- // 后处理
- TYPE::RegisterLuaxPostprocess(state);
- }
-
- template<typename TYPE>
- void LuaxState::SetField(int idx, cc8* key, TYPE value)
- {
- if (IsTableOrUserdata(idx))
- {
- idx = AbsIndex(idx);
- this->Push(value);
- lua_setfield(mState, idx, key);
- }
- }
-
- template<typename TYPE>
- void LuaxState::SetFieldByIndex(int idx, int key, TYPE value)
- {
- if (IsTableOrUserdata(idx))
- {
- idx = AbsIndex(idx);
- this->Push(value);
- lua_rawseti(mState, idx, key);
- }
- }
-
- template<typename TYPE>
- TYPE LuaxState::GetField(int idx, cc8* key, TYPE value)
- {
- GetField(idx, key);
- TYPE result = GetValue < TYPE >(-1, value);
- this->Pop();
-
- return result;
- }
-
- template<typename TYPE>
- TYPE LuaxState::GetField(int idx, int key, TYPE value)
- {
- GetField(idx, key);
- TYPE result = GetValue < TYPE >(-1, value);
- Pop();
-
- return result;
- }
-
- template<typename TYPE>
- TYPE* LuaxState::GetUserdata(int idx)
- {
- void* p = nullptr;
-
- if (IsType(idx, LUA_TUSERDATA))
- {
- p = *(void**)lua_touserdata(mState, idx);
- }
-
- return static_cast<TYPE*>(p);
- }
-
- template<typename TYPE>
- TYPE* LuaxState::CheckUserdata(int idx)
- {
- if (IsType(idx, LUA_TUSERDATA))
- {
- if (lua_getmetatable(mState, idx)) // ref table
- {
- if (lua_getmetatable(mState, -1)) // member table
- {
- if (lua_getmetatable(mState, -1)) // class table
- {
- TYPE::PushLuaxClassTable(*this); // target class table
- if (lua_rawequal(mState, -1, -2))
- {
- Pop(4); // ref\member\class\target class
- TYPE* udata = GetUserdata<TYPE>(idx);
- return udata; // userdata
- }
- Pop(2); // target class table\class table
- }
- Pop(1); // member table
- }
- Pop(1); // ref table
- }
- }
- luaL_typerror(mState, idx, TYPE::GetLuaxClassName());
- return nullptr;
- }
-
-} \ No newline at end of file