SIL: add matchesActorIsolation

Returns true if the conformance is not isolated or if its isolation matches the isolation `inFunction`.
This commit is contained in:
Erik Eckstein
2025-04-04 19:10:34 +02:00
parent 1b2f8c3a19
commit 6987748517
5 changed files with 37 additions and 0 deletions

View File

@@ -881,6 +881,25 @@ swift::classifyDynamicCast(ModuleDecl *M,
return DynamicCastFeasibility::WillFail;
}
bool swift::matchesActorIsolation(ProtocolConformanceRef conformance, SILFunction *inFunction) {
return !conformance.forEachIsolatedConformance([&](ProtocolConformanceRef isolatedConf) -> bool {
if (!isolatedConf.isConcrete())
return false;
ActorIsolation isolation = isolatedConf.getConcrete()->getIsolation();
if (isolation.isNonisolated())
return false;
if (isolation.isGlobalActor()) {
if (auto functionIsolation = inFunction->getActorIsolation()) {
if (isolation == functionIsolation.value())
return false;
}
}
return true;
});
}
static unsigned getOptionalDepth(CanType type) {
unsigned depth = 0;
while (CanType objectType = type.getOptionalObjectType()) {