Skip to content

Commit 8d0fc1d

Browse files
committed
[Concurrency] Store ActorIsolation in AbstractClosureExpr instead of
ClosureActorIsolation. (cherry picked from commit 54f5fef)
1 parent 3a109a2 commit 8d0fc1d

File tree

4 files changed

+70
-15
lines changed

4 files changed

+70
-15
lines changed

include/swift/AST/ActorIsolation.h

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,17 +83,17 @@ class ActorIsolation {
8383

8484
private:
8585
union {
86-
NominalTypeDecl *actor;
86+
llvm::PointerUnion<NominalTypeDecl *, VarDecl *> actorInstance;
8787
Type globalActor;
8888
void *pointer;
8989
};
9090
unsigned kind : 3;
9191
unsigned isolatedByPreconcurrency : 1;
9292
unsigned parameterIndex : 28;
9393

94-
ActorIsolation(Kind kind, NominalTypeDecl *actor, unsigned parameterIndex)
95-
: actor(actor), kind(kind), isolatedByPreconcurrency(false),
96-
parameterIndex(parameterIndex) { }
94+
ActorIsolation(Kind kind, NominalTypeDecl *actor, unsigned parameterIndex);
95+
96+
ActorIsolation(Kind kind, VarDecl *capturedActor);
9797

9898
ActorIsolation(Kind kind, Type globalActor)
9999
: globalActor(globalActor), kind(kind), isolatedByPreconcurrency(false),
@@ -117,6 +117,10 @@ class ActorIsolation {
117117
return ActorIsolation(ActorInstance, actor, parameterIndex + 1);
118118
}
119119

120+
static ActorIsolation forActorInstanceCapture(VarDecl *capturedActor) {
121+
return ActorIsolation(ActorInstance, capturedActor);
122+
}
123+
120124
static ActorIsolation forGlobalActor(Type globalActor, bool unsafe) {
121125
return ActorIsolation(
122126
unsafe ? GlobalActorUnsafe : GlobalActor, globalActor);
@@ -151,10 +155,9 @@ class ActorIsolation {
151155
}
152156
}
153157

154-
NominalTypeDecl *getActor() const {
155-
assert(getKind() == ActorInstance);
156-
return actor;
157-
}
158+
NominalTypeDecl *getActor() const;
159+
160+
VarDecl *getCapturedActor() const;
158161

159162
bool isGlobalActor() const {
160163
return getKind() == GlobalActor || getKind() == GlobalActorUnsafe;
@@ -200,7 +203,8 @@ class ActorIsolation {
200203
return true;
201204

202205
case ActorInstance:
203-
return lhs.actor == rhs.actor && lhs.parameterIndex == rhs.parameterIndex;
206+
return (lhs.getActor() == rhs.getActor() &&
207+
lhs.parameterIndex == rhs.parameterIndex);
204208

205209
case GlobalActor:
206210
case GlobalActorUnsafe:

include/swift/AST/Expr.h

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3868,14 +3868,15 @@ class AbstractClosureExpr : public DeclContext, public Expr {
38683868
ParameterList *parameterList;
38693869

38703870
/// Actor isolation of the closure.
3871-
ClosureActorIsolation actorIsolation;
3871+
ActorIsolation actorIsolation;
38723872

38733873
public:
38743874
AbstractClosureExpr(ExprKind Kind, Type FnType, bool Implicit,
38753875
DeclContext *Parent)
38763876
: DeclContext(DeclContextKind::AbstractClosureExpr, Parent),
38773877
Expr(Kind, Implicit, FnType),
3878-
parameterList(nullptr) {
3878+
parameterList(nullptr),
3879+
actorIsolation(ActorIsolation::forUnspecified()) {
38793880
Bits.AbstractClosureExpr.Discriminator = InvalidDiscriminator;
38803881
}
38813882

@@ -3948,14 +3949,37 @@ class AbstractClosureExpr : public DeclContext, public Expr {
39483949
/// returns nullptr if the closure doesn't have a body
39493950
BraceStmt *getBody() const;
39503951

3951-
ClosureActorIsolation getClosureActorIsolation() const {
3952+
ActorIsolation getActorIsolation() const {
39523953
return actorIsolation;
39533954
}
39543955

3955-
void setActorIsolation(ClosureActorIsolation actorIsolation) {
3956+
void setActorIsolation(ActorIsolation actorIsolation) {
39563957
this->actorIsolation = actorIsolation;
39573958
}
39583959

3960+
ClosureActorIsolation getClosureActorIsolation() const {
3961+
bool preconcurrency = actorIsolation.preconcurrency();
3962+
3963+
switch (actorIsolation) {
3964+
case ActorIsolation::Unspecified:
3965+
case ActorIsolation::Nonisolated:
3966+
return ClosureActorIsolation::forNonisolated(preconcurrency);
3967+
3968+
case ActorIsolation::ActorInstance:
3969+
return ClosureActorIsolation::forActorInstance(
3970+
actorIsolation.getCapturedActor(), preconcurrency);
3971+
3972+
case ActorIsolation::GlobalActor:
3973+
case ActorIsolation::GlobalActorUnsafe:
3974+
return ClosureActorIsolation::forGlobalActor(
3975+
actorIsolation.getGlobalActor(), preconcurrency);
3976+
}
3977+
}
3978+
3979+
void setActorIsolation(ClosureActorIsolation closureIsolation) {
3980+
this->actorIsolation = closureIsolation.getActorIsolation();
3981+
}
3982+
39593983
static bool classof(const Expr *E) {
39603984
return E->getKind() >= ExprKind::First_AbstractClosureExpr &&
39613985
E->getKind() <= ExprKind::Last_AbstractClosureExpr;

lib/AST/Decl.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10501,6 +10501,33 @@ void swift::simple_display(llvm::raw_ostream &out, AnyFunctionRef fn) {
1050110501
out << "closure";
1050210502
}
1050310503

10504+
ActorIsolation::ActorIsolation(Kind kind, NominalTypeDecl *actor,
10505+
unsigned parameterIndex)
10506+
: actorInstance(actor), kind(kind),
10507+
isolatedByPreconcurrency(false),
10508+
parameterIndex(parameterIndex) { }
10509+
10510+
ActorIsolation::ActorIsolation(Kind kind, VarDecl *capturedActor)
10511+
: actorInstance(capturedActor), kind(kind),
10512+
isolatedByPreconcurrency(false),
10513+
parameterIndex(0) { }
10514+
10515+
NominalTypeDecl *ActorIsolation::getActor() const {
10516+
assert(getKind() == ActorInstance);
10517+
10518+
if (auto *instance = actorInstance.dyn_cast<VarDecl *>()) {
10519+
return instance->getTypeInContext()
10520+
->getReferenceStorageReferent()->getAnyActor();
10521+
}
10522+
10523+
return actorInstance.get<NominalTypeDecl *>();
10524+
}
10525+
10526+
VarDecl *ActorIsolation::getCapturedActor() const {
10527+
assert(getKind() == ActorInstance);
10528+
return actorInstance.dyn_cast<VarDecl *>();
10529+
}
10530+
1050410531
bool ActorIsolation::isMainActor() const {
1050510532
if (isGlobalActor()) {
1050610533
if (auto *nominal = getGlobalActor()->getAnyNominal())

lib/AST/Expr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1890,8 +1890,8 @@ ActorIsolation ClosureActorIsolation::getActorIsolation() const {
18901890
selfDecl->getTypeInContext()->getReferenceStorageReferent()->getAnyActor();
18911891
assert(actor && "Bad closure actor isolation?");
18921892
// FIXME: This could be a parameter... or a capture... hmmm.
1893-
return ActorIsolation::forActorInstanceSelf(actor).withPreconcurrency(
1894-
preconcurrency());
1893+
return ActorIsolation::forActorInstanceCapture(
1894+
getActorInstance()).withPreconcurrency(preconcurrency());
18951895
}
18961896
}
18971897
}

0 commit comments

Comments
 (0)