From f11e119d32dabe3fbbe83194c0bbf191edb84f8b Mon Sep 17 00:00:00 2001 From: Jeremy <51220084+jeremy-rifkin@users.noreply.github.com> Date: Sun, 3 Mar 2024 10:54:23 -0600 Subject: [PATCH] Refactor stacktrace conversion code --- src/ctrace.cpp | 54 +++++++++++++++++++++++++++----------------------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/src/ctrace.cpp b/src/ctrace.cpp index d60a97e..d64ee9d 100644 --- a/src/ctrace.cpp +++ b/src/ctrace.cpp @@ -100,24 +100,39 @@ CTRACE_FORMAT_EPILOGUE return { frames, count }; } + static ctrace_stacktrace_frame convert_stacktrace_frame(const cpptrace::stacktrace_frame& frame) { + ctrace_stacktrace_frame new_frame; + new_frame.raw_address = frame.raw_address; + new_frame.object_address = frame.object_address; + new_frame.line = frame.line.value_or(invalid_pos); + new_frame.column = frame.column.value_or(invalid_pos); + new_frame.filename = generate_owning_string(frame.filename).data; + new_frame.symbol = generate_owning_string(cpptrace::detail::demangle(frame.symbol)).data; + new_frame.is_inline = ctrace_bool(frame.is_inline); + return new_frame; + } + + static cpptrace::stacktrace_frame convert_stacktrace_frame(const ctrace_stacktrace_frame& frame) { + using nullable_type = cpptrace::nullable; + static constexpr auto null_v = nullable_type::null().raw_value; + cpptrace::stacktrace_frame new_frame; + new_frame.raw_address = frame.raw_address; + new_frame.object_address = frame.object_address; + new_frame.line = nullable_type{is_empty(frame.line) ? null_v : frame.line}; + new_frame.column = nullable_type{is_empty(frame.column) ? null_v : frame.column}; + new_frame.filename = frame.filename; + new_frame.symbol = frame.symbol; + new_frame.is_inline = bool(frame.is_inline); + return new_frame; + } + static ctrace_stacktrace c_convert(const std::vector& trace) { std::size_t count = trace.size(); auto* frames = new ctrace_stacktrace_frame[count]; std::transform( trace.begin(), - trace.end(), - frames, - [] (const cpptrace::stacktrace_frame& frame) -> ctrace_stacktrace_frame { - ctrace_stacktrace_frame new_frame; - new_frame.raw_address = frame.raw_address; - new_frame.object_address = frame.object_address; - new_frame.line = frame.line.value_or(invalid_pos); - new_frame.column = frame.column.value_or(invalid_pos); - new_frame.filename = generate_owning_string(frame.filename).data; - new_frame.symbol = generate_owning_string(cpptrace::detail::demangle(frame.symbol)).data; - new_frame.is_inline = ctrace_bool(frame.is_inline); - return new_frame; - } + trace.end(), frames, + static_cast(convert_stacktrace_frame) ); return { frames, count }; } @@ -129,18 +144,7 @@ CTRACE_FORMAT_EPILOGUE std::vector new_frames; new_frames.reserve(ptrace->count); for(std::size_t i = 0; i < ptrace->count; ++i) { - using nullable_type = cpptrace::nullable; - static constexpr auto null_v = nullable_type::null().raw_value; - const ctrace_stacktrace_frame& old_frame = ptrace->frames[i]; - cpptrace::stacktrace_frame new_frame; - new_frame.raw_address = old_frame.raw_address; - new_frame.object_address = old_frame.object_address; - new_frame.line = nullable_type{is_empty(old_frame.line) ? null_v : old_frame.line}; - new_frame.column = nullable_type{is_empty(old_frame.column) ? null_v : old_frame.column}; - new_frame.filename = old_frame.filename; - new_frame.symbol = old_frame.symbol; - new_frame.is_inline = bool(old_frame.is_inline); - new_frames.push_back(std::move(new_frame)); + new_frames.push_back(convert_stacktrace_frame(ptrace->frames[i])); } return cpptrace::stacktrace{std::move(new_frames)}; }