13
0

adjust demangling code a bit so that it can easily be used with typenames and not just functions in stacktraces

This commit is contained in:
Paul Davis 2013-04-05 11:26:39 -04:00
parent 19bd641915
commit 7db5d68cdb
2 changed files with 26 additions and 17 deletions

View File

@ -37,6 +37,7 @@
namespace PBD {
void stacktrace (std::ostream& out, int levels = 0);
void trace_twb();
std::string demangle (const std::string&);
template<typename T>
class thing_with_backtrace

View File

@ -35,37 +35,45 @@ PBD::trace_twb ()
#include <execinfo.h>
#include <cxxabi.h>
std::string demangle (std::string const & l)
static std::string
symbol_demangle (const std::string& l)
{
int status;
try {
char* realname = abi::__cxa_demangle (l.c_str(), 0, 0, &status);
std::string d (realname);
free (realname);
return d;
} catch (std::exception) {
}
return l;
}
std::string
PBD::demangle (std::string const & l)
{
std::string::size_type const b = l.find_first_of ("(");
if (b == std::string::npos) {
return l;
return symbol_demangle (l);
}
std::string::size_type const p = l.find_last_of ("+");
if (p == std::string::npos) {
return l;
return symbol_demangle (l);
}
if ((p - b) <= 1) {
return l;
return symbol_demangle (l);
}
std::string const fn = l.substr (b + 1, p - b - 1);
int status;
try {
char* realname = abi::__cxa_demangle (fn.c_str(), 0, 0, &status);
std::string d (realname);
free (realname);
return d;
} catch (std::exception) {
}
return l;
return symbol_demangle (fn);
}
void