Skip to content

Commit 89adb9b

Browse files
authored
[lldb] Fail when running task select or backtrace with a completed task (#10325)
A task that has completed has no backtrace, and makes no sense to select. rdar://147601734
1 parent 16753ee commit 89adb9b

File tree

2 files changed

+23
-10
lines changed

2 files changed

+23
-10
lines changed

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.cpp

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2161,10 +2161,10 @@ class CommandObjectSwift_RefCount : public CommandObjectRaw {
21612161
}
21622162
};
21632163

2164-
/// Construct a `ThreadTask` instance for a Task variable contained in the first
2165-
/// argument.
2164+
/// Construct a `ThreadTask` instance for a live (yet to be completed) Task
2165+
/// variable contained in the first argument.
21662166
static llvm::Expected<ThreadSP>
2167-
ThreadForTaskArgument(Args &command, ExecutionContext &exe_ctx) {
2167+
ThreadForLiveTaskArgument(Args &command, ExecutionContext &exe_ctx) {
21682168
if (!exe_ctx.GetFramePtr())
21692169
return llvm::createStringError("no active frame selected");
21702170

@@ -2196,12 +2196,15 @@ ThreadForTaskArgument(Args &command, ExecutionContext &exe_ctx) {
21962196

21972197
if (auto *runtime = SwiftLanguageRuntime::Get(exe_ctx.GetProcessSP()))
21982198
if (auto reflection_ctx = runtime->GetReflectionContext()) {
2199-
if (auto task_info = reflection_ctx->asyncTaskInfo(task_ptr))
2200-
return std::make_shared<ThreadTask>(task_info->id,
2201-
task_info->resumeAsyncContext,
2202-
task_info->runJob, exe_ctx);
2203-
else
2199+
auto task_info = reflection_ctx->asyncTaskInfo(task_ptr);
2200+
if (!task_info)
22042201
return task_info.takeError();
2202+
if (task_info->isComplete)
2203+
return llvm::createStringError("task has completed");
2204+
2205+
return std::make_shared<ThreadTask>(task_info->id,
2206+
task_info->resumeAsyncContext,
2207+
task_info->runJob, exe_ctx);
22052208
}
22062209

22072210
return llvm::createStringError("failed to access Task data from runtime");
@@ -2230,7 +2233,7 @@ class CommandObjectLanguageSwiftTaskBacktrace final
22302233
}
22312234

22322235
llvm::Expected<ThreadSP> thread_task =
2233-
ThreadForTaskArgument(command, m_exe_ctx);
2236+
ThreadForLiveTaskArgument(command, m_exe_ctx);
22342237
if (auto error = thread_task.takeError()) {
22352238
result.AppendError(toString(std::move(error)));
22362239
return;
@@ -2265,7 +2268,7 @@ class CommandObjectLanguageSwiftTaskSelect final : public CommandObjectParsed {
22652268
}
22662269

22672270
llvm::Expected<ThreadSP> thread_task =
2268-
ThreadForTaskArgument(command, m_exe_ctx);
2271+
ThreadForLiveTaskArgument(command, m_exe_ctx);
22692272
if (auto error = thread_task.takeError()) {
22702273
result.AppendError(toString(std::move(error)));
22712274
return;

lldb/test/API/lang/swift/async/formatters/task/complete/TestSwiftTaskComplete.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,13 @@ def test(self):
1414
self, "break here", lldb.SBFileSpec("main.swift")
1515
)
1616
self.expect("v task", substrs=["flags:complete"])
17+
self.expect(
18+
"language swift task backtrace task",
19+
error=True,
20+
substrs=["task has completed"],
21+
)
22+
self.expect(
23+
"language swift task select task",
24+
error=True,
25+
substrs=["task has completed"],
26+
)

0 commit comments

Comments
 (0)