Skip to content

Commit 091368b

Browse files
committed
[CoroutineAccessors] Added read.
The name is a placeholder for the mutating single-yield coroutine accessor.
1 parent 98a2e6a commit 091368b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+503
-20
lines changed

docs/ABI/Mangling.rst

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -387,12 +387,13 @@ Entities
387387
ACCESSOR ::= 'G' // global getter
388388
ACCESSOR ::= 'w' // willSet
389389
ACCESSOR ::= 'W' // didSet
390-
ACCESSOR ::= 'r' // read
390+
ACCESSOR ::= 'r' // _read
391391
ACCESSOR ::= 'M' // _modify (temporary)
392392
ACCESSOR ::= 'a' ADDRESSOR-KIND // mutable addressor
393393
ACCESSOR ::= 'l' ADDRESSOR-KIND // non-mutable addressor
394394
ACCESSOR ::= 'p' // pseudo accessor referring to the storage itself
395395
ACCESSOR ::= 'x' // modify
396+
ACCESSOR ::= 'y' // read
396397

397398
ADDRESSOR-KIND ::= 'u' // unsafe addressor (no owner)
398399
ADDRESSOR-KIND ::= 'O' // owning addressor (non-native owner), not used anymore

include/swift/ABI/MetadataValues.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -372,6 +372,7 @@ class MethodDescriptorFlags {
372372
Setter,
373373
ModifyCoroutine,
374374
ReadCoroutine,
375+
Read2Coroutine,
375376
Modify2Coroutine,
376377
};
377378

@@ -595,6 +596,7 @@ class ProtocolRequirementFlags {
595596
ModifyCoroutine,
596597
AssociatedTypeAccessFunction,
597598
AssociatedConformanceAccessFunction,
599+
Read2Coroutine,
598600
Modify2Coroutine,
599601
};
600602

include/swift/AST/AccessorKinds.def

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,14 @@ OBJC_ACCESSOR(Set, set)
153153
/// one can always be synthesized (even if the storage type is move-only).
154154
COROUTINE_ACCESSOR(Read, _read)
155155

156+
/// This is a read accessor: a yield-once coroutine which is called when a
157+
/// value is loaded from the storage, like a getter, but which works
158+
/// by yielding a borrowed value of the storage type.
159+
///
160+
/// If the storage is not implemented with a read accessor then
161+
/// one can always be synthesized (even if the storage type is move-only).
162+
EXPERIMENTAL_COROUTINE_ACCESSOR(Read2, read, CoroutineAccessors)
163+
156164
/// This is a modify accessor: a yield-once coroutine which is called when a
157165
/// the storage is modified which works by yielding an inout value
158166
/// of the storage type.

