Skip to content

Commit 3c1361c

Browse files
committed
[CoroutineAccessors] Added read.
The name is a placeholder for the mutating single-yield coroutine accessor.
1 parent 24b2032 commit 3c1361c

Some content is hidden

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

47 files changed

+324
-19
lines changed

docs/ABI/Mangling.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ Entities
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:

lib/AST/Decl.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ DescriptiveDeclKind Decl::getDescriptiveKind() const {
263263
return DescriptiveDeclKind::MutableAddressor;
264264

265265
case AccessorKind::Read:
266+
case AccessorKind::Read2:
266267
return DescriptiveDeclKind::ReadAccessor;
267268

268269
case AccessorKind::Modify:
@@ -2688,6 +2689,9 @@ getDirectReadAccessStrategy(const AbstractStorageDecl *storage) {
26882689
case ReadImplKind::Read:
26892690
return AccessStrategy::getAccessor(AccessorKind::Read,
26902691
/*dispatch*/ false);
2692+
case ReadImplKind::Read2:
2693+
return AccessStrategy::getAccessor(AccessorKind::Read2,
2694+
/*dispatch*/ false);
26912695
}
26922696
llvm_unreachable("bad impl kind");
26932697
}
@@ -2902,6 +2906,7 @@ bool AbstractStorageDecl::requiresOpaqueAccessor(AccessorKind kind) const {
29022906
case AccessorKind::Set:
29032907
return requiresOpaqueSetter();
29042908
case AccessorKind::Read:
2909+
case AccessorKind::Read2:
29052910
return requiresOpaqueReadCoroutine();
29062911
case AccessorKind::Modify:
29072912
case AccessorKind::Modify2:
@@ -6765,6 +6770,7 @@ StringRef swift::getAccessorNameForDiagnostic(AccessorKind accessorKind,
67656770
case AccessorKind::MutableAddress:
67666771
return article ? "a mutable addressor" : "mutable addressor";
67676772
case AccessorKind::Read:
6773+
case AccessorKind::Read2:
67686774
return article ? "a 'read' accessor" : "'read' accessor";
67696775
case AccessorKind::Modify:
67706776
case AccessorKind::Modify2:
@@ -9007,6 +9013,7 @@ DeclName AbstractFunctionDecl::getEffectiveFullName() const {
90079013
case AccessorKind::Get:
90089014
case AccessorKind::DistributedGet:
90099015
case AccessorKind::Read:
9016+
case AccessorKind::Read2:
90109017
case AccessorKind::Modify:
90119018
case AccessorKind::Modify2:
90129019
return subscript ? subscript->getName()
@@ -10316,6 +10323,7 @@ StringRef AccessorDecl::implicitParameterNameFor(AccessorKind kind) {
1031610323
case AccessorKind::Get:
1031710324
case AccessorKind::DistributedGet:
1031810325
case AccessorKind::Read:
10326+
case AccessorKind::Read2:
1031910327
case AccessorKind::Modify:
1032010328
case AccessorKind::Modify2:
1032110329
case AccessorKind::Address:
@@ -10330,6 +10338,7 @@ bool AccessorDecl::isAssumedNonMutating() const {
1033010338
case AccessorKind::DistributedGet:
1033110339
case AccessorKind::Address:
1033210340
case AccessorKind::Read:
10341+
case AccessorKind::Read2:
1033310342
return true;
1033410343

1033510344
case AccessorKind::Set:

lib/AST/PrettyStackTrace.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@ void swift::printDeclDescription(llvm::raw_ostream &out, const Decl *D,
9797
case AccessorKind::Modify2:
9898
out << "modify2";
9999
break;
100+
case AccessorKind::Read2:
101+
out << "read2";
102+
break;
100103
}
101104

102105
out << " for " << ASD->getName();

lib/AST/StorageImpl.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,15 @@ StorageImplInfo StorageImplInfo::getMutableOpaque(OpaqueReadOwnership ownership,
3030
return {getOpaqueReadImpl(ownership, ctx), WriteImplKind::Set, rwKind};
3131
}
3232

33-
ReadImplKind StorageImplInfo::getOpaqueReadImpl(OpaqueReadOwnership ownership) {
33+
ReadImplKind StorageImplInfo::getOpaqueReadImpl(OpaqueReadOwnership ownership,
34+
const ASTContext &ctx) {
3435
switch (ownership) {
3536
case OpaqueReadOwnership::Owned:
3637
return ReadImplKind::Get;
3738
case OpaqueReadOwnership::OwnedOrBorrowed:
3839
case OpaqueReadOwnership::Borrowed:
40+
if (ctx.LangOpts.hasFeature(Feature::CoroutineAccessors))
41+
return ReadImplKind::Read2;
3942
return ReadImplKind::Read;
4043
}
4144
llvm_unreachable("bad read-ownership kind");

lib/Demangling/Demangler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3932,6 +3932,7 @@ NodePointer Demangler::demangleAccessor(NodePointer ChildNode) {
39323932
case 'w': Kind = Node::Kind::WillSet; break;
39333933
case 'W': Kind = Node::Kind::DidSet; break;
39343934
case 'r': Kind = Node::Kind::ReadAccessor; break;
3935+
case 'y': Kind = Node::Kind::Read2Accessor; break;
39353936
case 'M': Kind = Node::Kind::ModifyAccessor; break;
39363937
case 'x': Kind = Node::Kind::Modify2Accessor; break;
39373938
case 'i': Kind = Node::Kind::InitAccessor; break;

lib/Demangling/NodePrinter.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,7 @@ class NodePrinter {
520520
case Node::Kind::ReabstractionThunkHelperWithSelf:
521521
case Node::Kind::ReabstractionThunkHelperWithGlobalActor:
522522
case Node::Kind::ReadAccessor:
523+
case Node::Kind::Read2Accessor:
523524
case Node::Kind::RelatedEntityDeclName:
524525
case Node::Kind::RetroactiveConformance:
525526
case Node::Kind::Setter:
@@ -2721,6 +2722,9 @@ NodePointer NodePrinter::print(NodePointer Node, unsigned depth,
27212722
case Node::Kind::ReadAccessor:
27222723
return printAbstractStorage(Node->getFirstChild(), depth, asPrefixContext,
27232724
"read");
2725+
case Node::Kind::Read2Accessor:
2726+
return printAbstractStorage(Node->getFirstChild(), depth, asPrefixContext,
2727+
"read2");
27242728
case Node::Kind::ModifyAccessor:
27252729
return printAbstractStorage(Node->getFirstChild(), depth, asPrefixContext,
27262730
"modify");

lib/Demangling/OldRemangler.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,6 +1308,11 @@ ManglingError Remangler::mangleReadAccessor(Node *node, EntityContext &ctx,
13081308
return mangleAccessor(node->getFirstChild(), "r", ctx, depth + 1);
13091309
}
13101310

1311+
ManglingError Remangler::mangleRead2Accessor(Node *node, EntityContext &ctx,
1312+
unsigned depth) {
1313+
return mangleAccessor(node->getFirstChild(), "y", ctx, depth + 1);
1314+
}
1315+
13111316
ManglingError Remangler::mangleModifyAccessor(Node *node, EntityContext &ctx,
13121317
unsigned depth) {
13131318
return mangleAccessor(node->getFirstChild(), "M", ctx, depth + 1);

lib/Demangling/Remangler.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2999,6 +2999,10 @@ ManglingError Remangler::mangleReadAccessor(Node *node, unsigned depth) {
29992999
return mangleAbstractStorage(node->getFirstChild(), "r", depth + 1);
30003000
}
30013001

3002+
ManglingError Remangler::mangleRead2Accessor(Node *node, unsigned depth) {
3003+
return mangleAbstractStorage(node->getFirstChild(), "y", depth + 1);
3004+
}
3005+
30023006
ManglingError Remangler::mangleKeyPathThunkHelper(Node *node, StringRef op,
30033007
unsigned depth) {
30043008
for (NodePointer Child : *node)

lib/IRGen/GenMeta.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ static Flags getMethodDescriptorFlags(ValueDecl *fn) {
263263
return Flags::Kind::Setter;
264264
case AccessorKind::Read:
265265
return Flags::Kind::ReadCoroutine;
266+
case AccessorKind::Read2:
267+
return Flags::Kind::Read2Coroutine;
266268
case AccessorKind::Modify:
267269
return Flags::Kind::ModifyCoroutine;
268270
case AccessorKind::Modify2:

lib/IRGen/IRGenDebugInfo.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,9 @@ class IRGenDebugInfoImpl : public IRGenDebugInfo {
639639
case AccessorKind::Modify2:
640640
Kind = ".modify2";
641641
break;
642+
case AccessorKind::Read2:
643+
Kind = ".read2";
644+
break;
642645
}
643646

644647
SmallVector<char, 64> Buf;

lib/Index/Index.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ printArtificialName(const swift::AbstractStorageDecl *ASD, AccessorKind AK, llvm
6767
case AccessorKind::Address:
6868
case AccessorKind::MutableAddress:
6969
case AccessorKind::Read:
70+
case AccessorKind::Read2:
7071
case AccessorKind::Modify:
7172
case AccessorKind::Modify2:
7273
return true;

lib/Index/IndexSymbol.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,7 @@ SymbolSubKind index::getSubKindForAccessor(AccessorKind AK) {
275275
case AccessorKind::MutableAddress:
276276
return SymbolSubKind::SwiftAccessorMutableAddressor;
277277
case AccessorKind::Read: return SymbolSubKind::SwiftAccessorRead;
278+
case AccessorKind::Read2: return SymbolSubKind::SwiftAccessorRead;
278279
case AccessorKind::Modify: return SymbolSubKind::SwiftAccessorModify;
279280
case AccessorKind::Modify2: return SymbolSubKind::SwiftAccessorModify;
280281
case AccessorKind::Init: return SymbolSubKind::SwiftAccessorInit;

0 commit comments

Comments
 (0)