Skip to content

Commit 07d7790

Browse files
committed
Address review comments
- Avoid unnecessary memory allocation - Fix spelling errors - Some further minor fixes
1 parent 049ba39 commit 07d7790

File tree

5 files changed

+40
-33
lines changed

5 files changed

+40
-33
lines changed

include/swift/AST/Substitution.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ class Substitution {
4848

4949
Substitution(Type Replacement, ArrayRef<ProtocolConformanceRef> Conformance);
5050

51-
/// Checks whether the current substituion is canonical.
51+
/// Checks whether the current substitution is canonical.
5252
bool isCanonical() const;
5353

5454
/// Get the canonicalized substitution. If wasCanonical is not nullptr,

include/swift/AST/SubstitutionList.h

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,18 @@ using SubstitutionList = ArrayRef<Substitution>;
2929

3030
void dump(SubstitutionList subs);
3131

32-
/// Create a canonicalized substitution list.
33-
/// It may return the argument substitution list if it is canonical already.
34-
SubstitutionList getCanonicalSubstitutionList(SubstitutionList subs);
32+
/// Create a canonicalized substitution list from subs.
33+
/// subs is the substitution list to be canonicalized.
34+
/// canSubs is an out-parameter, which is used to store the results in case
35+
/// the list of substitutions was not canonical.
36+
/// The function returns a list of canonicalized substitutions.
37+
/// If the substitution list subs was canonical already, it will be returned and
38+
/// canSubs out-parameter will be empty.
39+
/// If something had to be canonicalized, then the canSubs out-parameter will be
40+
/// populated and the returned SubstitutionList would refer to canSubs storage.
41+
SubstitutionList
42+
getCanonicalSubstitutionList(SubstitutionList subs,
43+
SmallVectorImpl<Substitution> &canSubs);
3544
} // end namespace swift
3645

3746
#endif

lib/AST/ASTContext.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4189,7 +4189,8 @@ CanSILBoxType SILBoxType::get(ASTContext &C,
41894189
llvm::FoldingSetNodeID id;
41904190

41914191
// Canonicalize substitutions.
4192-
Args = getCanonicalSubstitutionList(Args);
4192+
SmallVector<Substitution, 4> CanArgs;
4193+
Args = getCanonicalSubstitutionList(Args, CanArgs);
41934194

41944195
Profile(id, Layout, Args);
41954196

lib/AST/ProtocolConformance.cpp

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,19 +1062,17 @@ DeclContext::getLocalConformances(
10621062

10631063
/// Check of all types used by the conformance are canonical.
10641064
bool ProtocolConformance::isCanonical() const {
1065-
// Normal conformances are considered canonical by
1066-
// construction.
1067-
if (getKind() != ProtocolConformanceKind::Normal) {
1068-
if (!getType()->isCanonical())
1069-
return false;
1070-
if (!getInterfaceType()->isCanonical())
1071-
return false;
1072-
}
1065+
// Normal conformances are always canonical by construction.
1066+
if (getKind() == ProtocolConformanceKind::Normal)
1067+
return true;
1068+
1069+
if (!getType()->isCanonical())
1070+
return false;
1071+
if (!getInterfaceType()->isCanonical())
1072+
return false;
10731073

10741074
switch (getKind()) {
10751075
case ProtocolConformanceKind::Normal: {
1076-
// Normal conformances are considered canonical by
1077-
// construction.
10781076
return true;
10791077
}
10801078
case ProtocolConformanceKind::Inherited: {
@@ -1136,20 +1134,25 @@ Substitution Substitution::getCanonicalSubstitution(bool *wasCanonical) const {
11361134
return *this;
11371135
}
11381136

1139-
SubstitutionList swift::getCanonicalSubstitutionList(SubstitutionList subs) {
1140-
SmallVector<Substitution, 4> newCanSubstitutions;
1137+
SubstitutionList
1138+
swift::getCanonicalSubstitutionList(SubstitutionList subs,
1139+
SmallVectorImpl<Substitution> &canSubs) {
11411140
bool subListWasCanonical = true;
11421141
for (auto &sub : subs) {
11431142
bool subWasCanonical = false;
11441143
auto canSub = sub.getCanonicalSubstitution(&subWasCanonical);
11451144
if (!subWasCanonical)
11461145
subListWasCanonical = false;
1147-
newCanSubstitutions.push_back(canSub);
1146+
canSubs.push_back(canSub);
11481147
}
1149-
if (subListWasCanonical)
1148+
1149+
if (subListWasCanonical) {
1150+
canSubs.clear();
11501151
return subs;
1151-
return newCanSubstitutions[0].getReplacement()->getASTContext().AllocateCopy(
1152-
newCanSubstitutions);
1152+
}
1153+
1154+
subs = canSubs;
1155+
return subs;
11531156
}
11541157

11551158
/// Check of all types used by the conformance are canonical.
@@ -1159,7 +1162,7 @@ ProtocolConformance *ProtocolConformance::getCanonicalConformance() {
11591162

11601163
switch (getKind()) {
11611164
case ProtocolConformanceKind::Normal: {
1162-
//assert(isCanonical() && "Normal conformances should always be canonical");
1165+
// Normal conformances are always canonical by construction.
11631166
return this;
11641167
}
11651168

@@ -1178,10 +1181,12 @@ ProtocolConformance *ProtocolConformance::getCanonicalConformance() {
11781181
auto spec = cast<SpecializedProtocolConformance>(this);
11791182
auto genericConformance = spec->getGenericConformance();
11801183
auto specSubs = spec->getGenericSubstitutions();
1181-
auto canSpecSubs = getCanonicalSubstitutionList(specSubs);
1184+
SmallVector<Substitution, 4> newSpecSubs;
1185+
auto canSpecSubs = getCanonicalSubstitutionList(specSubs, newSpecSubs);
11821186
return Ctx.getSpecializedConformance(
11831187
getType()->getCanonicalType(),
1184-
genericConformance->getCanonicalConformance(), canSpecSubs);
1188+
genericConformance->getCanonicalConformance(),
1189+
newSpecSubs.empty() ? canSpecSubs : Ctx.AllocateCopy(canSpecSubs));
11851190
}
11861191
}
11871192
llvm_unreachable("bad ProtocolConformanceKind");

lib/SIL/TypeLowering.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2492,13 +2492,6 @@ TypeConverter::checkFunctionForABIDifferences(SILFunctionType *fnTy1,
24922492
return ABIDifference::Trivial;
24932493
}
24942494

2495-
void canonicalizeSubstitutions(MutableArrayRef<Substitution> subs) {
2496-
for (auto &sub : subs) {
2497-
sub = Substitution(sub.getReplacement()->getCanonicalType(),
2498-
sub.getConformances());
2499-
}
2500-
}
2501-
25022495
CanSILBoxType
25032496
TypeConverter::getInterfaceBoxTypeForCapture(ValueDecl *captured,
25042497
CanType loweredInterfaceType,
@@ -2536,8 +2529,7 @@ TypeConverter::getInterfaceBoxTypeForCapture(ValueDecl *captured,
25362529
return ProtocolConformanceRef(conformedTy->getDecl());
25372530
},
25382531
genericArgs);
2539-
canonicalizeSubstitutions(genericArgs);
2540-
2532+
25412533
auto boxTy = SILBoxType::get(C, layout, genericArgs);
25422534
#ifndef NDEBUG
25432535
// FIXME: Map the box type out of context when asserting the field so

0 commit comments

Comments
 (0)