Skip to content

Commit 6e48d44

Browse files
committed
[SILGen] NFC: Introduce intrinsics for construction and resumption of CheckedContinuation
1 parent b8fb94b commit 6e48d44

File tree

3 files changed

+95
-0
lines changed

3 files changed

+95
-0
lines changed

lib/SILGen/SILGen.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,37 @@ SILGenModule::getCheckExpectedExecutor() {
467467
"_checkExpectedExecutor");
468468
}
469469

470+
FuncDecl *
471+
SILGenModule::getCreateCheckedContinuation() {
472+
return lookupConcurrencyIntrinsic(getASTContext(),
473+
CreateCheckedContinuation,
474+
"_createCheckedContinuation");
475+
}
476+
FuncDecl *
477+
SILGenModule::getCreateCheckedThrowingContinuation() {
478+
return lookupConcurrencyIntrinsic(getASTContext(),
479+
CreateCheckedThrowingContinuation,
480+
"_createCheckedThrowingContinuation");
481+
}
482+
FuncDecl *
483+
SILGenModule::getResumeCheckedContinuation() {
484+
return lookupConcurrencyIntrinsic(getASTContext(),
485+
ResumeCheckedContinuation,
486+
"_resumeCheckedContinuation");
487+
}
488+
FuncDecl *
489+
SILGenModule::getResumeCheckedThrowingContinuation() {
490+
return lookupConcurrencyIntrinsic(getASTContext(),
491+
ResumeCheckedThrowingContinuation,
492+
"_resumeCheckedThrowingContinuation");
493+
}
494+
FuncDecl *
495+
SILGenModule::getResumeCheckedThrowingContinuationWithError() {
496+
return lookupConcurrencyIntrinsic(
497+
getASTContext(), ResumeCheckedThrowingContinuationWithError,
498+
"_resumeCheckedThrowingContinuationWithError");
499+
}
500+
470501
FuncDecl *SILGenModule::getAsyncMainDrainQueue() {
471502
return lookupConcurrencyIntrinsic(getASTContext(), AsyncMainDrainQueue,
472503
"_asyncMainDrainQueue");

lib/SILGen/SILGen.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,12 @@ class LLVM_LIBRARY_VISIBILITY SILGenModule : public ASTVisitor<SILGenModule> {
128128
llvm::Optional<FuncDecl *> ResumeUnsafeThrowingContinuationWithError;
129129
llvm::Optional<FuncDecl *> CheckExpectedExecutor;
130130

131+
llvm::Optional<FuncDecl*> CreateCheckedContinuation;
132+
llvm::Optional<FuncDecl*> CreateCheckedThrowingContinuation;
133+
llvm::Optional<FuncDecl*> ResumeCheckedContinuation;
134+
llvm::Optional<FuncDecl*> ResumeCheckedThrowingContinuation;
135+
llvm::Optional<FuncDecl*> ResumeCheckedThrowingContinuationWithError;
136+
131137
llvm::Optional<FuncDecl *> AsyncMainDrainQueue;
132138
llvm::Optional<FuncDecl *> GetMainExecutor;
133139
llvm::Optional<FuncDecl *> SwiftJobRun;
@@ -551,6 +557,17 @@ class LLVM_LIBRARY_VISIBILITY SILGenModule : public ASTVisitor<SILGenModule> {
551557
/// Retrieve the _Concurrency._checkExpectedExecutor intrinsic.
552558
FuncDecl *getCheckExpectedExecutor();
553559

560+
/// Retrieve the _Concurrency._createCheckedContinuation intrinsic.
561+
FuncDecl *getCreateCheckedContinuation();
562+
/// Retrieve the _Concurrency._createCheckedThrowingContinuation intrinsic.
563+
FuncDecl *getCreateCheckedThrowingContinuation();
564+
/// Retrieve the _Concurrency._resumeCheckedContinuation intrinsic.
565+
FuncDecl *getResumeCheckedContinuation();
566+
/// Retrieve the _Concurrency._resumeCheckedThrowingContinuation intrinsic.
567+
FuncDecl *getResumeCheckedThrowingContinuation();
568+
/// Retrieve the _Concurrency._resumeCheckedThrowingContinuationWithError intrinsic.
569+
FuncDecl *getResumeCheckedThrowingContinuationWithError();
570+
554571
/// Retrieve the _Concurrency._asyncMainDrainQueue intrinsic.
555572
FuncDecl *getAsyncMainDrainQueue();
556573
/// Retrieve the _Concurrency._getMainExecutor intrinsic.

stdlib/public/Concurrency/CheckedContinuation.swift

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,3 +330,50 @@ public func withCheckedThrowingContinuation<T>(
330330
}
331331
}
332332

333+
#if _runtime(_ObjC)
334+
335+
// Intrinsics used by SILGen to create, resume, or fail checked continuations.
336+
@available(SwiftStdlib 5.1, *)
337+
@_alwaysEmitIntoClient
338+
internal func _createCheckedContinuation<T>(
339+
_ continuation: __owned UnsafeContinuation<T, Never>
340+
) -> CheckedContinuation<T, Never> {
341+
return CheckedContinuation(continuation: continuation)
342+
}
343+
344+
@available(SwiftStdlib 5.1, *)
345+
@_alwaysEmitIntoClient
346+
internal func _createCheckedThrowingContinuation<T>(
347+
_ continuation: __owned UnsafeContinuation<T, Error>
348+
) -> CheckedContinuation<T, Error> {
349+
return CheckedContinuation(continuation: continuation)
350+
}
351+
352+
@available(SwiftStdlib 5.1, *)
353+
@_alwaysEmitIntoClient
354+
internal func _resumeCheckedContinuation<T>(
355+
_ continuation: CheckedContinuation<T, Never>,
356+
_ value: __owned T
357+
) {
358+
continuation.resume(returning: value)
359+
}
360+
361+
@available(SwiftStdlib 5.1, *)
362+
@_alwaysEmitIntoClient
363+
internal func _resumeCheckedThrowingContinuation<T>(
364+
_ continuation: CheckedContinuation<T, Error>,
365+
_ value: __owned T
366+
) {
367+
continuation.resume(returning: value)
368+
}
369+
370+
@available(SwiftStdlib 5.1, *)
371+
@_alwaysEmitIntoClient
372+
internal func _resumeCheckedThrowingContinuationWithError<T>(
373+
_ continuation: CheckedContinuation<T, Error>,
374+
_ error: __owned Error
375+
) {
376+
continuation.resume(throwing: error)
377+
}
378+
379+
#endif

0 commit comments

Comments
 (0)