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

View file

@ -19,7 +19,7 @@ struct StackFrame {
// This function only returns errors if on_stack_frame returns an error. // 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. // 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: // aarch64/x86_64 frame record layout:
// fp/rbp+8: return address // 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_RETURN_ADDRESS_OFFSET = -8;
static constexpr ptrdiff_t FRAME_POINTER_PREVIOUS_FRAME_POINTER_OFFSET = -16; static constexpr ptrdiff_t FRAME_POINTER_PREVIOUS_FRAME_POINTER_OFFSET = -16;
#else #else
# error Unknown architecture return;
#endif #endif
FlatPtr current_frame_pointer = frame_pointer; FlatPtr current_frame_pointer = frame_pointer;
@ -45,25 +45,23 @@ ErrorOr<void> unwind_stack_from_frame_pointer(FlatPtr frame_pointer, CallableAs<
StackFrame stack_frame; StackFrame stack_frame;
auto maybe_return_address = read_memory(current_frame_pointer + FRAME_POINTER_RETURN_ADDRESS_OFFSET); auto maybe_return_address = read_memory(current_frame_pointer + FRAME_POINTER_RETURN_ADDRESS_OFFSET);
if (maybe_return_address.is_error()) if (!maybe_return_address.has_value())
return {}; return;
stack_frame.return_address = maybe_return_address.value(); stack_frame.return_address = maybe_return_address.value();
if (stack_frame.return_address == 0) if (stack_frame.return_address == 0)
return {}; return;
auto maybe_previous_frame_pointer = read_memory(current_frame_pointer + FRAME_POINTER_PREVIOUS_FRAME_POINTER_OFFSET); auto maybe_previous_frame_pointer = read_memory(current_frame_pointer + FRAME_POINTER_PREVIOUS_FRAME_POINTER_OFFSET);
if (maybe_previous_frame_pointer.is_error()) if (!maybe_previous_frame_pointer.has_value())
return {}; return;
stack_frame.previous_frame_pointer = maybe_previous_frame_pointer.value(); stack_frame.previous_frame_pointer = maybe_previous_frame_pointer.value();
if (TRY(on_stack_frame(stack_frame)) == IterationDecision::Break) if (on_stack_frame(stack_frame) == IterationDecision::Break)
return {}; return;
current_frame_pointer = maybe_previous_frame_pointer.value(); current_frame_pointer = maybe_previous_frame_pointer.value();
} }
return {};
} }
} }