diff --git a/Common/LuaBindings.cpp b/Common/LuaBindings.cpp index 4f1ae0e16a20fe3660fce6d2dfb191b229f53308..d768a613e0a12cd779274b90fff3719ffe270241 100644 --- a/Common/LuaBindings.cpp +++ b/Common/LuaBindings.cpp @@ -398,4 +398,24 @@ binding::~binding() } } +void *binding::checkudata_with_inheritance (lua_State *L, int ud, const char *tname) { + void *p = lua_touserdata(L, ud); + if (!p) + return NULL; + + lua_getglobal(L, tname); + if (ud<0) ud--; + int depth = 1; + while (luaL_getmetafield (L, ud, "__index")) { + depth ++; + if (lua_rawequal(L,-1, -depth) ) { + lua_pop(L, depth); + return p; + } + ud = -1; + } + lua_pop(L, depth); + return NULL; +} + #endif diff --git a/Common/LuaBindings.h b/Common/LuaBindings.h index ef8ba46eb8db9c2b6b1fc5e5aa6cc2a883ba0f09..14b74d885d87c00e0e5946aca432b5076be4cdae 100644 --- a/Common/LuaBindings.h +++ b/Common/LuaBindings.h @@ -62,6 +62,7 @@ class binding { static binding *_instance; void checkDocCompleteness(); public: + static void *checkudata_with_inheritance (lua_State *L, int ud, const char *tname); inline static binding *instance(){ return _instance ? _instance : new binding(); } lua_State *L; int readFile(const char *filename); @@ -200,7 +201,7 @@ class luaStack<type *>{ public: static type* get(lua_State *L, int ia) { - userdataType *ud = static_cast<userdataType*>(lua_touserdata(L, ia)); + userdataType *ud=static_cast<userdataType*>(binding::checkudata_with_inheritance (L, ia, getName().c_str())); if(!ud) luaL_typerror(L, ia, className<type>::get().c_str()); return ud->pT; } @@ -225,7 +226,7 @@ class luaStack<const type *>{ public: static type* get(lua_State *L, int ia) { - userdataType *ud = static_cast<userdataType*>(lua_touserdata(L, ia)); + userdataType *ud=static_cast<userdataType*>(binding::checkudata_with_inheritance (L, ia, getName().c_str())); if(!ud) luaL_typerror(L, ia, className<type>::get().c_str()); return ud->pT; } @@ -250,7 +251,7 @@ class luaStack<type &>{ public: static type& get(lua_State *L, int ia) { - userdataType *ud = static_cast<userdataType*>(lua_touserdata(L, ia)); + userdataType *ud=static_cast<userdataType*>(binding::checkudata_with_inheritance (L, ia, getName().c_str())); if(!ud) luaL_typerror(L, ia, className<type>::get().c_str()); return *ud->pT; } @@ -266,7 +267,7 @@ class luaStack<const type &>{ public: static type& get(lua_State *L, int ia) { - userdataType *ud = static_cast<userdataType*>(lua_touserdata(L, ia)); + userdataType *ud=static_cast<userdataType*>(binding::checkudata_with_inheritance (L, ia, getName().c_str())); if(!ud) luaL_typerror(L, ia, className<type>::get().c_str()); return *ud->pT; }