Skip to content

Commit 9f80d71

Browse files
committed
[Serialization] Move various RAII-based setup into DeclDeserializer
No functionality change.
1 parent 8c06223 commit 9f80d71

File tree

1 file changed

+47
-89
lines changed

1 file changed

+47
-89
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 47 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -2233,69 +2233,16 @@ class swift::DeclDeserializer {
22332233
using Serialized = ModuleFile::Serialized<T>;
22342234
using TypeID = serialization::TypeID;
22352235

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-
22932236
ModuleFile &MF;
22942237
Serialized<Decl *> &declOrOffset;
22952238

22962239
DeclAttribute *DAttrs = nullptr;
22972240
DeclAttribute **AttrsNext = &DAttrs;
22982241

2242+
Identifier privateDiscriminator;
2243+
unsigned localDiscriminator = 0;
2244+
Identifier filenameForPrivate;
2245+
22992246
void AddAttribute(DeclAttribute *Attr) {
23002247
// Advance the linked list.
23012248
// This isn't just using DeclAttributes because that would result in the
@@ -2309,14 +2256,39 @@ class swift::DeclDeserializer {
23092256
DeclDeserializer(ModuleFile &MF, Serialized<Decl *> &declOrOffset)
23102257
: MF(MF), declOrOffset(declOrOffset) {}
23112258

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+
23122288
/// Deserializes decl attribute and attribute-like records from
23132289
/// \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();
23202292

23212293
static Expected<Decl *> getDeclCheckedImpl(ModuleFile &MF, DeclID DID);
23222294
Expected<Decl *> getDeclCheckedImpl();
@@ -2402,13 +2374,10 @@ static bool attributeChainContains(DeclAttribute *attr) {
24022374
return tempAttrs.hasAttribute<DERIVED>();
24032375
}
24042376

2405-
llvm::Error DeclDeserializer::deserializeDeclAttributes(
2406-
ASTContext &ctx,
2407-
FilenameForPrivateRAII &filenameForPrivate,
2408-
LocalDiscriminatorRAII &localDiscriminatorRAII,
2409-
PrivateDiscriminatorRAII &privateDiscriminatorRAII) {
2377+
llvm::Error DeclDeserializer::deserializeDeclAttributes() {
24102378
using namespace decls_block;
24112379

2380+
ASTContext &ctx = MF.getContext();
24122381
SmallVector<uint64_t, 64> scratch;
24132382
StringRef blobData;
24142383
while (true) {
@@ -2658,16 +2627,16 @@ llvm::Error DeclDeserializer::deserializeDeclAttributes(
26582627
IdentifierID discriminatorID;
26592628
decls_block::PrivateDiscriminatorLayout::readRecord(scratch,
26602629
discriminatorID);
2661-
privateDiscriminatorRAII.discriminator = MF.getIdentifier(discriminatorID);
2630+
privateDiscriminator = MF.getIdentifier(discriminatorID);
26622631

26632632
} else if (recordID == decls_block::LOCAL_DISCRIMINATOR) {
26642633
unsigned discriminator;
26652634
decls_block::LocalDiscriminatorLayout::readRecord(scratch, discriminator);
2666-
localDiscriminatorRAII.discriminator = discriminator;
2635+
localDiscriminator = discriminator;
26672636
} else if (recordID == decls_block::FILENAME_FOR_PRIVATE) {
26682637
IdentifierID filenameID;
26692638
decls_block::FilenameForPrivateLayout::readRecord(scratch, filenameID);
2670-
filenameForPrivate.filename = MF.getIdentifier(filenameID);
2639+
filenameForPrivate = MF.getIdentifier(filenameID);
26712640
} else {
26722641
return llvm::Error::success();
26732642
}
@@ -2693,6 +2662,7 @@ DeclDeserializer::getDeclCheckedImpl(ModuleFile &MF, DeclID DID) {
26932662
BCOffsetRAII restoreOffset(MF.DeclTypeCursor);
26942663
MF.DeclTypeCursor.JumpToBit(declOrOffset);
26952664

2665+
ModuleFile::DeserializingEntityRAII deserializingEntity(MF);
26962666
return DeclDeserializer(MF, declOrOffset).getDeclCheckedImpl();
26972667
}
26982668

@@ -2703,11 +2673,6 @@ DeclDeserializer::getDeclCheckedImpl() {
27032673
if (auto s = ctx.Stats)
27042674
s->getFrontendCounters().NumDeclsDeserialized++;
27052675

2706-
PrivateDiscriminatorRAII privateDiscriminatorRAII{MF, declOrOffset};
2707-
LocalDiscriminatorRAII localDiscriminatorRAII(declOrOffset);
2708-
ModuleFile::DeserializingEntityRAII deserializingEntity(MF);
2709-
FilenameForPrivateRAII filenameForPrivate(declOrOffset);
2710-
27112676
// Local function that handles the "inherited" list for a type.
27122677
auto handleInherited
27132678
= [&](TypeDecl *nominal, ArrayRef<uint64_t> rawInheritedIDs) {
@@ -2719,22 +2684,15 @@ DeclDeserializer::getDeclCheckedImpl() {
27192684
nominal->setInherited(inheritedTypes);
27202685
};
27212686

2722-
auto attrError = deserializeDeclAttributes(ctx,
2723-
filenameForPrivate,
2724-
localDiscriminatorRAII,
2725-
privateDiscriminatorRAII);
2687+
auto attrError = deserializeDeclAttributes();
27262688
if (attrError)
27272689
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);
27342690

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;
27382696

27392697
auto entry = MF.DeclTypeCursor.advance();
27402698
if (entry.Kind != llvm::BitstreamEntry::Record) {

0 commit comments

Comments
 (0)