Skip to content

Commit 7b7a741

Browse files
committed
[CoroutineAccessors] Added read.
The name is a placeholder for the mutating single-yield coroutine accessor.
1 parent 527c67a commit 7b7a741

39 files changed

+242
-1
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
@@ -350,6 +350,7 @@ class MethodDescriptorFlags {
350350
Setter,
351351
ModifyCoroutine,
352352
ReadCoroutine,
353+
Read2Coroutine,
353354
Modify2Coroutine,
354355
};
355356

@@ -573,6 +574,7 @@ class ProtocolRequirementFlags {
573574
ModifyCoroutine,
574575
AssociatedTypeAccessFunction,
575576
AssociatedConformanceAccessFunction,
577+
Read2Coroutine,
576578
Modify2Coroutine,
577579
};
578580

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: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ enum class AccessorKind {
5151

5252
inline bool requiresFeatureCoroutineAccessors(AccessorKind kind) {
5353
switch (kind) {
54+
case AccessorKind::Read2:
5455
case AccessorKind::Modify2:
5556
return true;
5657
case AccessorKind::Get:
@@ -70,6 +71,7 @@ inline bool requiresFeatureCoroutineAccessors(AccessorKind kind) {
7071
inline bool isYieldingAccessor(AccessorKind kind) {
7172
switch (kind) {
7273
case AccessorKind::Read:
74+
case AccessorKind::Read2:
7375
case AccessorKind::Modify:
7476
case AccessorKind::Modify2:
7577
return true;
@@ -88,6 +90,7 @@ inline bool isYieldingAccessor(AccessorKind kind) {
8890
inline bool isYieldingDefaultNonmutatingAccessor(AccessorKind kind) {
8991
switch (kind) {
9092
case AccessorKind::Read:
93+
case AccessorKind::Read2:
9194
return true;
9295
case AccessorKind::Get:
9396
case AccessorKind::DistributedGet:
@@ -112,6 +115,7 @@ inline bool isYieldingDefaultMutatingAccessor(AccessorKind kind) {
112115
case AccessorKind::DistributedGet:
113116
case AccessorKind::Set:
114117
case AccessorKind::Read:
118+
case AccessorKind::Read2:
115119
case AccessorKind::WillSet:
116120
case AccessorKind::DidSet:
117121
case AccessorKind::Address:

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/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: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4011,6 +4011,7 @@ void PrintAST::visitAccessorDecl(AccessorDecl *decl) {
40114011
case AccessorKind::DistributedGet:
40124012
case AccessorKind::Address:
40134013
case AccessorKind::Read:
4014+
case AccessorKind::Read2:
40144015
case AccessorKind::Modify:
40154016
case AccessorKind::Modify2:
40164017
case AccessorKind::DidSet:

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: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ DescriptiveDeclKind Decl::getDescriptiveKind() const {
264264
return DescriptiveDeclKind::MutableAddressor;
265265

266266
case AccessorKind::Read:
267+
case AccessorKind::Read2:
267268
return DescriptiveDeclKind::ReadAccessor;
268269

269270
case AccessorKind::Modify:
@@ -2903,6 +2904,7 @@ bool AbstractStorageDecl::requiresOpaqueAccessor(AccessorKind kind) const {
29032904
case AccessorKind::Set:
29042905
return requiresOpaqueSetter();
29052906
case AccessorKind::Read:
2907+
case AccessorKind::Read2:
29062908
return requiresOpaqueReadCoroutine();
29072909
case AccessorKind::Modify:
29082910
case AccessorKind::Modify2:
@@ -6768,6 +6770,7 @@ StringRef swift::getAccessorNameForDiagnostic(AccessorKind accessorKind,
67686770
case AccessorKind::MutableAddress:
67696771
return article ? "a mutable addressor" : "mutable addressor";
67706772
case AccessorKind::Read:
6773+
case AccessorKind::Read2:
67716774
return article ? "a 'read' accessor" : "'read' accessor";
67726775
case AccessorKind::Modify:
67736776
case AccessorKind::Modify2:
@@ -9010,6 +9013,7 @@ DeclName AbstractFunctionDecl::getEffectiveFullName() const {
90109013
case AccessorKind::Get:
90119014
case AccessorKind::DistributedGet:
90129015
case AccessorKind::Read:
9016+
case AccessorKind::Read2:
90139017
case AccessorKind::Modify:
90149018
case AccessorKind::Modify2:
90159019
return subscript ? subscript->getName()
@@ -10319,6 +10323,7 @@ StringRef AccessorDecl::implicitParameterNameFor(AccessorKind kind) {
1031910323
case AccessorKind::Get:
1032010324
case AccessorKind::DistributedGet:
1032110325
case AccessorKind::Read:
10326+
case AccessorKind::Read2:
1032210327
case AccessorKind::Modify:
1032310328
case AccessorKind::Modify2:
1032410329
case AccessorKind::Address:
@@ -10333,6 +10338,7 @@ bool AccessorDecl::isAssumedNonMutating() const {
1033310338
case AccessorKind::DistributedGet:
1033410339
case AccessorKind::Address:
1033510340
case AccessorKind::Read:
10341+
case AccessorKind::Read2:
1033610342
return true;
1033710343

1033810344
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/Demangling/Demangler.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3913,6 +3913,7 @@ NodePointer Demangler::demangleAccessor(NodePointer ChildNode) {
39133913
case 'w': Kind = Node::Kind::WillSet; break;
39143914
case 'W': Kind = Node::Kind::DidSet; break;
39153915
case 'r': Kind = Node::Kind::ReadAccessor; break;
3916+
case 'y': Kind = Node::Kind::Read2Accessor; break;
39163917
case 'M': Kind = Node::Kind::ModifyAccessor; break;
39173918
case 'x': Kind = Node::Kind::Modify2Accessor; break;
39183919
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
@@ -276,6 +276,7 @@ SymbolSubKind index::getSubKindForAccessor(AccessorKind AK) {
276276
case AccessorKind::MutableAddress:
277277
return SymbolSubKind::SwiftAccessorMutableAddressor;
278278
case AccessorKind::Read: return SymbolSubKind::SwiftAccessorRead;
279+
case AccessorKind::Read2: return SymbolSubKind::SwiftAccessorRead;
279280
case AccessorKind::Modify: return SymbolSubKind::SwiftAccessorModify;
280281
case AccessorKind::Modify2: return SymbolSubKind::SwiftAccessorModify;
281282
case AccessorKind::Init: return SymbolSubKind::SwiftAccessorInit;

lib/Parse/ParseDecl.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7870,6 +7870,7 @@ static bool isAllowedWhenParsingLimitedSyntax(AccessorKind kind, bool forSIL) {
78707870
case AccessorKind::WillSet:
78717871
case AccessorKind::DidSet:
78727872
case AccessorKind::Read:
7873+
case AccessorKind::Read2:
78737874
case AccessorKind::Modify:
78747875
case AccessorKind::Modify2:
78757876
return false;
@@ -8563,9 +8564,12 @@ void Parser::ParsedAccessors::classify(Parser &P, AbstractStorageDecl *storage,
85638564
// 'get', 'read', and a non-mutable addressor are all exclusive.
85648565
if (Get) {
85658566
diagnoseConflictingAccessors(P, Get, Read);
8567+
diagnoseConflictingAccessors(P, Get, Read2);
85668568
diagnoseConflictingAccessors(P, Get, Address);
85678569
} else if (Read) {
85688570
diagnoseConflictingAccessors(P, Read, Address);
8571+
} else if (Read2) {
8572+
diagnoseConflictingAccessors(P, Read2, Address);
85698573
} else if (Address) {
85708574
// Nothing can go wrong.
85718575

lib/SIL/IR/SILPrinter.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,9 @@ void SILDeclRef::print(raw_ostream &OS) const {
347347
case AccessorKind::Init:
348348
OS << "!init";
349349
break;
350+
case AccessorKind::Read2:
351+
OS << "!read2";
352+
break;
350353
case AccessorKind::Modify2:
351354
OS << "!modify2";
352355
break;

lib/SILGen/SILGenLValue.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3252,6 +3252,7 @@ namespace {
32523252
}
32533253

32543254
case AccessorKind::Read:
3255+
case AccessorKind::Read2:
32553256
case AccessorKind::Modify:
32563257
case AccessorKind::Modify2: {
32573258
auto typeData =

lib/SILGen/SILGenPattern.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3335,6 +3335,7 @@ static bool isBorrowableSubject(SILGenFunction &SGF,
33353335
// Get returns an owned value.
33363336
return false;
33373337
case AccessorKind::Read:
3338+
case AccessorKind::Read2:
33383339
case AccessorKind::Modify:
33393340
case AccessorKind::Modify2:
33403341
case AccessorKind::Address:

lib/SILOptimizer/Mandatory/DefiniteInitialization.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1771,6 +1771,7 @@ void LifetimeChecker::handleInOutUse(const DIMemoryUse &Use) {
17711771
case AccessorKind::Get:
17721772
case AccessorKind::DistributedGet:
17731773
case AccessorKind::Read:
1774+
case AccessorKind::Read2:
17741775
case AccessorKind::Address:
17751776
return false;
17761777
case AccessorKind::Set:

lib/Sema/CSDiagnostics.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4701,6 +4701,7 @@ bool InvalidMemberRefOnExistential::diagnoseAsError() {
47014701
case AccessorKind::Get:
47024702
case AccessorKind::DistributedGet:
47034703
case AccessorKind::Read:
4704+
case AccessorKind::Read2:
47044705
case AccessorKind::Modify:
47054706
case AccessorKind::Modify2:
47064707
case AccessorKind::Address:

lib/Sema/MiscDiagnostics.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4911,6 +4911,7 @@ class ObjCSelectorWalker : public ASTWalker {
49114911
case AccessorKind::Address:
49124912
case AccessorKind::MutableAddress:
49134913
case AccessorKind::Read:
4914+
case AccessorKind::Read2:
49144915
case AccessorKind::Modify:
49154916
case AccessorKind::Modify2:
49164917
case AccessorKind::Init:

lib/Sema/TypeCheckAttr.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5363,6 +5363,7 @@ static DescriptiveDeclKind getAccessorDescriptiveDeclKind(AccessorKind kind) {
53635363
case AccessorKind::Set:
53645364
return DescriptiveDeclKind::Setter;
53655365
case AccessorKind::Read:
5366+
case AccessorKind::Read2:
53665367
return DescriptiveDeclKind::ReadAccessor;
53675368
case AccessorKind::Modify:
53685369
case AccessorKind::Modify2:

lib/Sema/TypeCheckDecl.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ static bool doesAccessorNeedDynamicAttribute(AccessorDecl *accessor) {
348348
return storage->isDynamic();
349349
}
350350
case AccessorKind::Read:
351+
case AccessorKind::Read2:
351352
if (!isObjC && storage->getReadImpl() == ReadImplKind::Read)
352353
return storage->isDynamic();
353354
return false;
@@ -1634,6 +1635,7 @@ SelfAccessKindRequest::evaluate(Evaluator &evaluator, FuncDecl *FD) const {
16341635
case AccessorKind::Get:
16351636
case AccessorKind::DistributedGet:
16361637
case AccessorKind::Read:
1638+
case AccessorKind::Read2:
16371639
break;
16381640

16391641
case AccessorKind::Init:
@@ -2106,6 +2108,7 @@ ResultTypeRequest::evaluate(Evaluator &evaluator, ValueDecl *decl) const {
21062108
// Coroutine accessors don't mention the value type directly.
21072109
// If we add yield types to the function type, we'll need to update this.
21082110
case AccessorKind::Read:
2111+
case AccessorKind::Read2:
21092112
case AccessorKind::Modify:
21102113
case AccessorKind::Modify2:
21112114
return TupleType::getEmpty(ctx);

lib/Sema/TypeCheckDeclObjC.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -733,6 +733,7 @@ bool swift::isRepresentableInObjC(
733733
return false;
734734

735735
case AccessorKind::Read:
736+
case AccessorKind::Read2:
736737
case AccessorKind::Modify:
737738
case AccessorKind::Modify2:
738739
diagnoseAndRemoveAttr(accessor, Reason.getAttr(),
@@ -1439,6 +1440,7 @@ static std::optional<ObjCReason> shouldMarkAsObjC(const ValueDecl *VD,
14391440
case AccessorKind::Modify:
14401441
case AccessorKind::Modify2:
14411442
case AccessorKind::Read:
1443+
case AccessorKind::Read2:
14421444
case AccessorKind::WillSet:
14431445
case AccessorKind::Init:
14441446
case AccessorKind::DistributedGet:

lib/Sema/TypeCheckDeclOverride.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1837,6 +1837,7 @@ isRedundantAccessorOverrideAvailabilityDiagnostic(ValueDecl *override,
18371837
break;
18381838

18391839
case AccessorKind::Read:
1840+
case AccessorKind::Read2:
18401841
if (accessorOverrideAlreadyDiagnosed(AccessorKind::Get))
18411842
return true;
18421843
break;
@@ -2348,6 +2349,7 @@ computeOverriddenDecls(ValueDecl *decl, bool ignoreMissingImports) {
23482349
case AccessorKind::Get:
23492350
case AccessorKind::Set:
23502351
case AccessorKind::Read:
2352+
case AccessorKind::Read2:
23512353
case AccessorKind::Modify:
23522354
case AccessorKind::Modify2:
23532355
break;
@@ -2387,6 +2389,7 @@ computeOverriddenDecls(ValueDecl *decl, bool ignoreMissingImports) {
23872389
case AccessorKind::Get:
23882390
case AccessorKind::DistributedGet:
23892391
case AccessorKind::Read:
2392+
case AccessorKind::Read2:
23902393
break;
23912394

23922395
case AccessorKind::Modify:

0 commit comments

Comments
 (0)