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:
parent
1609eb1f7a
commit
c78a98cc9c
1 changed files with 9 additions and 11 deletions
|
|
@ -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 {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue