Refactor and rewrite a number of dwarf handling methods (#47)

Discard old implementations in favor of new implementations that are
safer and cleaner
This commit is contained in:
Jeremy Rifkin 2023-09-24 03:25:23 -04:00 committed by GitHub
parent 183cdf5a1c
commit c94b03ae6e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 270 additions and 583 deletions

View File

@ -122,8 +122,18 @@ namespace detail {
##__VA_ARGS__) \
)
// Workaround a compiler warning
template<typename T>
std::string as_string(T&& value) {
return std::string(std::forward<T>(value));
}
inline std::string as_string() {
return "";
}
// Check condition in both debug and release. std::runtime_error on failure.
#define PANIC(...) ((::cpptrace::detail::panic)(CPPTRACE_PFUNC, {}, std::string(__VA_ARGS__)))
#define PANIC(...) ((::cpptrace::detail::panic)(CPPTRACE_PFUNC, {}, ::cpptrace::detail::as_string(__VA_ARGS__)))
#ifndef NDEBUG
// Check condition in both debug. std::runtime_error on failure.

View File

@ -349,13 +349,17 @@ namespace detail {
typename std::enable_if<
std::is_same<decltype(std::declval<D>()(std::declval<T>())), void>::value,
int
>::type = 0,
typename std::enable_if<
std::is_standard_layout<T>::value && std::is_trivial<T>::value,
int
>::type = 0
>
class raii_wrapper {
T obj;
optional<D> deleter;
public:
raii_wrapper(T&& obj, D deleter) : obj(std::move(obj)), deleter(deleter) {}
raii_wrapper(T obj, D deleter) : obj(obj), deleter(deleter) {}
raii_wrapper(raii_wrapper&& other) : obj(std::move(other.obj)), deleter(other.deleter) {
other.deleter = nullopt;
}
@ -373,6 +377,12 @@ namespace detail {
operator const T&() const {
return obj;
}
T& get() {
return obj;
}
const T& get() const {
return obj;
}
};
template<
@ -381,10 +391,14 @@ namespace detail {
typename std::enable_if<
std::is_same<decltype(std::declval<D>()(std::declval<T>())), void>::value,
int
>::type = 0,
typename std::enable_if<
std::is_standard_layout<T>::value && std::is_trivial<T>::value,
int
>::type = 0
>
raii_wrapper<T, D> raii_wrap(T&& obj, D deleter) {
return raii_wrapper<T, D>(std::move(obj), deleter);
raii_wrapper<typename std::remove_reference<T>::type, D> raii_wrap(T obj, D deleter) {
return raii_wrapper<typename std::remove_reference<T>::type, D>(obj, deleter);
}
inline void file_deleter(FILE* ptr) {

File diff suppressed because it is too large Load Diff