22#ifndef Rcpp__exceptions_impl__h
23#define Rcpp__exceptions_impl__h
27#ifndef RCPP_DEMANGLER_ENABLED
29#define RCPP_DEMANGLER_ENABLED 0
30# if defined(_WIN32) || \
31 defined(__FreeBSD__) || \
32 defined(__NetBSD__) || \
33 defined(__OpenBSD__) || \
34 defined(__DragonFly__) || \
35 defined(__CYGWIN__) || \
38 defined(__MUSL__) || \
39 defined(__HAIKU__) || \
42# undef RCPP_DEMANGLER_ENABLED
43# define RCPP_DEMANGLER_ENABLED 0
44# elif defined __has_include
46# if __has_include (<execinfo.h>)
49# undef RCPP_DEMANGLER_ENABLED
50# define RCPP_DEMANGLER_ENABLED 1
58#if RCPP_DEMANGLER_ENABLED
59 static inline std::string demangler_one(
const char* input) {
61 static std::string buffer;
64 size_t last_open = buffer.find_last_of(
'(');
65 size_t last_close = buffer.find_last_of(
')');
66 if (last_open == std::string::npos ||
67 last_close == std::string::npos) {
70 std::string function_name = buffer.substr(last_open + 1, last_close - last_open - 1);
72 size_t function_plus = function_name.find_last_of(
'+');
73 if (function_plus != std::string::npos) {
74 function_name.resize(function_plus);
76 buffer.replace(last_open + 1, function_name.size(),
demangle(function_name));
86#if RCPP_DEMANGLER_ENABLED
88 const size_t max_depth = 100;
90 void *stack_addrs[max_depth];
92 stack_depth = backtrace(stack_addrs, max_depth);
93 char **stack_strings = backtrace_symbols(stack_addrs, stack_depth);
95 std::transform(stack_strings + 1, stack_strings + stack_depth,
96 std::back_inserter(
stack), demangler_one);
114 trace.
attr(
"class") =
"Rcpp_stack_trace";
AttributeProxy attr(const std::string &name)
std::vector< std::string > stack
void copy_stack_trace_to_r() const
void record_stack_trace()
std::string demangle(const std::string &name)
Vector< STRSXP > CharacterVector
static internal::NamedPlaceHolder _
attribute_hidden SEXP rcpp_set_stack_trace(SEXP e)