typeinfo.cc revision 227825
1227825Stheraven#include "typeinfo.h" 2227825Stheraven#include <string.h> 3227825Stheraven#include <stdlib.h> 4227825Stheraven#include <stdio.h> 5227825Stheraven 6227825Stheravenusing std::type_info; 7227825Stheraven 8227825Stheraventype_info::~type_info() {} 9227825Stheraven 10227825Stheravenbool type_info::operator==(const type_info &other) const 11227825Stheraven{ 12227825Stheraven return __type_name == other.__type_name; 13227825Stheraven} 14227825Stheravenbool type_info::operator!=(const type_info &other) const 15227825Stheraven{ 16227825Stheraven return __type_name != other.__type_name; 17227825Stheraven} 18227825Stheravenbool type_info::before(const type_info &other) const 19227825Stheraven{ 20227825Stheraven return __type_name < other.__type_name; 21227825Stheraven} 22227825Stheravenconst char* type_info::name() const 23227825Stheraven{ 24227825Stheraven return __type_name; 25227825Stheraven} 26227825Stheraventype_info::type_info (const type_info& rhs) 27227825Stheraven{ 28227825Stheraven __type_name = rhs.__type_name; 29227825Stheraven} 30227825Stheraventype_info& type_info::operator= (const type_info& rhs) 31227825Stheraven{ 32227825Stheraven return *new type_info(rhs); 33227825Stheraven} 34227825Stheraven 35227825StheravenABI_NAMESPACE::__fundamental_type_info::~__fundamental_type_info() {} 36227825StheravenABI_NAMESPACE::__array_type_info::~__array_type_info() {} 37227825StheravenABI_NAMESPACE::__function_type_info::~__function_type_info() {} 38227825StheravenABI_NAMESPACE::__enum_type_info::~__enum_type_info() {} 39227825StheravenABI_NAMESPACE::__class_type_info::~__class_type_info() {} 40227825StheravenABI_NAMESPACE::__si_class_type_info::~__si_class_type_info() {} 41227825StheravenABI_NAMESPACE::__vmi_class_type_info::~__vmi_class_type_info() {} 42227825StheravenABI_NAMESPACE::__pbase_type_info::~__pbase_type_info() {} 43227825StheravenABI_NAMESPACE::__pointer_type_info::~__pointer_type_info() {} 44227825StheravenABI_NAMESPACE::__pointer_to_member_type_info::~__pointer_to_member_type_info() {} 45227825Stheraven 46227825Stheraven// From libelftc 47227825Stheravenextern "C" char *__cxa_demangle_gnu3(const char *); 48227825Stheraven 49227825Stheravenextern "C" char* __cxa_demangle(const char* mangled_name, 50227825Stheraven char* buf, 51227825Stheraven size_t* n, 52227825Stheraven int* status) 53227825Stheraven{ 54227825Stheraven // TODO: We should probably just be linking against libelf-tc, rather than 55227825Stheraven // copying their code. This requires them to do an actual release, 56227825Stheraven // however, and for our changes to be pushed upstream. We also need to 57227825Stheraven // call a different demangling function here depending on the ABI (e.g. 58227825Stheraven // ARM). 59227825Stheraven char *demangled = __cxa_demangle_gnu3(mangled_name); 60227825Stheraven if (NULL != demangled) 61227825Stheraven { 62227825Stheraven size_t len = strlen(demangled); 63227825Stheraven buf = (char*)realloc(buf, len+1); 64227825Stheraven if (0 != buf) 65227825Stheraven { 66227825Stheraven memcpy(buf, demangled, len); 67227825Stheraven buf[len] = 0; 68227825Stheraven *n = len; 69227825Stheraven *status = 0; 70227825Stheraven } 71227825Stheraven else 72227825Stheraven { 73227825Stheraven *status = -1; 74227825Stheraven } 75227825Stheraven free(demangled); 76227825Stheraven } 77227825Stheraven else 78227825Stheraven { 79227825Stheraven *status = -2; 80227825Stheraven return NULL; 81227825Stheraven } 82227825Stheraven return buf; 83227825Stheraven} 84