[Lldb-commits] [lldb] [lldb] Introduce ScriptedFrame (PR #149622)
via lldb-commits
lldb-commits at lists.llvm.org
Thu Jul 31 11:32:12 PDT 2025
================
@@ -204,9 +209,64 @@ bool ScriptedThread::LoadArtificialStackFrames() {
SymbolContext sc;
symbol_addr.CalculateSymbolContext(&sc);
- StackFrameSP synth_frame_sp = std::make_shared<StackFrame>(
+ return std::make_shared<StackFrame>(
this->shared_from_this(), idx, idx, cfa, cfa_is_valid, pc,
StackFrame::Kind::Artificial, behaves_like_zeroth_frame, &sc);
+ };
+
+ auto create_frame_from_script_object =
+ [this, arr_sp](size_t idx) -> llvm::Expected<StackFrameSP> {
+ Status error;
+ StructuredData::ObjectSP object_sp = arr_sp->GetItemAtIndex(idx);
+ if (!object_sp || !object_sp->GetAsGeneric()) {
+ ScriptedInterface::ErrorWithMessage<bool>(
+ LLVM_PRETTY_FUNCTION,
+ llvm::Twine("Couldn't get artificial stackframe object at index (" +
+ llvm::Twine(idx) +
+ llvm::Twine(") from stackframe array."))
+ .str(),
+ error, LLDBLog::Thread);
+ return error.ToError();
+ }
+
+ auto frame_or_error =
+ ScriptedFrame::Create(*this, nullptr, object_sp->GetAsGeneric());
+
+ if (!frame_or_error) {
+ ScriptedInterface::ErrorWithMessage<bool>(
+ LLVM_PRETTY_FUNCTION, toString(frame_or_error.takeError()), error);
+ return error.ToError();
+ }
+
+ StackFrameSP frame_sp = frame_or_error.get();
+ lldbassert(frame_sp && "Couldn't initialize scripted frame.");
+
+ return frame_sp;
+ };
+
+ StackFrameListSP frames = GetStackFrameList();
+
+ for (size_t idx = 0; idx < arr_size; idx++) {
+ StackFrameSP synth_frame_sp = nullptr;
+
+ auto frame_from_dict_or_err = create_frame_from_dict(idx);
----------------
jimingham wrote:
This doesn't seem right. There are two reasons create_frame_from_dict could fail:
1) Because the frame isn't described by a dictionary but by a script object
2) Because the dict existed but was incorrect
In case 1) you do want to try the scripted object instead, but not if there was a dictionary but it failed. Falling back to the script object and obscuring the fact that there was a bogus dictionary will be confusing.
https://github.com/llvm/llvm-project/pull/149622
More information about the lldb-commits
mailing list