From b6ea30f9c180d69520ac0ee6a3b565956553a618 Mon Sep 17 00:00:00 2001 From: Lynix Date: Wed, 30 Mar 2016 18:15:17 +0200 Subject: [PATCH] Lua/LuaClass: Add a default ToString implementation Former-commit-id: ff6c9cf1d18d34ad8fd7b03c970eec2da5ba0947 --- include/Nazara/Lua/LuaClass.hpp | 1 + include/Nazara/Lua/LuaClass.inl | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/include/Nazara/Lua/LuaClass.hpp b/include/Nazara/Lua/LuaClass.hpp index b4aa9d87b..130ac2904 100644 --- a/include/Nazara/Lua/LuaClass.hpp +++ b/include/Nazara/Lua/LuaClass.hpp @@ -86,6 +86,7 @@ namespace Nz static int StaticGetterProxy(lua_State* state); static int StaticMethodProxy(lua_State* state); static int StaticSetterProxy(lua_State* state); + static int ToStringProxy(lua_State* state); std::map m_methods; std::map m_staticMethods; diff --git a/include/Nazara/Lua/LuaClass.inl b/include/Nazara/Lua/LuaClass.inl index b2bbdbc3e..393225399 100644 --- a/include/Nazara/Lua/LuaClass.inl +++ b/include/Nazara/Lua/LuaClass.inl @@ -64,6 +64,15 @@ namespace Nz lua.PushString(m_info->name); lua.SetField("__type"); + // In case a __tostring method is missing, add a default implementation returning the type + if (m_methods.find("__tostring") == m_methods.end()) + { + // Define the Finalizer + lua.PushValue(1); // shared_ptr on UserData + lua.PushCFunction(ToStringProxy, 1); + lua.SetField("__tostring"); + } + // Define the Finalizer lua.PushValue(1); lua.PushCFunction(FinalizerProxy, 1); @@ -486,6 +495,17 @@ namespace Nz return 1; } + + template + int LuaClass::ToStringProxy(lua_State* state) + { + LuaInstance& lua = *LuaInstance::GetInstance(state); + + std::shared_ptr& info = *static_cast*>(lua.ToUserdata(lua.GetIndexOfUpValue(1))); + + lua.PushString(info->name); + return 1; + } } #include