X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=folly%2FString.h;h=da93cd265d106a296e60a651aad59cd1cfb16bfd;hb=cb5272724fbe18e937bbe8bb8a0a279027255032;hp=d706a03215b2f3b121fe9d2a664c4eaba618d3c9;hpb=de064c41969e21fe5fc0ee96cd7496aa999a8701;p=folly.git diff --git a/folly/String.h b/folly/String.h index d706a032..da93cd26 100644 --- a/folly/String.h +++ b/folly/String.h @@ -322,13 +322,36 @@ fbstring errnoStr(int err); * * Use for debugging -- do not rely on demangle() returning anything useful. * - * This function may allocate memory (and therefore throw). + * This function may allocate memory (and therefore throw std::bad_alloc). */ fbstring demangle(const char* name); inline fbstring demangle(const std::type_info& type) { return demangle(type.name()); } +/** + * Return the demangled (prettyfied) version of a C++ type in a user-provided + * buffer. + * + * The semantics are the same as for snprintf or strlcpy: bufSize is the size + * of the buffer, the string is always null-terminated, and the return value is + * the number of characters (not including the null terminator) that would have + * been written if the buffer was big enough. (So a return value >= bufSize + * indicates that the output was truncated) + * + * This function does not allocate memory and is async-signal-safe. + * + * Note that the underlying function for the fbstring-returning demangle is + * somewhat standard (abi::__cxa_demangle, which uses malloc), the underlying + * function for this version is less so (cplus_demangle_v3_callback from + * libiberty), so it is possible for the fbstring version to work, while this + * version returns the original, mangled name. + */ +size_t demangle(const char* name, char* buf, size_t bufSize); +inline size_t demangle(const std::type_info& type, char* buf, size_t bufSize) { + return demangle(type.name(), buf, bufSize); +} + /** * Debug string for an exception: include type and what(). */