Skip to content

Commit 1e94466

Browse files
committed
AST: Replace GenericSignature::createGenericEnvironment() with getGenericEnvironment()
This memoizes the result, which is fine for all callers; the only exception is open existential types where each new open existential now explicitly gets a unique generic environment, allocated by calling GenericEnvironment::getIncomplete().
1 parent e9bcd00 commit 1e94466

File tree

19 files changed

+42
-36
lines changed

19 files changed

+42
-36
lines changed

include/swift/AST/GenericSignature.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ class GenericSignatureBuilder;
3232
class ProtocolConformanceRef;
3333
class ProtocolType;
3434
class SubstitutionMap;
35+
class GenericEnvironment;
3536

3637
/// An access path used to find a particular protocol conformance within
3738
/// a generic signature.
@@ -101,6 +102,8 @@ class alignas(1 << TypeAlignInBits) GenericSignature final
101102
unsigned NumGenericParams;
102103
unsigned NumRequirements;
103104

105+
GenericEnvironment *GenericEnv = nullptr;
106+
104107
// Make vanilla new/delete illegal.
105108
void *operator new(size_t Bytes) = delete;
106109
void operator delete(void *Data) = delete;
@@ -132,9 +135,6 @@ class alignas(1 << TypeAlignInBits) GenericSignature final
132135
static ASTContext &getASTContext(TypeArrayView<GenericTypeParamType> params,
133136
ArrayRef<Requirement> requirements);
134137

