@@ -1180,27 +1180,28 @@ swift::swift_getObjCClassFromMetadataConditional(const Metadata *theMetadata) {
1180
1180
1181
1181
namespace {
1182
1182
1183
- class MetadataPackCacheEntry {
1183
+ template <typename PackType>
1184
+ class PackCacheEntry {
1184
1185
public:
1185
1186
size_t Count;
1186
1187
1187
- const Metadata * const * getElements () const {
1188
- return reinterpret_cast <const Metadata * const *>(this + 1 );
1188
+ const PackType * const * getElements () const {
1189
+ return reinterpret_cast <const PackType * const *>(this + 1 );
1189
1190
}
1190
1191
1191
- const Metadata ** getElements () {
1192
- return reinterpret_cast <const Metadata **>(this + 1 );
1192
+ const PackType ** getElements () {
1193
+ return reinterpret_cast <const PackType **>(this + 1 );
1193
1194
}
1194
1195
1195
1196
struct Key {
1196
- const Metadata *const *Data;
1197
+ const PackType *const *Data;
1197
1198
const size_t Count;
1198
1199
1199
1200
size_t getCount () const {
1200
1201
return Count;
1201
1202
}
1202
1203
1203
- const Metadata *getElement (size_t index) const {
1204
+ const PackType *getElement (size_t index) const {
1204
1205
assert (index < Count);
1205
1206
return Data[index];
1206
1207
}
@@ -1213,7 +1214,7 @@ class MetadataPackCacheEntry {
1213
1214
}
1214
1215
};
1215
1216
1216
- MetadataPackCacheEntry (const Key &key);
1217
+ PackCacheEntry (const Key &key);
1217
1218
1218
1219
intptr_t getKeyIntValueForDump () {
1219
1220
return 0 ; // No single meaningful value here.
@@ -1229,7 +1230,7 @@ class MetadataPackCacheEntry {
1229
1230
return true ;
1230
1231
}
1231
1232
1232
- friend llvm::hash_code hash_value (const MetadataPackCacheEntry &value) {
1233
+ friend llvm::hash_code hash_value (const PackCacheEntry<PackType> &value) {
1233
1234
llvm::hash_code hash = 0 ;
1234
1235
for (size_t i = 0 ; i != value.Count ; ++i)
1235
1236
hash = llvm::hash_combine (hash, value.getElements ()[i]);
@@ -1249,7 +1250,9 @@ class MetadataPackCacheEntry {
1249
1250
}
1250
1251
};
1251
1252
1252
- MetadataPackCacheEntry::MetadataPackCacheEntry (const Key &key) {
1253
+ template <typename PackType>
1254
+ PackCacheEntry<PackType>::PackCacheEntry(
1255
+ const typename PackCacheEntry<PackType>::Key &key) {
1253
1256
Count = key.getCount ();
1254
1257
1255
1258
for (unsigned i = 0 ; i < Count; ++i)
@@ -1259,7 +1262,8 @@ MetadataPackCacheEntry::MetadataPackCacheEntry(const Key &key) {
1259
1262
} // end anonymous namespace
1260
1263
1261
1264
// / The uniquing structure for metadata packs.
1262
- static SimpleGlobalCache<MetadataPackCacheEntry, MetadataPackTag> MetadataPacks;
1265
+ static SimpleGlobalCache<PackCacheEntry<Metadata>,
1266
+ MetadataPackTag> MetadataPacks;
1263
1267
1264
1268
SWIFT_RUNTIME_EXPORT SWIFT_CC (swift)
1265
1269
const Metadata * const *
@@ -1268,25 +1272,25 @@ swift_allocateMetadataPack(const Metadata * const *ptr, size_t count) {
1268
1272
== PackLifetime::OnHeap)
1269
1273
return ptr;
1270
1274
1271
- MetadataPackCacheEntry ::Key key{ptr, count};
1275
+ PackCacheEntry<Metadata> ::Key key{ptr, count};
1272
1276
auto bytes = MetadataPacks.getOrInsert (key).first ->getElements ();
1273
1277
1274
1278
return MetadataPackPointer (bytes, PackLifetime::OnHeap).getPointer ();
1275
1279
}
1276
1280
1281
+ // / The uniquing structure for witness table packs.
1282
+ static SimpleGlobalCache<PackCacheEntry<WitnessTable>,
1283
+ WitnessTablePackTag> WitnessTablePacks;
1284
+
1277
1285
SWIFT_RUNTIME_EXPORT SWIFT_CC (swift)
1278
1286
const WitnessTable * const *
1279
1287
swift_allocateWitnessTablePack(const WitnessTable * const *ptr, size_t count) {
1280
1288
if (WitnessTablePackPointer (reinterpret_cast <uintptr_t >(ptr)).getLifetime ()
1281
1289
== PackLifetime::OnHeap)
1282
1290
return ptr;
1283
1291
1284
- size_t totalSize = (size_t ) count * sizeof (const WitnessTable *);
1285
-
1286
- auto bytes = (const WitnessTable **)
1287
- MetadataAllocator (WitnessTablePackTag)
1288
- .Allocate (totalSize, alignof (const WitnessTable *));
1289
- memcpy ((char *) bytes, ptr, totalSize);
1292
+ PackCacheEntry<WitnessTable>::Key key{ptr, count};
1293
+ auto bytes = WitnessTablePacks.getOrInsert (key).first ->getElements ();
1290
1294
1291
1295
return WitnessTablePackPointer (bytes, PackLifetime::OnHeap).getPointer ();
1292
1296
}
0 commit comments