AK: Remove error passthrough from StackUnwinder

This isn't useful in Ladybird, we don't want to worry about fallible
allocations.
This commit is contained in:
Zaggy1024
2026-03-02 13:46:13 -06:00
committed by Gregory Bertilson
parent 1609eb1f7a
commit c78a98cc9c
Notes: github-actions[bot] 2026-03-03 17:28:14 +00:00

View File

@@ -19,7 +19,7 @@ struct StackFrame {
// This function only returns errors if on_stack_frame returns an error.
// It doesn't return an error on failed memory reads, since the last frame record sometimes contains invalid addresses when using frame pointer-based unwinding.
ErrorOr<void> unwind_stack_from_frame_pointer(FlatPtr frame_pointer, CallableAs<ErrorOr<FlatPtr>, FlatPtr> auto read_memory, CallableAs<ErrorOr<IterationDecision>, StackFrame> auto on_stack_frame)
void unwind_stack_from_frame_pointer(FlatPtr frame_pointer, CallableAs<Optional<FlatPtr>, FlatPtr> auto read_memory, CallableAs<IterationDecision, StackFrame> auto on_stack_frame)
{
// aarch64/x86_64 frame record layout:
// fp/rbp+8: return address
@@ -36,7 +36,7 @@ ErrorOr<void> unwind_stack_from_frame_pointer(FlatPtr frame_pointer, CallableAs<
static constexpr ptrdiff_t FRAME_POINTER_RETURN_ADDRESS_OFFSET = -8;
static constexpr ptrdiff_t FRAME_POINTER_PREVIOUS_FRAME_POINTER_OFFSET = -16;
#else
# error Unknown architecture
return;
#endif
FlatPtr current_frame_pointer = frame_pointer;
@@ -45,25 +45,23 @@ ErrorOr<void> unwind_stack_from_frame_pointer(FlatPtr frame_pointer, CallableAs<
StackFrame stack_frame;
auto maybe_return_address = read_memory(current_frame_pointer + FRAME_POINTER_RETURN_ADDRESS_OFFSET);
if (maybe_return_address.is_error())
return {};
if (!maybe_return_address.has_value())
return;
stack_frame.return_address = maybe_return_address.value();
if (stack_frame.return_address == 0)
return {};
return;
auto maybe_previous_frame_pointer = read_memory(current_frame_pointer + FRAME_POINTER_PREVIOUS_FRAME_POINTER_OFFSET);
if (maybe_previous_frame_pointer.is_error())
return {};
if (!maybe_previous_frame_pointer.has_value())
return;
stack_frame.previous_frame_pointer = maybe_previous_frame_pointer.value();
if (TRY(on_stack_frame(stack_frame)) == IterationDecision::Break)
return {};
if (on_stack_frame(stack_frame) == IterationDecision::Break)
return;
current_frame_pointer = maybe_previous_frame_pointer.value();
}
return {};
}
}