Skip to content

Commit f05f08c

Browse files
committed
Revert "[concurrency] Make ActorIsolation::Nonisolated -> CallerIsolationInheriting and delete CallerIsolationInheriting."
This reverts commit 543b1e6.
1 parent 649952e commit f05f08c

20 files changed

+117
-23
lines changed

include/swift/AST/ActorIsolation.h

+16-1
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,11 @@ class ActorIsolation {
8080
/// The actor isolation iss statically erased, as for a call to
8181
/// an isolated(any) function. This is not possible for declarations.
8282
Erased,
83+
/// Inherits isolation from the caller of the given function.
84+
///
85+
/// DISCUSSION: This is used for nonisolated asynchronous functions that we
86+
/// want to inherit from their context the context's actor isolation.
87+
CallerIsolationInheriting,
8388
/// The declaration is explicitly specified to be not isolated to any actor,
8489
/// meaning that it can be used from any actor but is also unable to
8590
/// refer to the isolated state of any given actor.
@@ -102,7 +107,7 @@ class ActorIsolation {
102107
Type globalActor;
103108
void *pointer;
104109
};
105-
unsigned kind : 3;
110+
unsigned kind : 4;
106111
unsigned isolatedByPreconcurrency : 1;
107112

108113
/// Set to true if this was parsed from SIL.
@@ -136,6 +141,12 @@ class ActorIsolation {
136141
return ActorIsolation(unsafe ? ConcurrentUnsafe : Concurrent);
137142
}
138143

144+
static ActorIsolation forCallerIsolationInheriting() {
145+
// NOTE: We do not use parameter indices since the parameter is implicit
146+
// from the perspective of the AST.
147+
return ActorIsolation(CallerIsolationInheriting);
148+
}
149+
139150
static ActorIsolation forActorInstanceSelf(ValueDecl *decl);
140151

141152
/// Create an ActorIsolation appropriate for a type that is self.
@@ -183,6 +194,9 @@ class ActorIsolation {
183194
std::optional<ActorIsolation>(ActorIsolation::GlobalActor))
184195
.Case("global_actor_unsafe",
185196
std::optional<ActorIsolation>(ActorIsolation::GlobalActor))
197+
.Case("caller_isolation_inheriting",
198+
std::optional<ActorIsolation>(
199+
ActorIsolation::CallerIsolationInheriting))
186200
.Case("concurrent",
187201
std::optional<ActorIsolation>(ActorIsolation::Concurrent))
188202
.Case("concurrent_unsafe", std::optional<ActorIsolation>(
@@ -241,6 +255,7 @@ class ActorIsolation {
241255
case Unspecified:
242256
case Nonisolated:
243257
case NonisolatedUnsafe:
258+
case CallerIsolationInheriting:
244259
case Concurrent:
245260
case ConcurrentUnsafe:
246261
return false;

lib/AST/ASTDumper.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -3920,6 +3920,10 @@ class PrintExpr : public ExprVisitor<PrintExpr, void, Label>,
39203920
printFlag(true, "dynamically_isolated", CapturesColor);
39213921
break;
39223922

3923+
case ActorIsolation::CallerIsolationInheriting:
3924+
printFlag(true, "isolated_to_caller_isolation", CapturesColor);
3925+
break;
3926+
39233927
case ActorIsolation::ActorInstance:
39243928
printReferencedDeclWithContextField(isolation.getActorInstance(),
39253929
Label::always("actor_isolated"),

lib/AST/ActorIsolation.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ bool ActorIsolation::isEqual(const ActorIsolation &lhs,
165165
return false;
166166

167167
switch (lhs.getKind()) {
168+
case Nonisolated:
169+
case NonisolatedUnsafe:
168170
case Concurrent:
169171
case ConcurrentUnsafe:
170172
case Unspecified:
@@ -177,8 +179,7 @@ bool ActorIsolation::isEqual(const ActorIsolation &lhs,
177179
// to answer.
178180
return false;
179181

180-
case Nonisolated:
181-
case NonisolatedUnsafe:
182+
case CallerIsolationInheriting:
182183
// This returns false for the same reason as erased. The caller has to check
183184
// against the actual caller isolation.
184185
return false;

lib/AST/Decl.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -2766,6 +2766,7 @@ static bool deferMatchesEnclosingAccess(const FuncDecl *defer) {
27662766

27672767
return true;
27682768

2769+
case ActorIsolation::CallerIsolationInheriting:
27692770
case ActorIsolation::ActorInstance:
27702771
case ActorIsolation::Nonisolated:
27712772
case ActorIsolation::Concurrent:
@@ -11466,6 +11467,7 @@ bool VarDecl::isSelfParamCaptureIsolated() const {
1146611467
case ActorIsolation::ConcurrentUnsafe:
1146711468
case ActorIsolation::GlobalActor:
1146811469
case ActorIsolation::Erased:
11470+
case ActorIsolation::CallerIsolationInheriting:
1146911471
return false;
1147011472

1147111473
case ActorIsolation::ActorInstance:

lib/AST/TypeCheckRequests.cpp

+17
Original file line numberDiff line numberDiff line change
@@ -1856,6 +1856,7 @@ SourceLoc MacroDefinitionRequest::getNearestLoc() const {
18561856

18571857
bool ActorIsolation::requiresSubstitution() const {
18581858
switch (kind) {
1859+
case CallerIsolationInheriting:
18591860
case ActorInstance:
18601861
case Nonisolated:
18611862
case NonisolatedUnsafe:
@@ -1873,6 +1874,7 @@ bool ActorIsolation::requiresSubstitution() const {
18731874
ActorIsolation ActorIsolation::subst(SubstitutionMap subs) const {
18741875
switch (kind) {
18751876
case ActorInstance:
1877+
case CallerIsolationInheriting:
18761878
case Nonisolated:
18771879
case NonisolatedUnsafe:
18781880
case Concurrent:
@@ -1895,6 +1897,11 @@ void ActorIsolation::printForDiagnostics(llvm::raw_ostream &os,
18951897
os << "actor" << (asNoun ? " isolation" : "-isolated");
18961898
break;
18971899

1900+
case ActorIsolation::CallerIsolationInheriting:
1901+
os << "caller isolation inheriting"
1902+
<< (asNoun ? " isolation" : "-isolated");
1903+
break;
1904+
18981905
case ActorIsolation::GlobalActor: {
18991906
if (isMainActor()) {
19001907
os << "main actor" << (asNoun ? " isolation" : "-isolated");
@@ -1933,6 +1940,9 @@ void ActorIsolation::print(llvm::raw_ostream &os) const {
19331940
os << ". name: '" << vd->getBaseIdentifier() << "'";
19341941
}
19351942
return;
1943+
case CallerIsolationInheriting:
1944+
os << "caller_isolation_inheriting";
1945+
return;
19361946
case Nonisolated:
19371947
os << "nonisolated";
19381948
return;
@@ -1963,6 +1973,9 @@ void ActorIsolation::printForSIL(llvm::raw_ostream &os) const {
19631973
case ActorInstance:
19641974
os << "actor_instance";
19651975
return;
1976+
case CallerIsolationInheriting:
1977+
os << "caller_isolation_inheriting";
1978+
return;
19661979
case Nonisolated:
19671980
os << "nonisolated";
19681981
return;
@@ -2014,6 +2027,10 @@ void swift::simple_display(
20142027
}
20152028
break;
20162029

2030+
case ActorIsolation::CallerIsolationInheriting:
2031+
out << "isolated to isolation of caller";
2032+
break;
2033+
20172034
case ActorIsolation::Nonisolated:
20182035
case ActorIsolation::NonisolatedUnsafe:
20192036
case ActorIsolation::Concurrent:

lib/IDE/CompletionLookup.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -830,6 +830,7 @@ void CompletionLookup::analyzeActorIsolation(
830830
case ActorIsolation::NonisolatedUnsafe:
831831
case ActorIsolation::Concurrent:
832832
case ActorIsolation::ConcurrentUnsafe:
833+
case ActorIsolation::CallerIsolationInheriting:
833834
return;
834835
}
835836
}

lib/SIL/IR/SILFunctionType.cpp

+3-2
Original file line numberDiff line numberDiff line change
@@ -1651,7 +1651,8 @@ class DestructureInputs {
16511651
// enabled.
16521652
if (TC.Context.LangOpts.hasFeature(
16531653
Feature::NonIsolatedAsyncInheritsIsolationFromContext) &&
1654-
IsolationInfo && IsolationInfo->isNonisolated() &&
1654+
IsolationInfo &&
1655+
IsolationInfo->getKind() == ActorIsolation::CallerIsolationInheriting &&
16551656
extInfoBuilder.isAsync()) {
16561657
auto actorProtocol = TC.Context.getProtocol(KnownProtocolKind::Actor);
16571658
auto actorType =
@@ -2537,7 +2538,7 @@ static CanSILFunctionType getSILFunctionType(
25372538
actorIsolation = ActorIsolation::forConcurrent(false /*unsafe*/);
25382539
break;
25392540
case ExecutionKind::Caller:
2540-
actorIsolation = ActorIsolation::forNonisolated(false /*unsafe*/);
2541+
actorIsolation = ActorIsolation::forCallerIsolationInheriting();
25412542
break;
25422543
}
25432544
} else {

lib/SILGen/SILGenApply.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -3107,6 +3107,7 @@ static void emitDelayedArguments(SILGenFunction &SGF,
31073107
case ActorIsolation::NonisolatedUnsafe:
31083108
case ActorIsolation::Concurrent:
31093109
case ActorIsolation::ConcurrentUnsafe:
3110+
case ActorIsolation::CallerIsolationInheriting:
31103111
llvm_unreachable("Not isolated");
31113112
}
31123113

@@ -5836,6 +5837,7 @@ RValue SILGenFunction::emitApply(
58365837
case ActorIsolation::NonisolatedUnsafe:
58375838
case ActorIsolation::Concurrent:
58385839
case ActorIsolation::ConcurrentUnsafe:
5840+
case ActorIsolation::CallerIsolationInheriting:
58395841
llvm_unreachable("Not isolated");
58405842
break;
58415843
}

lib/SILGen/SILGenConcurrency.cpp

+8-3
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ setExpectedExecutorForParameterIsolation(SILGenFunction &SGF,
7373

7474
// If we have caller isolation inheriting... just grab from our isolated
7575
// argument.
76-
if (actorIsolation.isNonisolated()) {
76+
if (actorIsolation.getKind() == ActorIsolation::CallerIsolationInheriting) {
7777
if (auto *isolatedArg = SGF.F.maybeGetIsolatedArgument()) {
7878
ManagedValue isolatedMV;
7979
if (isolatedArg->getOwnershipKind() == OwnershipKind::Guaranteed) {
@@ -111,6 +111,7 @@ void SILGenFunction::emitExpectedExecutorProlog() {
111111
case ActorIsolation::Nonisolated:
112112
case ActorIsolation::NonisolatedUnsafe:
113113
case ActorIsolation::Unspecified:
114+
case ActorIsolation::CallerIsolationInheriting:
114115
return false;
115116

116117
case ActorIsolation::Erased:
@@ -164,6 +165,8 @@ void SILGenFunction::emitExpectedExecutorProlog() {
164165
auto actorIsolation = getActorIsolation(funcDecl);
165166
switch (actorIsolation.getKind()) {
166167
case ActorIsolation::Unspecified:
168+
case ActorIsolation::Nonisolated:
169+
case ActorIsolation::NonisolatedUnsafe:
167170
case ActorIsolation::Concurrent:
168171
case ActorIsolation::ConcurrentUnsafe:
169172
break;
@@ -188,8 +191,7 @@ void SILGenFunction::emitExpectedExecutorProlog() {
188191
break;
189192
}
190193

191-
case ActorIsolation::Nonisolated:
192-
case ActorIsolation::NonisolatedUnsafe:
194+
case ActorIsolation::CallerIsolationInheriting:
193195
assert(F.isAsync());
194196
setExpectedExecutorForParameterIsolation(*this, actorIsolation);
195197
break;
@@ -210,6 +212,7 @@ void SILGenFunction::emitExpectedExecutorProlog() {
210212
case ActorIsolation::NonisolatedUnsafe:
211213
case ActorIsolation::Concurrent:
212214
case ActorIsolation::ConcurrentUnsafe:
215+
case ActorIsolation::CallerIsolationInheriting:
213216
break;
214217

215218
case ActorIsolation::Erased:
@@ -639,6 +642,7 @@ SILGenFunction::emitClosureIsolation(SILLocation loc, SILDeclRef constant,
639642
case ActorIsolation::NonisolatedUnsafe:
640643
case ActorIsolation::Concurrent:
641644
case ActorIsolation::ConcurrentUnsafe:
645+
case ActorIsolation::CallerIsolationInheriting:
642646
return emitNonIsolatedIsolation(loc);
643647

644648
case ActorIsolation::Erased:
@@ -692,6 +696,7 @@ SILGenFunction::emitExecutor(SILLocation loc, ActorIsolation isolation,
692696
case ActorIsolation::NonisolatedUnsafe:
693697
case ActorIsolation::Concurrent:
694698
case ActorIsolation::ConcurrentUnsafe:
699+
case ActorIsolation::CallerIsolationInheriting:
695700
return std::nullopt;
696701

697702
case ActorIsolation::Erased:

lib/SILGen/SILGenConstructor.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,7 @@ static bool ctorHopsInjectedByDefiniteInit(ConstructorDecl *ctor,
606606
case ActorIsolation::Concurrent:
607607
case ActorIsolation::ConcurrentUnsafe:
608608
case ActorIsolation::GlobalActor:
609+
case ActorIsolation::CallerIsolationInheriting:
609610
return false;
610611
}
611612
}
@@ -1561,6 +1562,7 @@ void SILGenFunction::emitMemberInitializer(DeclContext *dc, VarDecl *selfDecl,
15611562
case ActorIsolation::NonisolatedUnsafe:
15621563
case ActorIsolation::Concurrent:
15631564
case ActorIsolation::ConcurrentUnsafe:
1565+
case ActorIsolation::CallerIsolationInheriting:
15641566
break;
15651567

15661568
case ActorIsolation::Erased:

lib/SILGen/SILGenFunction.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1100,6 +1100,7 @@ SILGenFunction::emitClosureValue(SILLocation loc, SILDeclRef constant,
11001100
case ActorIsolation::NonisolatedUnsafe:
11011101
case ActorIsolation::Concurrent:
11021102
case ActorIsolation::ConcurrentUnsafe:
1103+
case ActorIsolation::CallerIsolationInheriting:
11031104
case ActorIsolation::ActorInstance:
11041105
break;
11051106

lib/SILOptimizer/Mandatory/DefiniteInitialization.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1070,6 +1070,7 @@ void LifetimeChecker::injectActorHops() {
10701070
case ActorIsolation::NonisolatedUnsafe:
10711071
case ActorIsolation::Concurrent:
10721072
case ActorIsolation::ConcurrentUnsafe:
1073+
case ActorIsolation::CallerIsolationInheriting:
10731074
case ActorIsolation::GlobalActor:
10741075
return;
10751076
}

lib/Sema/ConstraintSystem.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -5111,6 +5111,7 @@ ConstraintSystem::inferKeyPathLiteralCapability(KeyPathExpr *keyPath) {
51115111
case ActorIsolation::NonisolatedUnsafe:
51125112
case ActorIsolation::Concurrent:
51135113
case ActorIsolation::ConcurrentUnsafe:
5114+
case ActorIsolation::CallerIsolationInheriting:
51145115
break;
51155116

51165117
case ActorIsolation::Erased:

0 commit comments

Comments
 (0)