Skip to content

Commit f312f6d

Browse files
committed
Avoid an unnecessary retain when we "take" a CF object reference
1 parent 4a3b48d commit f312f6d

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

stdlib/public/runtime/DynamicCast.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -501,11 +501,15 @@ tryCastToForeignClass(
501501
case MetadataKind::ObjCClassWrapper: // Obj-C class => CF class
502502
case MetadataKind::ForeignClass: { // CF class => CF class
503503
auto srcObject = getNonNullSrcObject(srcValue, srcType, destType);
504-
auto resultObject = swift_dynamicCastForeignClass(srcObject, destClassType);
505-
if (resultObject) {
504+
if (auto resultObject
505+
= swift_dynamicCastForeignClass(srcObject, destClassType)) {
506506
*reinterpret_cast<const void **>(destLocation) = resultObject;
507-
objc_retain((id)const_cast<void *>(resultObject));
508-
return DynamicCastResult::SuccessViaCopy;
507+
if (takeOnSuccess) {
508+
return DynamicCastResult::SuccessViaTake;
509+
} else {
510+
objc_retain((id)const_cast<void *>(resultObject));
511+
return DynamicCastResult::SuccessViaCopy;
512+
}
509513
}
510514
break;
511515
}

0 commit comments

Comments
 (0)