Skip to content

Commit 4e9dfc2

Browse files
authored
Merge pull request #26124 from jckarter/cf-bridging-through-ns-superclass
Dynamic cast optimizer: Consider CF conversions via superclasses.
2 parents 675141b + 6588ee9 commit 4e9dfc2

File tree

2 files changed

+16
-5
lines changed

2 files changed

+16
-5
lines changed

lib/SIL/DynamicCasts.cpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -292,10 +292,16 @@ CanType swift::getNSBridgedClassOfCFClass(ModuleDecl *M, CanType type) {
292292

293293
static bool isCFBridgingConversion(ModuleDecl *M, SILType sourceType,
294294
SILType targetType) {
295-
return (sourceType.getASTType() ==
296-
getNSBridgedClassOfCFClass(M, targetType.getASTType()) ||
297-
targetType.getASTType() ==
298-
getNSBridgedClassOfCFClass(M, sourceType.getASTType()));
295+
if (auto bridgedTarget =
296+
getNSBridgedClassOfCFClass(M, targetType.getASTType())) {
297+
return bridgedTarget->isExactSuperclassOf(sourceType.getASTType());
298+
}
299+
if (auto bridgedSource =
300+
getNSBridgedClassOfCFClass(M, sourceType.getASTType())) {
301+
return targetType.getASTType()->isExactSuperclassOf(bridgedSource);
302+
}
303+
304+
return false;
299305
}
300306

301307
/// Try to classify the dynamic-cast relationship between two types.
@@ -868,7 +874,7 @@ namespace {
868874
value = getOwnedScalar(source, srcTL);
869875
}
870876
auto targetTy = target.LoweredType;
871-
if (isCFBridgingConversion(SwiftModule, targetTy, value->getType())) {
877+
if (isCFBridgingConversion(SwiftModule, value->getType(), targetTy)) {
872878
value = B.createUncheckedRefCast(Loc, value, targetTy.getObjectType());
873879
} else {
874880
value = B.createUpcast(Loc, value, targetTy.getObjectType());

test/SILOptimizer/cast_folding_objc.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,3 +354,8 @@ public func testConditionalBridgedCastFromSwiftToNSObjectDerivedClass(_ s: Strin
354354
public func testForcedBridgedCastFromSwiftToNSObjectDerivedClass(_ s: String) -> MyString {
355355
return s as! MyString
356356
}
357+
358+
// rdar://problem/51078136
359+
func foo(x: CFMutableDictionary) -> [AnyHashable:AnyObject]? {
360+
return x as? [AnyHashable:AnyObject]
361+
}

0 commit comments

Comments
 (0)