X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/d8d4e03ef0522097adb78ee606e5f9cc489c0d29..076aada113aa0566c059211416cd9214a54d763d:/src/bindings/lua/lua_utils.c diff --git a/src/bindings/lua/lua_utils.c b/src/bindings/lua/lua_utils.c index 3f1f523f0a..efd257a417 100644 --- a/src/bindings/lua/lua_utils.c +++ b/src/bindings/lua/lua_utils.c @@ -6,6 +6,7 @@ /* SimGrid Lua helper functions */ +#include #include "lua_utils.h" #include "xbt.h" #include "xbt/log.h" @@ -102,7 +103,8 @@ const char* sglua_get_spaces(int length) { static char spaces[128]; - xbt_assert(length < 128); + xbt_assert(length >= 0 && length < 128, + "Invalid indentation length: %d", length); if (length != 0) { memset(spaces, ' ', length); } @@ -137,6 +139,39 @@ void sglua_stack_dump(const char* msg, lua_State* L) } } +/** + * \brief Like luaL_checkudata, with additional debug logs. + * + * This function is for debugging purposes only. + * + * \param L a lua state + * \param ud index of the userdata to check in the stack + * \param tname key of the metatable of this userdata in the registry + */ +void* sglua_checkudata_debug(lua_State* L, int ud, const char* tname) +{ + XBT_DEBUG("Checking the userdata: ud = %d", ud); + sglua_stack_dump("my_checkudata: ", L); + void* p = lua_touserdata(L, ud); + lua_getfield(L, LUA_REGISTRYINDEX, tname); + const void* correct_mt = lua_topointer(L, -1); + + int has_mt = lua_getmetatable(L, ud); + XBT_DEBUG("Checking the userdata: has metatable ? %d", has_mt); + const void* actual_mt = NULL; + if (has_mt) { + actual_mt = lua_topointer(L, -1); + lua_pop(L, 1); + } + XBT_DEBUG("Checking the task's metatable: expected %p, found %p", correct_mt, actual_mt); + sglua_stack_dump("my_checkudata: ", L); + + if (p == NULL || !lua_getmetatable(L, ud) || !lua_rawequal(L, -1, -2)) + luaL_typerror(L, ud, tname); + lua_pop(L, 2); + return p; +} + /** * @brief Writes the specified data into a memory buffer. *