include/swift/AST/StorageImpl.h

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ enum class AccessorKind {
5959

6060
inline bool requiresFeatureCoroutineAccessors(AccessorKind kind) {
6161
switch (kind) {
62+
case AccessorKind::Read2:
6263
case AccessorKind::Modify2:
6364
return true;
6465
case AccessorKind::Get:
@@ -78,6 +79,7 @@ inline bool requiresFeatureCoroutineAccessors(AccessorKind kind) {
7879
inline bool isYieldingAccessor(AccessorKind kind) {
7980
switch (kind) {
8081
case AccessorKind::Read:
82+
case AccessorKind::Read2:
8183
case AccessorKind::Modify:
8284
case AccessorKind::Modify2:
8385
return true;
@@ -96,6 +98,7 @@ inline bool isYieldingAccessor(AccessorKind kind) {
9698
inline bool isYieldingDefaultNonmutatingAccessor(AccessorKind kind) {
9799
switch (kind) {
98100
case AccessorKind::Read:
101+
case AccessorKind::Read2:
99102
return true;
100103
case AccessorKind::Get:
101104
case AccessorKind::DistributedGet:
@@ -120,6 +123,7 @@ inline bool isYieldingDefaultMutatingAccessor(AccessorKind kind) {
120123
case AccessorKind::DistributedGet:
121124
case AccessorKind::Set:
122125
case AccessorKind::Read:
126+
case AccessorKind::Read2:
123127
case AccessorKind::WillSet:
124128
case AccessorKind::DidSet:
125129
case AccessorKind::Address:
@@ -278,8 +282,11 @@ enum class ReadImplKind {
278282
/// There's an immutable addressor.
279283
Address,
280284

281-
/// There's a read coroutine.
285+
/// There's a _read coroutine.
282286
Read,
287+
288+
/// There's a read coroutine.
289+
Read2,
283290
};
284291
enum { NumReadImplKindBits = 4 };
285292

@@ -392,29 +399,30 @@ class StorageImplInfo {
392399
case WriteImplKind::Set:
393400
assert(readImpl == ReadImplKind::Get ||
394401
readImpl == ReadImplKind::Address ||
395-
readImpl == ReadImplKind::Read);
402+
readImpl == ReadImplKind::Read || readImpl == ReadImplKind::Read2);
396403
assert(readWriteImpl == ReadWriteImplKind::MaterializeToTemporary ||
397-
readWriteImpl == ReadWriteImplKind::Modify);
404+
readWriteImpl == ReadWriteImplKind::Modify ||
405+
readWriteImpl == ReadWriteImplKind::Modify2);
398406
return;
399407

400408
case WriteImplKind::Modify:
401409
assert(readImpl == ReadImplKind::Get ||
402410
readImpl == ReadImplKind::Address ||
403-
readImpl == ReadImplKind::Read);
411+
readImpl == ReadImplKind::Read || readImpl == ReadImplKind::Read2);
404412
assert(readWriteImpl == ReadWriteImplKind::Modify);
405413
return;
406414

407415
case WriteImplKind::Modify2:
408416
assert(readImpl == ReadImplKind::Get ||
409417
readImpl == ReadImplKind::Address ||
410-
readImpl == ReadImplKind::Read);
418+
readImpl == ReadImplKind::Read || readImpl == ReadImplKind::Read2);
411419
assert(readWriteImpl == ReadWriteImplKind::Modify2);
412420
return;
413421

414422
case WriteImplKind::MutableAddress:
415423
assert(readImpl == ReadImplKind::Get ||
416424
readImpl == ReadImplKind::Address ||
417-
readImpl == ReadImplKind::Read);
425+
readImpl == ReadImplKind::Read || readImpl == ReadImplKind::Read2);
418426
assert(readWriteImpl == ReadWriteImplKind::MutableAddress);
419427
return;
420428
}
@@ -434,12 +442,13 @@ class StorageImplInfo {
434442
OpaqueReadOwnership ownership,
435443
const ASTContext &ctx) {
436444
return (isMutable ? getMutableOpaque(ownership, ctx)
437-
: getImmutableOpaque(ownership));
445+
: getImmutableOpaque(ownership, ctx));
438446
}
439447

440448
/// Describe the implementation of a immutable property implemented opaquely.
441-
static StorageImplInfo getImmutableOpaque(OpaqueReadOwnership ownership) {
442-
return { getOpaqueReadImpl(ownership) };
449+
static StorageImplInfo getImmutableOpaque(OpaqueReadOwnership ownership,
450+
const ASTContext &ctx) {
451+
return {getOpaqueReadImpl(ownership, ctx)};
443452
}
444453

445454
/// Describe the implementation of a mutable property implemented opaquely.
@@ -492,7 +501,8 @@ class StorageImplInfo {
492501
}
493502

494503
private:
495-
static ReadImplKind getOpaqueReadImpl(OpaqueReadOwnership ownership);
504+
static ReadImplKind getOpaqueReadImpl(OpaqueReadOwnership ownership,
505+
const ASTContext &ctx);
496506
};
497507

498508
llvm::StringRef getAccessorLabel(AccessorKind kind);

include/swift/Demangling/DemangleNodes.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@ NODE(ReabstractionThunkHelper)
231231
NODE(ReabstractionThunkHelperWithSelf)
232232
NODE(ReabstractionThunkHelperWithGlobalActor)
233233
CONTEXT_NODE(ReadAccessor)
234+
CONTEXT_NODE(Read2Accessor)
234235
NODE(RelatedEntityDeclName)
235236
NODE(RetroactiveConformance)
236237
NODE(ReturnType)

lib/AST/ASTDumper.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,8 @@ static StringRef getDumpString(ReadImplKind kind) {
228228
return "addressor";
229229
case ReadImplKind::Read:
230230
return "read_coroutine";
231+
case ReadImplKind::Read2:
232+
return "read2_coroutine";
231233
}
232234
llvm_unreachable("bad kind");
233235
}

lib/AST/ASTMangler.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ static StringRef getCodeForAccessorKind(AccessorKind kind) {
109109
return "i";
110110
case AccessorKind::Modify2:
111111
return "x";
112+
case AccessorKind::Read2:
113+
return "y";
112114
}
113115
llvm_unreachable("bad accessor kind");
114116
}

lib/AST/ASTPrinter.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2539,6 +2539,13 @@ void PrintAST::printAccessors(const AbstractStorageDecl *ASD) {
25392539
case ReadImplKind::Read:
25402540
AddAccessorToPrint(AccessorKind::Read);
25412541
break;
2542+
case ReadImplKind::Read2:
2543+
if (ASD->getAccessor(AccessorKind::Read) &&
2544+
shouldPrintUnderscoredCoroutineAccessors(ASD)) {
2545+
AddAccessorToPrint(AccessorKind::Read);
2546+
}
2547+
AddAccessorToPrint(AccessorKind::Read2);
2548+
break;
25422549
}
25432550
switch (impl.getWriteImpl()) {
25442551
case WriteImplKind::Immutable:
@@ -4079,6 +4086,7 @@ void PrintAST::visitAccessorDecl(AccessorDecl *decl) {
40794086
case AccessorKind::DistributedGet:
40804087
case AccessorKind::Address:
40814088
case AccessorKind::Read:
4089+
case AccessorKind::Read2:
40824090
case AccessorKind::Modify:
40834091
case AccessorKind::Modify2:
40844092
case AccessorKind::DidSet:

lib/AST/ASTVerifier.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3423,6 +3423,7 @@ class Verifier : public ASTWalker {
34233423
// We allow a non dynamic getter if there is a dynamic read.
34243424
!(FD->isGetter() &&
34253425
(storageDecl->getReadImpl() == ReadImplKind::Read ||
3426+
storageDecl->getReadImpl() == ReadImplKind::Read2 ||
34263427
storageDecl->getReadImpl() == ReadImplKind::Address) &&
34273428
storageDecl->shouldUseNativeDynamicDispatch())) {
34283429
Out << "Property and accessor do not match for 'dynamic'\n";

lib/AST/AccessRequests.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ AccessLevelRequest::evaluate(Evaluator &evaluator, ValueDecl *D) const {
5656
case AccessorKind::DistributedGet:
5757
case AccessorKind::Address:
5858
case AccessorKind::Read:
59+
case AccessorKind::Read2:
5960
return storage->getFormalAccess();
6061
case AccessorKind::Set:
6162
case AccessorKind::MutableAddress:

0 commit comments

Comments
 (0)