@@ -55,7 +55,6 @@ SubstitutionMap::Storage::Storage(
5555 getReplacementTypes ().data ());
5656 std::copy (conformances.begin (), conformances.end (),
5757 getConformances ().data ());
58- populatedAllReplacements = false ;
5958}
6059
6160SubstitutionMap::SubstitutionMap (
@@ -69,20 +68,6 @@ SubstitutionMap::SubstitutionMap(
6968#endif
7069}
7170
72- ArrayRef<Type> SubstitutionMap::getReplacementTypesBuffer () const {
73- return storage ? storage->getReplacementTypes () : ArrayRef<Type>();
74- }
75-
76- MutableArrayRef<Type> SubstitutionMap::getReplacementTypesBuffer () {
77- return storage ? storage->getReplacementTypes () : MutableArrayRef<Type>();
78- }
79-
80- MutableArrayRef<ProtocolConformanceRef>
81- SubstitutionMap::getConformancesBuffer () {
82- return storage ? storage->getConformances ()
83- : MutableArrayRef<ProtocolConformanceRef>();
84- }
85-
8671ArrayRef<ProtocolConformanceRef> SubstitutionMap::getConformances () const {
8772 return storage ? storage->getConformances ()
8873 : ArrayRef<ProtocolConformanceRef>();
@@ -91,16 +76,7 @@ ArrayRef<ProtocolConformanceRef> SubstitutionMap::getConformances() const {
9176ArrayRef<Type> SubstitutionMap::getReplacementTypes () const {
9277 if (empty ()) return { };
9378
94- // Make sure we've filled in all of the replacement types.
95- if (!storage->populatedAllReplacements ) {
96- for (auto gp : getGenericSignature ().getGenericParams ()) {
97- (void )lookupSubstitution (cast<SubstitutableType>(gp->getCanonicalType ()));
98- }
99-
100- storage->populatedAllReplacements = true ;
101- }
102-
103- return getReplacementTypesBuffer ();
79+ return storage->getReplacementTypes ();
10480}
10581
10682ArrayRef<Type> SubstitutionMap::getInnermostReplacementTypes () const {
@@ -126,32 +102,32 @@ bool SubstitutionMap::hasAnySubstitutableParams() const {
126102}
127103
128104bool SubstitutionMap::hasArchetypes () const {
129- for (Type replacementTy : getReplacementTypesBuffer ()) {
130- if (replacementTy && replacementTy ->hasArchetype ())
105+ for (Type replacementTy : getReplacementTypes ()) {
106+ if (replacementTy->hasArchetype ())
131107 return true ;
132108 }
133109 return false ;
134110}
135111
136112bool SubstitutionMap::hasLocalArchetypes () const {
137- for (Type replacementTy : getReplacementTypesBuffer ()) {
138- if (replacementTy && replacementTy ->hasLocalArchetype ())
113+ for (Type replacementTy : getReplacementTypes ()) {
114+ if (replacementTy->hasLocalArchetype ())
139115 return true ;
140116 }
141117 return false ;
142118}
143119
144120bool SubstitutionMap::hasOpaqueArchetypes () const {
145- for (Type replacementTy : getReplacementTypesBuffer ()) {
146- if (replacementTy && replacementTy ->hasOpaqueArchetype ())
121+ for (Type replacementTy : getReplacementTypes ()) {
122+ if (replacementTy->hasOpaqueArchetype ())
147123 return true ;
148124 }
149125 return false ;
150126}
151127
152128bool SubstitutionMap::hasDynamicSelf () const {
153- for (Type replacementTy : getReplacementTypesBuffer ()) {
154- if (replacementTy && replacementTy ->hasDynamicSelfType ())
129+ for (Type replacementTy : getReplacementTypes ()) {
130+ if (replacementTy->hasDynamicSelfType ())
155131 return true ;
156132 }
157133 return false ;
@@ -162,8 +138,8 @@ bool SubstitutionMap::isCanonical() const {
162138
163139 if (!getGenericSignature ()->isCanonical ()) return false ;
164140
165- for (Type replacementTy : getReplacementTypesBuffer ()) {
166- if (replacementTy && !replacementTy->isCanonical ())
141+ for (Type replacementTy : getReplacementTypes ()) {
142+ if (!replacementTy->isCanonical ())
167143 return false ;
168144 }
169145
@@ -182,11 +158,8 @@ SubstitutionMap SubstitutionMap::getCanonical(bool canonicalizeSignature) const
182158 if (canonicalizeSignature) sig = sig.getCanonicalSignature ();
183159
184160 SmallVector<Type, 4 > replacementTypes;
185- for (Type replacementType : getReplacementTypesBuffer ()) {
186- if (replacementType)
187- replacementTypes.push_back (replacementType->getCanonicalType ());
188- else
189- replacementTypes.push_back (nullptr );
161+ for (Type replacementType : getReplacementTypes ()) {
162+ replacementTypes.push_back (replacementType->getCanonicalType ());
190163 }
191164
192165 SmallVector<ProtocolConformanceRef, 4 > conformances;
@@ -237,13 +210,7 @@ SubstitutionMap SubstitutionMap::get(GenericSignature genericSig,
237210 SmallVector<Type, 4 > replacementTypes;
238211 replacementTypes.reserve (genericSig.getGenericParams ().size ());
239212
240- genericSig->forEachParam ([&](GenericTypeParamType *gp, bool canonical) {
241- // Don't eagerly form replacements for non-canonical generic parameters.
242- if (!canonical) {
243- replacementTypes.push_back (Type ());
244- return ;
245- }
246-
213+ for (auto *gp : genericSig.getGenericParams ()) {
247214 // Record the replacement.
248215 Type replacement = Type (gp).subst (IFS);
249216
@@ -252,7 +219,7 @@ SubstitutionMap SubstitutionMap::get(GenericSignature genericSig,
252219 " replacement for pack parameter must be a pack type" );
253220
254221 replacementTypes.push_back (replacement);
255- });
222+ }
256223
257224 // Form the stored conformances.
258225 SmallVector<ProtocolConformanceRef, 4 > conformances;
@@ -292,11 +259,7 @@ Type SubstitutionMap::lookupSubstitution(CanSubstitutableType type) const {
292259 // Find the index of the replacement type based on the generic parameter we
293260 // have.
294261 auto genericParam = cast<GenericTypeParamType>(type);
295- auto mutableThis = const_cast <SubstitutionMap *>(this );
296- auto replacementTypes = mutableThis->getReplacementTypesBuffer ();
297- auto genericSig = getGenericSignature ();
298- assert (genericSig);
299- auto genericParams = genericSig.getGenericParams ();
262+ auto genericParams = getGenericSignature ().getGenericParams ();
300263 auto replacementIndex =
301264 GenericParamKey (genericParam).findIndexIn (genericParams);
302265
@@ -305,45 +268,7 @@ Type SubstitutionMap::lookupSubstitution(CanSubstitutableType type) const {
305268 if (replacementIndex == genericParams.size ())
306269 return Type ();
307270
308- // If we already have a replacement type, return it.
309- Type &replacementType = replacementTypes[replacementIndex];
310- if (replacementType)
311- return replacementType;
312-
313- // The generic parameter may have been made concrete by the generic signature,
314- // substitute into the concrete type.
315- if (auto concreteType = genericSig->getConcreteType (genericParam)) {
316- // Set the replacement type to an error, to block infinite recursion.
317- replacementType = ErrorType::get (concreteType);
318-
319- // Substitute into the replacement type.
320- replacementType = concreteType.subst (*this );
321-
322- // If the generic signature is canonical, canonicalize the replacement type.
323- if (getGenericSignature ()->isCanonical ())
324- replacementType = replacementType->getCanonicalType ();
325-
326- return replacementType;
327- }
328-
329- // The generic parameter may not be reduced. Retrieve the reduced
330- // type, which will be dependent.
331- CanType canonicalType = genericSig.getReducedType (genericParam);
332-
333- // If nothing changed, we don't have a replacement.
334- if (canonicalType == type) return Type ();
335-
336- // If we're left with a substitutable type, substitute into that.
337- // First, set the replacement type to an error, to block infinite recursion.
338- replacementType = ErrorType::get (type);
339-
340- replacementType = lookupSubstitution (cast<SubstitutableType>(canonicalType));
341-
342- // If the generic signature is canonical, canonicalize the replacement type.
343- if (getGenericSignature ()->isCanonical ())
344- replacementType = replacementType->getCanonicalType ();
345-
346- return replacementType;
271+ return getReplacementTypes ()[replacementIndex];
347272}
348273
349274ProtocolConformanceRef
@@ -500,12 +425,7 @@ SubstitutionMap SubstitutionMap::subst(InFlightSubstitution &IFS) const {
500425 if (empty ()) return SubstitutionMap ();
501426
502427 SmallVector<Type, 4 > newSubs;
503- for (Type type : getReplacementTypesBuffer ()) {
504- if (!type) {
505- // Non-canonical parameter.
506- newSubs.push_back (Type ());
507- continue ;
508- }
428+ for (Type type : getReplacementTypes ()) {
509429 newSubs.push_back (type.subst (IFS));
510430 assert (type->is <PackType>() == newSubs.back ()->is <PackType>() &&
511431 " substitution changed the pack-ness of a replacement type" );
@@ -843,7 +763,7 @@ bool SubstitutionMap::isIdentity() const {
843763
844764 GenericSignature sig = getGenericSignature ();
845765 bool hasNonIdentityReplacement = false ;
846- auto replacements = getReplacementTypesBuffer ();
766+ auto replacements = getReplacementTypes ();
847767
848768 sig->forEachParam ([&](GenericTypeParamType *paramTy, bool isCanonical) {
849769 if (isCanonical) {
0 commit comments