diff --git a/include/chaiscript/dispatchkit/bootstrap.hpp b/include/chaiscript/dispatchkit/bootstrap.hpp index ba1de5ad..bef8803c 100644 --- a/include/chaiscript/dispatchkit/bootstrap.hpp +++ b/include/chaiscript/dispatchkit/bootstrap.hpp @@ -384,6 +384,7 @@ namespace chaiscript::bootstrap { m.add(fun(&Type_Info::is_arithmetic), "is_type_arithmetic"); m.add(fun(&Type_Info::name), "cpp_name"); m.add(fun(&Type_Info::bare_name), "cpp_bare_name"); + m.add(fun(&Type_Info::demangled_name), "cpp_demangled_name"); m.add(fun(&Type_Info::bare_equal), "bare_equal"); basic_constructors("bool", m); diff --git a/include/chaiscript/dispatchkit/dispatchkit.hpp b/include/chaiscript/dispatchkit/dispatchkit.hpp index 06e8992a..6cb4196c 100644 --- a/include/chaiscript/dispatchkit/dispatchkit.hpp +++ b/include/chaiscript/dispatchkit/dispatchkit.hpp @@ -588,7 +588,7 @@ namespace chaiscript { } } - return ti.bare_name(); + return ti.demangled_name(); } /// Return all registered types @@ -932,7 +932,7 @@ namespace chaiscript { void dump_system() const { std::cout << "Registered Types: \n"; for (const auto &[type_name, type] : get_types()) { - std::cout << type_name << ": " << type.bare_name() << '\n'; + std::cout << type_name << ": " << type.demangled_name() << '\n'; } std::cout << '\n'; diff --git a/include/chaiscript/dispatchkit/type_info.hpp b/include/chaiscript/dispatchkit/type_info.hpp index 2f21ee58..e7ee7738 100644 --- a/include/chaiscript/dispatchkit/type_info.hpp +++ b/include/chaiscript/dispatchkit/type_info.hpp @@ -15,6 +15,10 @@ #include #include +#if __has_include() +#include +#endif + namespace chaiscript { namespace detail { template @@ -83,6 +87,24 @@ namespace chaiscript { } } + std::string demangled_name() const noexcept { +#if __has_include() + if (is_undef()) + return ""; + + int status{}; + char *ret = abi::__cxa_demangle(m_bare_type_info->name(), nullptr, nullptr, &status); + if (ret) { + std::string value{ret}; + free(ret); + return value; + } + return m_bare_type_info->name(); +#else + return bare_name(); +#endif + } + constexpr const std::type_info *bare_type_info() const noexcept { return m_bare_type_info; } private: