Remove the custom demangle function and use GCC's abi::__cxa_demangle instead
authorMikko Rasa <tdb@tdb.fi>
Mon, 17 Sep 2007 10:51:07 +0000 (10:51 +0000)
committerMikko Rasa <tdb@tdb.fi>
Mon, 17 Sep 2007 10:51:07 +0000 (10:51 +0000)
Demangle uncaught exception type
Return a special error code on uncaught exception
Use vector instead of list or GetOpt::get_args()

source/core/application.cpp
source/core/getopt.h
source/debug/demangle.cpp
source/debug/demangle.h

index 0e0b69f28af4aa9686ff4e30fb593f8ea58ea635..a49802350f2f7d655125d8ab0480d9e41370c72a 100644 (file)
@@ -6,6 +6,7 @@ Distributed under the LGPL
 */
 #include <signal.h>
 #include <iostream>
+#include "../debug/demangle.h"
 #include "../time/units.h"
 #include "../time/utils.h"
 #include "application.h"
@@ -57,10 +58,10 @@ int Application::run(int argc, char **argv)
        catch(const exception &e)
        {
                cerr<<"An uncaught exception occurred.\n";
-               cerr<<"  type:   "<<typeid(e).name()<<'\n';
+               cerr<<"  type:   "<<Debug::demangle(typeid(e).name())<<'\n';
                cerr<<"  what(): "<<e.what()<<'\n';
                delete app_;
-               terminate();
+               return 124;
        }
 }
 
index 2824a0b7c7f3b79378477853fa8874300a98eb75..3315108f05d34939d6d8d609fae973c915252296 100644 (file)
@@ -7,9 +7,9 @@ Distributed under the LGPL
 #ifndef MSP_CORE_GETOPT_H_
 #define MSP_CORE_GETOPT_H_
 
-#include <list>
 #include <sstream>
 #include <string>
+#include <vector>
 #include "error.h"
 
 namespace Msp {
@@ -46,7 +46,7 @@ public:
                OptBase(char s, const std::string &l, ArgType a): shrt(s), lng(l), arg_type(a), seen_count(0) { }
        };
 
-       const std::list<std::string> &get_args() const { return args; }
+       const std::vector<std::string> &get_args() const { return args; }
 
        template<typename T>
        OptBase &add_option(char s, const std::string &l, T &d, ArgType a=NO_ARG)
@@ -128,7 +128,7 @@ private:
        };
 
        std::list<OptBase *>   opts;
-       std::list<std::string> args;
+       std::vector<std::string> args;
 
        OptBase &get_option(char);
        OptBase &get_option(const std::string &);
index bb59bd72f1d1acabd2b9e69c45050dcd9a3f0d72..460410e49569f501ed4792929650c62068cdf243 100644 (file)
@@ -4,6 +4,8 @@ This file is part of libmspcore
 Copyright © 2007 Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
+
+#include <cxxabi.h>
 #include "demangle.h"
 
 using namespace std;
@@ -11,41 +13,17 @@ using namespace std;
 namespace Msp {
 namespace Debug {
 
-string demangle_gcc3(const string &sym)
+string demangle(const string &sym)
 {
-       string result;
-
-       if(sym.compare(0, 2, "_Z"))
-               return result;
-
-       string::const_iterator i=sym.begin()+2;
-
-       bool nested=(*i=='N');
-       bool first=true;
-       while(first || (nested && *i!='E'))
-       {
-               unsigned len=0;
-               for(; isdigit(*i); ++i)
-                       len=len*10+(*i-'0');
-               string::const_iterator j=i+len;
-
-               if(!first)
-                       result.append("::");
-               result.append(i, j);
-
-               first=false;
-       }
-
-       if(nested)
-               ++i;
-
-       for(; i!=sym.end(); ++i)
-       {
-               bool ref=(*i=='R');
-               if(ref) ++i;
-       }
-
+#ifdef __GNUC__
+       int status;
+       char *dm=abi::__cxa_demangle(sym.c_str(), 0, 0, &status);
+       string result(dm);
+       free(dm);
        return result;
+#else
+       return sym;
+#endif
 }
 
 } // namespace Debug
index f8cab96c0d9f118a8d71747fa71dc98a18556864..cf2dca2ce31960816e0133bf3a8deb222a622b5e 100644 (file)
@@ -12,7 +12,7 @@ Distributed under the LGPL
 namespace Msp {
 namespace Debug {
 
-std::string demangle_gcc3(const std::string &);
+std::string demangle(const std::string &);
 
 } // namespace Debug
 } // namespace Msp