demangle.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "crucible/core/demangle.hpp" #include <cstdlib> #include <cxxabi.h> namespace crucible { auto demangle(ffi_string<char> const &mangled_symbol) -> demangle_result<ffi_string<char>> { #if CRUCIBLE_PLATFORM_HAS_CXA_DEMANGLE char *demangled_symbol_data { nullptr }; std::size_t demangled_symbol_size { 0 }; int demangled_symbol_status { 0 }; demangled_symbol_data = abi::__cxa_demangle(mangled_symbol.data(), nullptr, &demangled_symbol_size, &demangled_symbol_status); ffi_string<char> demangled_symbol; if (demangled_symbol_data) { demangled_symbol = make_ffi_string(demangled_symbol_data, demangled_symbol_size); std::free(demangled_symbol_data); } if (demangled_symbol_status == 0) { return make_success<ffi_string<char>>(demangled_symbol.data(), demangled_symbol.size()); } if (demangled_symbol_status == -1) { return make_failure<demangle_error>(insufficient_demangle_memory {}); } if (demangled_symbol_status == -2) { return make_success(mangled_symbol); } if (demangled_symbol_status == -3) { return make_failure<demangle_error>(invalid_demangle_arguments {}); } return make_failure<demangle_error>(unknown_demangle_error {}); #else // CRUCIBLE_PLATFORM_HAS_CXA_DEMANGLE return make_success(mangled_symbol); #endif // CRUCIBLE_PLATFORM_HAS_CXA_DEMANGLE } }