CppUnit: demangle class names

This commit is contained in:
Günter Obiltschnig 2023-10-02 07:16:48 +02:00
parent 3a93e32def
commit 70bb8f13f9
5 changed files with 33 additions and 2 deletions

View File

@ -10,6 +10,7 @@
#include "CppUnit/CppUnit.h"
#include "CppUnit/Guards.h"
#include "CppUnit/Test.h"
#include "CppUnit/TestResult.h"
#include "CppUnit/CppUnitException.h"
#include <string>
#include <vector>
@ -243,7 +244,7 @@ inline void TestCase::tearDown()
inline std::string TestCase::toString() const
{
const std::type_info& thisClass = typeid(*this);
return std::string(thisClass.name()) + "." + name();
return TestResult::demangle(thisClass.name()) + "." + name();
}

View File

@ -97,6 +97,8 @@ public:
}
};
static std::string demangle(const char* name);
protected:
virtual void setSynchronizationObject(SynchronizationObject* syncObject);

View File

@ -122,7 +122,7 @@ void TestCase::run(TestResult *result, const Test::Callback& callback)
}
catch (std::exception& e)
{
std::string msg(typeid(e).name());
std::string msg(TestResult::demangle(typeid(e).name()));
msg.append(":\n").append(callback(e));
result->addError(this, new CppUnitException(msg));
}

View File

@ -4,6 +4,10 @@
#include "CppUnit/TestResult.h"
#ifdef POCO_HAVE_CXXABI_H
#include <cxxabi.h>
#include <cstdlib>
#endif
namespace CppUnit {
@ -24,4 +28,26 @@ TestResult::~TestResult()
}
std::string TestResult::demangle(const char* typeName)
{
std::string result;
#ifdef POCO_HAVE_CXXABI_H
int status;
char* demangled = abi::__cxa_demangle(typeName, nullptr, nullptr, &status);
if (demangled)
{
result = demangled;
std::free(demangled);
}
else
{
result = typeName;
}
#else
result = typeName;
#endif
return result;
}
} // namespace CppUnit

View File

@ -243,10 +243,12 @@
#if defined(__clang__)
#define POCO_COMPILER_CLANG
#define POCO_HAVE_CXXABI_H
#elif defined(_MSC_VER)
#define POCO_COMPILER_MSVC
#elif defined (__GNUC__)
#define POCO_COMPILER_GCC
#define POCO_HAVE_CXXABI_H
#if defined (__MINGW32__) || defined (__MINGW64__)
#define POCO_COMPILER_MINGW
#endif