summaryrefslogtreecommitdiff
path: root/source/3rd-party/Luax/luax_state.inl
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-03-20 22:43:25 +0800
committerchai <chaifix@163.com>2019-03-20 22:43:25 +0800
commit82956beb1fe17e1226327638c8ab22b5f5adfc1d (patch)
treeb47464697174d5f9db4c8c9ab4a25cc384927d97 /source/3rd-party/Luax/luax_state.inl
parent1497dccd63a84b7ee2b229b1ad9c5c02718f2a78 (diff)
*misc
Diffstat (limited to 'source/3rd-party/Luax/luax_state.inl')
-rw-r--r--source/3rd-party/Luax/luax_state.inl31
1 files changed, 30 insertions, 1 deletions
diff --git a/source/3rd-party/Luax/luax_state.inl b/source/3rd-party/Luax/luax_state.inl
index 06d9350..4af45a2 100644
--- a/source/3rd-party/Luax/luax_state.inl
+++ b/source/3rd-party/Luax/luax_state.inl
@@ -125,7 +125,7 @@ namespace Luax
}
template<typename T>
- T* LuaxState::GetLuaUserdata(int idx)
+ T* LuaxState::GetUserdata(int idx)
{
void* p = nullptr;
@@ -137,4 +137,33 @@ namespace Luax
return static_cast<T*>(p);
}
+ template<typename T>
+ T* 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
+ {
+ T::PushLuaxClassTable(*this); // target class table
+ if (lua_rawequal(mState, -1, -2))
+ {
+ Pop(4); // ref\member\class\target class
+ T* udata = GetUserdata<T>(idx);
+ return udata; // userdata
+ }
+ Pop(2); // target class table\class table
+ }
+ Pop(1); // member table
+ }
+ Pop(1); // ref table
+ }
+ }
+ luaL_typerror(mState, idx, T::GetLuaxClassName());
+ return nullptr;
+ }
+
} \ No newline at end of file