@@ -2233,69 +2233,16 @@ class swift::DeclDeserializer {
2233
2233
using Serialized = ModuleFile::Serialized<T>;
2234
2234
using TypeID = serialization::TypeID;
2235
2235
2236
- class PrivateDiscriminatorRAII {
2237
- ModuleFile &moduleFile;
2238
- Serialized<Decl *> &declOrOffset;
2239
-
2240
- public:
2241
- Identifier discriminator;
2242
-
2243
- PrivateDiscriminatorRAII (ModuleFile &moduleFile,
2244
- Serialized<Decl *> &declOrOffset)
2245
- : moduleFile(moduleFile), declOrOffset(declOrOffset) {}
2246
-
2247
- ~PrivateDiscriminatorRAII () {
2248
- if (!discriminator.empty () && declOrOffset.isComplete ())
2249
- if (auto value = dyn_cast_or_null<ValueDecl>(declOrOffset.get ()))
2250
- moduleFile.PrivateDiscriminatorsByValue [value] = discriminator;
2251
- }
2252
- };
2253
-
2254
- class LocalDiscriminatorRAII {
2255
- Serialized<Decl *> &declOrOffset;
2256
-
2257
- public:
2258
- unsigned discriminator;
2259
-
2260
- LocalDiscriminatorRAII (Serialized<Decl *> &declOrOffset)
2261
- : declOrOffset(declOrOffset), discriminator(0 ) {}
2262
-
2263
- ~LocalDiscriminatorRAII () {
2264
- if (discriminator != 0 && declOrOffset.isComplete ())
2265
- if (auto value = dyn_cast<ValueDecl>(declOrOffset.get ()))
2266
- value->setLocalDiscriminator (discriminator);
2267
- }
2268
- };
2269
-
2270
- class FilenameForPrivateRAII {
2271
- Serialized<Decl *> &declOrOffset;
2272
-
2273
- public:
2274
- Identifier filename;
2275
-
2276
- FilenameForPrivateRAII (Serialized<Decl *> &decl) : declOrOffset(decl) {}
2277
- ~FilenameForPrivateRAII () {
2278
- if (filename.empty ())
2279
- return ;
2280
- if (!declOrOffset.isComplete ())
2281
- return ;
2282
- auto *valueDecl = dyn_cast<ValueDecl>(declOrOffset.get ());
2283
- if (!valueDecl)
2284
- return ;
2285
- auto *loadedFile = dyn_cast<LoadedFile>(
2286
- valueDecl->getDeclContext ()->getModuleScopeContext ());
2287
- if (!loadedFile)
2288
- return ;
2289
- loadedFile->addFilenameForPrivateDecl (valueDecl, filename);
2290
- }
2291
- };
2292
-
2293
2236
ModuleFile &MF;
2294
2237
Serialized<Decl *> &declOrOffset;
2295
2238
2296
2239
DeclAttribute *DAttrs = nullptr ;
2297
2240
DeclAttribute **AttrsNext = &DAttrs;
2298
2241
2242
+ Identifier privateDiscriminator;
2243
+ unsigned localDiscriminator = 0 ;
2244
+ Identifier filenameForPrivate;
2245
+
2299
2246
void AddAttribute (DeclAttribute *Attr) {
2300
2247
// Advance the linked list.
2301
2248
// This isn't just using DeclAttributes because that would result in the
@@ -2309,14 +2256,39 @@ class swift::DeclDeserializer {
2309
2256
DeclDeserializer (ModuleFile &MF, Serialized<Decl *> &declOrOffset)
2310
2257
: MF(MF), declOrOffset(declOrOffset) {}
2311
2258
2259
+ ~DeclDeserializer () {
2260
+ if (!declOrOffset.isComplete ()) {
2261
+ // We failed to deserialize this declaration.
2262
+ return ;
2263
+ }
2264
+
2265
+ Decl *decl = declOrOffset.get ();
2266
+ if (!decl)
2267
+ return ;
2268
+
2269
+ if (DAttrs)
2270
+ decl->getAttrs ().setRawAttributeChain (DAttrs);
2271
+
2272
+ if (auto value = dyn_cast<ValueDecl>(decl)) {
2273
+ if (!privateDiscriminator.empty ())
2274
+ MF.PrivateDiscriminatorsByValue [value] = privateDiscriminator;
2275
+
2276
+ if (localDiscriminator != 0 )
2277
+ value->setLocalDiscriminator (localDiscriminator);
2278
+
2279
+ if (!filenameForPrivate.empty ()) {
2280
+ auto *loadedFile = cast<LoadedFile>(MF.getFile ());
2281
+ loadedFile->addFilenameForPrivateDecl (value, filenameForPrivate);
2282
+ }
2283
+ }
2284
+
2285
+ decl->setValidationToChecked ();
2286
+ }
2287
+
2312
2288
// / Deserializes decl attribute and attribute-like records from
2313
2289
// / \c MF.DeclTypesCursor until a non-attribute record is found,
2314
- // / passing each one to \p AddAttribute.
2315
- llvm::Error deserializeDeclAttributes (
2316
- ASTContext &ctx,
2317
- FilenameForPrivateRAII &filenameForPrivate,
2318
- LocalDiscriminatorRAII &localDiscriminatorRAII,
2319
- PrivateDiscriminatorRAII &privateDiscriminatorRAII);
2290
+ // / passing each one to AddAttribute.
2291
+ llvm::Error deserializeDeclAttributes ();
2320
2292
2321
2293
static Expected<Decl *> getDeclCheckedImpl (ModuleFile &MF, DeclID DID);
2322
2294
Expected<Decl *> getDeclCheckedImpl ();
@@ -2402,13 +2374,10 @@ static bool attributeChainContains(DeclAttribute *attr) {
2402
2374
return tempAttrs.hasAttribute <DERIVED>();
2403
2375
}
2404
2376
2405
- llvm::Error DeclDeserializer::deserializeDeclAttributes (
2406
- ASTContext &ctx,
2407
- FilenameForPrivateRAII &filenameForPrivate,
2408
- LocalDiscriminatorRAII &localDiscriminatorRAII,
2409
- PrivateDiscriminatorRAII &privateDiscriminatorRAII) {
2377
+ llvm::Error DeclDeserializer::deserializeDeclAttributes () {
2410
2378
using namespace decls_block ;
2411
2379
2380
+ ASTContext &ctx = MF.getContext ();
2412
2381
SmallVector<uint64_t , 64 > scratch;
2413
2382
StringRef blobData;
2414
2383
while (true ) {
@@ -2658,16 +2627,16 @@ llvm::Error DeclDeserializer::deserializeDeclAttributes(
2658
2627
IdentifierID discriminatorID;
2659
2628
decls_block::PrivateDiscriminatorLayout::readRecord (scratch,
2660
2629
discriminatorID);
2661
- privateDiscriminatorRAII. discriminator = MF.getIdentifier (discriminatorID);
2630
+ privateDiscriminator = MF.getIdentifier (discriminatorID);
2662
2631
2663
2632
} else if (recordID == decls_block::LOCAL_DISCRIMINATOR) {
2664
2633
unsigned discriminator;
2665
2634
decls_block::LocalDiscriminatorLayout::readRecord (scratch, discriminator);
2666
- localDiscriminatorRAII. discriminator = discriminator;
2635
+ localDiscriminator = discriminator;
2667
2636
} else if (recordID == decls_block::FILENAME_FOR_PRIVATE) {
2668
2637
IdentifierID filenameID;
2669
2638
decls_block::FilenameForPrivateLayout::readRecord (scratch, filenameID);
2670
- filenameForPrivate. filename = MF.getIdentifier (filenameID);
2639
+ filenameForPrivate = MF.getIdentifier (filenameID);
2671
2640
} else {
2672
2641
return llvm::Error::success ();
2673
2642
}
@@ -2693,6 +2662,7 @@ DeclDeserializer::getDeclCheckedImpl(ModuleFile &MF, DeclID DID) {
2693
2662
BCOffsetRAII restoreOffset (MF.DeclTypeCursor );
2694
2663
MF.DeclTypeCursor .JumpToBit (declOrOffset);
2695
2664
2665
+ ModuleFile::DeserializingEntityRAII deserializingEntity (MF);
2696
2666
return DeclDeserializer (MF, declOrOffset).getDeclCheckedImpl ();
2697
2667
}
2698
2668
@@ -2703,11 +2673,6 @@ DeclDeserializer::getDeclCheckedImpl() {
2703
2673
if (auto s = ctx.Stats )
2704
2674
s->getFrontendCounters ().NumDeclsDeserialized ++;
2705
2675
2706
- PrivateDiscriminatorRAII privateDiscriminatorRAII{MF, declOrOffset};
2707
- LocalDiscriminatorRAII localDiscriminatorRAII (declOrOffset);
2708
- ModuleFile::DeserializingEntityRAII deserializingEntity (MF);
2709
- FilenameForPrivateRAII filenameForPrivate (declOrOffset);
2710
-
2711
2676
// Local function that handles the "inherited" list for a type.
2712
2677
auto handleInherited
2713
2678
= [&](TypeDecl *nominal, ArrayRef<uint64_t > rawInheritedIDs) {
@@ -2719,22 +2684,15 @@ DeclDeserializer::getDeclCheckedImpl() {
2719
2684
nominal->setInherited (inheritedTypes);
2720
2685
};
2721
2686
2722
- auto attrError = deserializeDeclAttributes (ctx,
2723
- filenameForPrivate,
2724
- localDiscriminatorRAII,
2725
- privateDiscriminatorRAII);
2687
+ auto attrError = deserializeDeclAttributes ();
2726
2688
if (attrError)
2727
2689
return std::move (attrError);
2728
- SWIFT_DEFER {
2729
- // Record the attributes.
2730
- auto decl = declOrOffset.get ();
2731
- if (decl && !decl->hasValidationStarted ()) {
2732
- if (DAttrs)
2733
- declOrOffset.get ()->getAttrs ().setRawAttributeChain (DAttrs);
2734
2690
2735
- decl->setValidationToChecked ();
2736
- }
2737
- };
2691
+ // FIXME: @_dynamicReplacement(for:) includes a reference to another decl,
2692
+ // usually in the same type, and that can result in this decl being
2693
+ // re-entrantly deserialized. If that happens, don't fail here.
2694
+ if (declOrOffset.isComplete ())
2695
+ return declOrOffset;
2738
2696
2739
2697
auto entry = MF.DeclTypeCursor .advance ();
2740
2698
if (entry.Kind != llvm::BitstreamEntry::Record) {
0 commit comments