diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-04-05 11:26:39 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-04-05 11:26:39 -0400 |
commit | 7db5d68cdb1c7b6138907cb732e913ec91212e13 (patch) | |
tree | af58ff4bd546b22106191dee4bac7d4999948ec7 /libs/pbd | |
parent | 19bd6419157119b976393a0c5966b4be4c962119 (diff) |
adjust demangling code a bit so that it can easily be used with typenames and not just functions in stacktraces
Diffstat (limited to 'libs/pbd')
-rw-r--r-- | libs/pbd/pbd/stacktrace.h | 1 | ||||
-rw-r--r-- | libs/pbd/stacktrace.cc | 42 |
2 files changed, 26 insertions, 17 deletions
diff --git a/libs/pbd/pbd/stacktrace.h b/libs/pbd/pbd/stacktrace.h index 94d07cab96..f3c7baf7d7 100644 --- a/libs/pbd/pbd/stacktrace.h +++ b/libs/pbd/pbd/stacktrace.h @@ -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 diff --git a/libs/pbd/stacktrace.cc b/libs/pbd/stacktrace.cc index ca614509a5..ead7e33e4b 100644 --- a/libs/pbd/stacktrace.cc +++ b/libs/pbd/stacktrace.cc @@ -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 |