Skip to content

Commit 19d9e0f

Browse files
committed
[Concurrency] Clarify/fix error object handling in futures.
1 parent 5538aaf commit 19d9e0f

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

include/swift/ABI/Task.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ class AsyncContext;
3131
class Executor;
3232
class Job;
3333
struct OpaqueValue;
34+
struct SwiftError;
3435
class TaskStatusRecord;
3536

3637
/// An ExecutorRef isn't necessarily just a pointer to an executor
@@ -323,6 +324,12 @@ class AsyncTask : public HeapObject, public Job {
323324
reinterpret_cast<char *>(this) + storageOffset(resultType));
324325
}
325326

327+
/// Retrieve the error.
328+
SwiftError *&getError() {
329+
return *reinterpret_cast<SwiftError **>(
330+
reinterpret_cast<char *>(this) + storageOffset(resultType));
331+
}
332+
326333
/// Compute the offset of the storage from the base of the future
327334
/// fragment.
328335
static size_t storageOffset(const Metadata *resultType) {

stdlib/public/Concurrency/Task.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ void FutureFragment::destroy() {
3434
break;
3535

3636
case Status::Error:
37-
swift_unknownObjectRelease(getStoragePtr());
37+
swift_unknownObjectRelease(reinterpret_cast<OpaqueValue *>(getError()));
3838
break;
3939
}
4040
}
@@ -300,8 +300,7 @@ swift::swift_task_future_wait(AsyncTask *task, AsyncTask *waitingTask) {
300300
case FutureFragment::Status::Error:
301301
return TaskFutureWaitResult{
302302
TaskFutureWaitResult::Error,
303-
*reinterpret_cast<OpaqueValue **>(
304-
task->futureFragment()->getStoragePtr())};
303+
reinterpret_cast<OpaqueValue *>(task->futureFragment()->getError())};
305304
}
306305
}
307306

0 commit comments

Comments
 (0)