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