Merge 4273d05ae57637c975ae81b8699acc4a46352a43 into cd8dacccc657ae88a741823229ee08c314ab4bd8

This commit is contained in:
Bernd Amend 2026-04-20 17:00:23 +00:00 committed by GitHub
commit 092467b5d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 25 additions and 2 deletions

View File

@ -386,6 +386,7 @@ namespace chaiscript::bootstrap {
m.add(fun(&Type_Info::is_arithmetic), "is_type_arithmetic"); m.add(fun(&Type_Info::is_arithmetic), "is_type_arithmetic");
m.add(fun(&Type_Info::name), "cpp_name"); m.add(fun(&Type_Info::name), "cpp_name");
m.add(fun(&Type_Info::bare_name), "cpp_bare_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"); m.add(fun(&Type_Info::bare_equal), "bare_equal");
basic_constructors<bool>("bool", m); basic_constructors<bool>("bool", m);

View File

@ -611,7 +611,7 @@ namespace chaiscript {
} }
} }
return ti.bare_name(); return ti.demangled_name();
} }
/// Return all registered types /// Return all registered types
@ -955,7 +955,7 @@ namespace chaiscript {
void dump_system() const { void dump_system() const {
std::cout << "Registered Types: \n"; std::cout << "Registered Types: \n";
for (const auto &[type_name, type] : get_types()) { 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'; std::cout << '\n';

View File

@ -15,6 +15,10 @@
#include <type_traits> #include <type_traits>
#include <typeinfo> #include <typeinfo>
#if __has_include(<cxxabi.h>)
#include <cxxabi.h>
#endif
namespace chaiscript { namespace chaiscript {
namespace detail { namespace detail {
template<typename T> template<typename T>
@ -83,6 +87,24 @@ namespace chaiscript {
} }
} }
std::string demangled_name() const noexcept {
#if __has_include(<cxxabi.h>)
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; } constexpr const std::type_info *bare_type_info() const noexcept { return m_bare_type_info; }
void make_const() noexcept { m_flags |= (1 << is_const_flag); } void make_const() noexcept { m_flags |= (1 << is_const_flag); }