@@ -100,6 +100,52 @@ using AssociativityCacheType =
100
100
MACRO(NSNumber) \
101
101
MACRO(NSValue)
102
102
103
+ struct OverrideSignatureKey {
104
+ GenericSignature *baseMethodSig;
105
+ GenericSignature *derivedClassSig;
106
+ Type superclassTy;
107
+
108
+ OverrideSignatureKey (GenericSignature *baseMethodSignature,
109
+ GenericSignature *derivedClassSignature,
110
+ Type superclassType)
111
+ : baseMethodSig (baseMethodSignature),
112
+ derivedClassSig (derivedClassSignature), superclassTy (superclassType) {}
113
+ };
114
+
115
+ namespace llvm {
116
+ template <> struct DenseMapInfo <OverrideSignatureKey> {
117
+ using Type = swift::Type;
118
+ using GenericSignature = swift::GenericSignature;
119
+
120
+ static bool isEqual (const OverrideSignatureKey lhs,
121
+ const OverrideSignatureKey rhs) {
122
+ return lhs.baseMethodSig == rhs.baseMethodSig &&
123
+ lhs.derivedClassSig == rhs.derivedClassSig &&
124
+ lhs.superclassTy .getPointer () == rhs.superclassTy .getPointer ();
125
+ }
126
+
127
+ static inline OverrideSignatureKey getEmptyKey () {
128
+ return OverrideSignatureKey (DenseMapInfo<GenericSignature *>::getEmptyKey (),
129
+ DenseMapInfo<GenericSignature *>::getEmptyKey (),
130
+ DenseMapInfo<Type>::getEmptyKey ());
131
+ }
132
+
133
+ static inline OverrideSignatureKey getTombstoneKey () {
134
+ return OverrideSignatureKey (
135
+ DenseMapInfo<GenericSignature *>::getTombstoneKey (),
136
+ DenseMapInfo<GenericSignature *>::getTombstoneKey (),
137
+ DenseMapInfo<Type>::getTombstoneKey ());
138
+ }
139
+
140
+ static unsigned getHashValue (const OverrideSignatureKey &Val) {
141
+ return hash_combine (
142
+ DenseMapInfo<GenericSignature *>::getHashValue (Val.baseMethodSig ),
143
+ DenseMapInfo<GenericSignature *>::getHashValue (Val.derivedClassSig ),
144
+ DenseMapInfo<Type>::getHashValue (Val.superclassTy ));
145
+ }
146
+ };
147
+ } // namespace llvm
148
+
103
149
struct ASTContext ::Implementation {
104
150
Implementation ();
105
151
~Implementation ();
@@ -422,6 +468,8 @@ FOR_KNOWN_FOUNDATION_TYPES(CACHE_FOUNDATION_DECL)
422
468
llvm::FoldingSet<SILLayout> SILLayouts;
423
469
424
470
RC<syntax::SyntaxArena> TheSyntaxArena;
471
+
472
+ llvm::DenseMap<OverrideSignatureKey, GenericSignature *> overrideSigCache;
425
473
};
426
474
427
475
ASTContext::Implementation::Implementation ()
@@ -4383,8 +4431,9 @@ GenericSignature *ASTContext::getOverrideGenericSignature(ValueDecl *base,
4383
4431
derivedClass->getGenericSignature (),
4384
4432
derivedClass->getSuperclass ());
4385
4433
4386
- if (overrideSigCache.count (key) == 1 ) {
4387
- return overrideSigCache.lookup (key);
4434
+ if (getImpl ().overrideSigCache .find (key) !=
4435
+ getImpl ().overrideSigCache .end ()) {
4436
+ return getImpl ().overrideSigCache .lookup (key);
4388
4437
}
4389
4438
4390
4439
if (auto *derivedSig = derivedClass->getGenericSignature ())
@@ -4437,7 +4486,7 @@ GenericSignature *ASTContext::getOverrideGenericSignature(ValueDecl *base,
4437
4486
}
4438
4487
4439
4488
auto *genericSig = std::move (builder).computeGenericSignature (SourceLoc ());
4440
- overrideSigCache.insert (std::make_pair (key, genericSig));
4489
+ getImpl (). overrideSigCache .insert (std::make_pair (key, genericSig));
4441
4490
return genericSig;
4442
4491
}
4443
4492
0 commit comments