Skip to content

Commit 6987748

Browse files
committed
SIL: add matchesActorIsolation
Returns true if the conformance is not isolated or if its isolation matches the isolation `inFunction`.
1 parent 1b2f8c3 commit 6987748

File tree

5 files changed

+37
-0
lines changed

5 files changed

+37
-0
lines changed

SwiftCompilerSources/Sources/SIL/ASTExtensions.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,11 @@ extension SubstitutionMap {
5454
return SubstitutionMap(bridged: method.bridged.getMethodSubstitutions(bridged))
5555
}
5656
}
57+
58+
extension Conformance {
59+
/// Returns true if the conformance is not isolated or if its isolation matches
60+
/// the isolation in `function`.
61+
public func matchesActorIsolation(in function: Function) -> Bool {
62+
return function.bridged.conformanceMatchesActorIsolation(bridged)
63+
}
64+
}

include/swift/SIL/DynamicCasts.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ DynamicCastFeasibility classifyDynamicCast(
6969
bool isSourceTypeExact = false,
7070
bool isWholeModuleOpts = false);
7171

72+
/// Returns true if the conformance is not isolated or if its isolation matches
73+
/// the isolation `inFunction`.
74+
bool matchesActorIsolation(ProtocolConformanceRef conformance, SILFunction *inFunction);
75+
7276
SILValue emitSuccessfulScalarUnconditionalCast(SILBuilder &B, SILLocation loc,
7377
SILDynamicCastInst inst);
7478

include/swift/SIL/SILBridging.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -507,6 +507,7 @@ struct BridgedFunction {
507507
BRIDGED_INLINE BridgedLinkage getLinkage() const;
508508
BRIDGED_INLINE void setLinkage(BridgedLinkage linkage) const;
509509
BRIDGED_INLINE void setIsSerialized(bool isSerialized) const;
510+
BRIDGED_INLINE bool conformanceMatchesActorIsolation(BridgedConformance conformance) const;
510511
bool isTrapNoReturn() const;
511512
bool isConvertPointerToPointerArgument() const;
512513
bool isAutodiffVJP() const;

include/swift/SIL/SILBridgingImpl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include "swift/Basic/BasicBridging.h"
2929
#include "swift/Basic/Nullability.h"
3030
#include "swift/SIL/ApplySite.h"
31+
#include "swift/SIL/DynamicCasts.h"
3132
#include "swift/SIL/InstWrappers.h"
3233
#include "swift/SIL/SILBuilder.h"
3334
#include "swift/SIL/SILDefaultWitnessTable.h"
@@ -823,6 +824,10 @@ void BridgedFunction::setIsSerialized(bool isSerialized) const {
823824
getFunction()->setSerializedKind(isSerialized ? swift::IsSerialized : swift::IsNotSerialized);
824825
}
825826

827+
bool BridgedFunction::conformanceMatchesActorIsolation(BridgedConformance conformance) const {
828+
return swift::matchesActorIsolation(conformance.unbridged(), getFunction());
829+
}
830+
826831
bool BridgedFunction::isResilientNominalDecl(BridgedDeclObj decl) const {
827832
return decl.getAs<swift::NominalTypeDecl>()->isResilient(getFunction()->getModule().getSwiftModule(),
828833
getFunction()->getResilienceExpansion());

lib/SIL/Utils/DynamicCasts.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -881,6 +881,25 @@ swift::classifyDynamicCast(ModuleDecl *M,
881881
return DynamicCastFeasibility::WillFail;
882882
}
883883

884+
bool swift::matchesActorIsolation(ProtocolConformanceRef conformance, SILFunction *inFunction) {
885+
return !conformance.forEachIsolatedConformance([&](ProtocolConformanceRef isolatedConf) -> bool {
886+
if (!isolatedConf.isConcrete())
887+
return false;
888+
889+
ActorIsolation isolation = isolatedConf.getConcrete()->getIsolation();
890+
if (isolation.isNonisolated())
891+
return false;
892+
893+
if (isolation.isGlobalActor()) {
894+
if (auto functionIsolation = inFunction->getActorIsolation()) {
895+
if (isolation == functionIsolation.value())
896+
return false;
897+
}
898+
}
899+
return true;
900+
});
901+
}
902+
884903
static unsigned getOptionalDepth(CanType type) {
885904
unsigned depth = 0;
886905
while (CanType objectType = type.getOptionalObjectType()) {

0 commit comments

Comments
 (0)