Skip to content

Commit 54f5fef

Browse files
committed
[Concurrency] Store ActorIsolation in AbstractClosureExpr instead of
ClosureActorIsolation.
1 parent 4b23564 commit 54f5fef

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
@@ -3871,14 +3871,15 @@ class AbstractClosureExpr : public DeclContext, public Expr {
38713871
ParameterList *parameterList;
38723872

38733873
/// Actor isolation of the closure.
3874-
ClosureActorIsolation actorIsolation;
3874+
ActorIsolation actorIsolation;
38753875

38763876
public:
38773877
AbstractClosureExpr(ExprKind Kind, Type FnType, bool Implicit,
38783878
DeclContext *Parent)
38793879
: DeclContext(DeclContextKind::AbstractClosureExpr, Parent),
38803880
Expr(Kind, Implicit, FnType),
3881-
parameterList(nullptr) {
3881+
parameterList(nullptr),
3882+
actorIsolation(ActorIsolation::forUnspecified()) {
38823883
Bits.AbstractClosureExpr.Discriminator = InvalidDiscriminator;
38833884
}
38843885

@@ -3951,14 +3952,37 @@ class AbstractClosureExpr : public DeclContext, public Expr {
39513952
/// returns nullptr if the closure doesn't have a body
39523953
BraceStmt *getBody() const;
39533954

3954-
ClosureActorIsolation getClosureActorIsolation() const {
3955+
ActorIsolation getActorIsolation() const {
39553956
return actorIsolation;
39563957
}
39573958

3958-
void setActorIsolation(ClosureActorIsolation actorIsolation) {
3959+
void setActorIsolation(ActorIsolation actorIsolation) {
39593960
this->actorIsolation = actorIsolation;
39603961
}
39613962

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

lib/AST/Decl.cpp

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

10600+
ActorIsolation::ActorIsolation(Kind kind, NominalTypeDecl *actor,
10601+
unsigned parameterIndex)
10602+
: actorInstance(actor), kind(kind),
10603+
isolatedByPreconcurrency(false),
10604+
parameterIndex(parameterIndex) { }
10605+
10606+
ActorIsolation::ActorIsolation(Kind kind, VarDecl *capturedActor)
10607+
: actorInstance(capturedActor), kind(kind),
10608+
isolatedByPreconcurrency(false),
10609+
parameterIndex(0) { }
10610+
10611+
NominalTypeDecl *ActorIsolation::getActor() const {
10612+
assert(getKind() == ActorInstance);
10613+
10614+
if (auto *instance = actorInstance.dyn_cast<VarDecl *>()) {
10615+
return instance->getTypeInContext()
10616+
->getReferenceStorageReferent()->getAnyActor();
10617+
}
10618+
10619+
return actorInstance.get<NominalTypeDecl *>();
10620+
}
10621+
10622+
VarDecl *ActorIsolation::getCapturedActor() const {
10623+
assert(getKind() == ActorInstance);
10624+
return actorInstance.dyn_cast<VarDecl *>();
10625+
}
10626+
1060010627
bool ActorIsolation::isMainActor() const {
1060110628
if (isGlobalActor()) {
1060210629
if (auto *nominal = getGlobalActor()->getAnyNominal())

lib/AST/Expr.cpp

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

0 commit comments

Comments
 (0)