135-
/// Retrieve the generic signature builder for the given generic signature.
136-
GenericSignatureBuilder *getGenericSignatureBuilder();
137-
138138
void buildConformanceAccessPath(
139139
SmallVectorImpl<ConformanceAccessPath::Entry> &path,
140140
ArrayRef<Requirement> reqs,
@@ -218,10 +218,13 @@ class alignas(1 << TypeAlignInBits) GenericSignature final
218218
/// Canonicalize the components of a generic signature.
219219
CanGenericSignature getCanonicalSignature() const;
220220

221-
/// Create a new generic environment that provides fresh contextual types
221+
/// Retrieve the generic signature builder for the given generic signature.
222+
GenericSignatureBuilder *getGenericSignatureBuilder();
223+
224+
/// Returns the generic environment that provides fresh contextual types
222225
/// (archetypes) that correspond to the interface types in this generic
223226
/// signature.
224-
GenericEnvironment *createGenericEnvironment();
227+
GenericEnvironment *getGenericEnvironment();
225228

226229
/// Uniquing for the ASTContext.
227230
void Profile(llvm::FoldingSetNodeID &ID) {

include/swift/AST/Type.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -620,7 +620,7 @@ class CanGenericSignature {
620620
return Signature;
621621
}
622622

623-
bool operator==(const swift::CanGenericSignature& other) {
623+
bool operator==(const swift::CanGenericSignature &other) {
624624
return Signature == other.Signature;
625625
}
626626
};

lib/AST/ASTContext.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1634,7 +1634,7 @@ GenericEnvironment *ASTContext::getOrCreateCanonicalGenericEnvironment(
16341634
if (known != canonicalGenericEnvironments.end())
16351635
return known->second;
16361636

1637-
auto env = sig->createGenericEnvironment();
1637+
auto env = sig->getGenericEnvironment();
16381638
canonicalGenericEnvironments[builder] = env;
16391639
return env;
16401640
}
@@ -3653,7 +3653,8 @@ OpaqueTypeArchetypeType::get(OpaqueTypeDecl *Decl,
36533653

36543654
// Create a generic environment and bind the opaque archetype to the
36553655
// opaque interface type from the decl's signature.
3656-
auto env = signature->createGenericEnvironment();
3656+
auto *builder = signature->getGenericSignatureBuilder();
3657+
auto *env = GenericEnvironment::getIncomplete(signature, builder);
36573658
env->addMapping(GenericParamKey(opaqueInterfaceTy), newOpaque);
36583659
newOpaque->Environment = env;
36593660

@@ -3726,7 +3727,8 @@ GenericEnvironment *OpenedArchetypeType::getGenericEnvironment() const {
37263727
// Create a generic environment to represent the opened type.
37273728
auto signature = ctx.getExistentialSignature(Opened->getCanonicalType(),
37283729
nullptr);
3729-
auto env = signature->createGenericEnvironment();
3730+
auto *builder = signature->getGenericSignatureBuilder();
3731+
auto *env = GenericEnvironment::getIncomplete(signature, builder);
37303732
env->addMapping(signature->getGenericParams()[0], thisType);
37313733
Environment = env;
37323734

lib/AST/Builtins.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ namespace {
479479
AbstractGenericSignatureRequest{
480480
nullptr, std::move(genericParamTypes), { }},
481481
nullptr);
482-
GenericEnv = GenericSig->createGenericEnvironment();
482+
GenericEnv = GenericSig->getGenericEnvironment();
483483
}
484484

485485
template <class G>

lib/AST/Decl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ GenericContext::getLazyGenericEnvironmentSlow() const {
884884
if (auto PD = dyn_cast<ProtocolDecl>(this)) {
885885
// The signature of a Protocol is trivial (Self: TheProtocol) so let's
886886
// compute it directly.
887-
auto *genericEnv = getGenericSignature()->createGenericEnvironment();
887+
auto *genericEnv = getGenericSignature()->getGenericEnvironment();
888888
const_cast<GenericContext *>(this)->setGenericEnvironment(genericEnv);
889889
return genericEnv;
890890
}

lib/AST/GenericSignature.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -339,9 +339,13 @@ GenericSignature::getCanonicalSignature() const {
339339
CanonicalSignatureOrASTContext.get<GenericSignature*>());
340340
}
341341

342-
GenericEnvironment *GenericSignature::createGenericEnvironment() {
343-
auto *builder = getGenericSignatureBuilder();
344-
return GenericEnvironment::getIncomplete(this, builder);
342+
GenericEnvironment *GenericSignature::getGenericEnvironment() {
343+
if (GenericEnv == nullptr) {
344+
auto *builder = getGenericSignatureBuilder();
345+
GenericEnv = GenericEnvironment::getIncomplete(this, builder);
346+
}
347+
348+
return GenericEnv;
345349
}
346350

347351

lib/AST/RequirementEnvironment.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ RequirementEnvironment::RequirementEnvironment(
142142
if (syntheticSignature) {
143143
syntheticSignature = syntheticSignature->getCanonicalSignature();
144144
syntheticEnvironment =
145-
syntheticSignature->createGenericEnvironment();
145+
syntheticSignature->getGenericEnvironment();
146146
}
147147

148148
return;
@@ -217,5 +217,5 @@ RequirementEnvironment::RequirementEnvironment(
217217
AbstractGenericSignatureRequest{
218218
nullptr, std::move(genericParamTypes), std::move(requirements)},
219219
nullptr);
220-
syntheticEnvironment = syntheticSignature->createGenericEnvironment();
220+
syntheticEnvironment = syntheticSignature->getGenericEnvironment();
221221
}

lib/ClangImporter/ImportDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8044,7 +8044,7 @@ GenericSignature *ClangImporter::Implementation::buildGenericSignature(
80448044
// Calculate the generic environment from an imported generic param list.
80458045
GenericEnvironment *ClangImporter::Implementation::buildGenericEnvironment(
80468046
GenericParamList *genericParams, DeclContext *dc) {
8047-
return buildGenericSignature(genericParams, dc)->createGenericEnvironment();
8047+
return buildGenericSignature(genericParams, dc)->getGenericEnvironment();
80488048
}
80498049

80508050
DeclContext *

lib/IRGen/GenKeyPath.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1159,7 +1159,7 @@ IRGenModule::getAddrOfKeyPathPattern(KeyPathPattern *pattern,
11591159

11601160
GenericEnvironment *genericEnv = nullptr;
11611161
if (auto sig = pattern->getGenericSignature()) {
1162-
genericEnv = sig->createGenericEnvironment();
1162+
genericEnv = sig->getGenericEnvironment();
11631163
enumerateGenericSignatureRequirements(pattern->getGenericSignature(),
11641164
[&](GenericRequirement reqt) { requirements.push_back(reqt); });
11651165
}

lib/IRGen/GenReflection.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ getTypeRefByFunction(IRGenModule &IGM,
231231
if (sig) {
232232
enumerateGenericSignatureRequirements(sig,
233233
[&](GenericRequirement reqt) { requirements.push_back(reqt); });
234-
genericEnv = sig->createGenericEnvironment();
234+
genericEnv = sig->getGenericEnvironment();
235235
}
236236

237237
{
@@ -362,7 +362,7 @@ IRGenModule::emitWitnessTableRefString(CanType type,
362362
genericSig = origGenericSig->getCanonicalSignature();
363363
enumerateGenericSignatureRequirements(genericSig,
364364
[&](GenericRequirement reqt) { requirements.push_back(reqt); });
365-
genericEnv = genericSig->createGenericEnvironment();
365+
genericEnv = genericSig->getGenericEnvironment();
366366
}
367367

368368
IRGenMangler mangler;

0 commit comments

Comments
 (0)