Skip to content

Commit e540874

Browse files
committed
[Serialization] Move one case in getDeclCheckedImpl out of line
...as a proof of concept. The next commit will move them /all/ out of line. (The intent here is to produce better backtraces when not recovering from errors.)
1 parent b5a86cf commit e540874

File tree

1 file changed

+66
-57
lines changed

1 file changed

+66
-57
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 66 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -2303,6 +2303,59 @@ class swift::ASTDeserializer {
23032303
PrivateDiscriminatorRAII &privateDiscriminatorRAII);
23042304

23052305
Expected<Decl *> getDeclCheckedImpl(DeclID DID);
2306+
2307+
Expected<Decl *> deserializeTypeAlias(Serialized<Decl *> &declOrOffset,
2308+
ArrayRef<uint64_t> scratch,
2309+
StringRef blobData) {
2310+
IdentifierID nameID;
2311+
DeclContextID contextID;
2312+
TypeID underlyingTypeID, interfaceTypeID;
2313+
bool isImplicit;
2314+
GenericEnvironmentID genericEnvID;
2315+
uint8_t rawAccessLevel;
2316+
ArrayRef<uint64_t> dependencyIDs;
2317+
2318+
decls_block::TypeAliasLayout::readRecord(scratch, nameID, contextID,
2319+
underlyingTypeID, interfaceTypeID,
2320+
isImplicit, genericEnvID,
2321+
rawAccessLevel, dependencyIDs);
2322+
2323+
Identifier name = MF.getIdentifier(nameID);
2324+
2325+
for (TypeID dependencyID : dependencyIDs) {
2326+
auto dependency = MF.getTypeChecked(dependencyID);
2327+
if (!dependency) {
2328+
return llvm::make_error<TypeError>(
2329+
name, takeErrorInfo(dependency.takeError()));
2330+
}
2331+
}
2332+
2333+
auto DC = MF.getDeclContext(contextID);
2334+
2335+
auto genericParams = MF.maybeReadGenericParams(DC);
2336+
if (declOrOffset.isComplete())
2337+
return declOrOffset;
2338+
2339+
auto alias = MF.createDecl<TypeAliasDecl>(SourceLoc(), SourceLoc(), name,
2340+
SourceLoc(), genericParams, DC);
2341+
declOrOffset = alias;
2342+
2343+
MF.configureGenericEnvironment(alias, genericEnvID);
2344+
2345+
alias->setUnderlyingType(MF.getType(underlyingTypeID));
2346+
2347+
if (auto accessLevel = getActualAccessLevel(rawAccessLevel)) {
2348+
alias->setAccess(*accessLevel);
2349+
} else {
2350+
MF.error();
2351+
return nullptr;
2352+
}
2353+
2354+
if (isImplicit)
2355+
alias->setImplicit();
2356+
2357+
return alias;
2358+
}
23062359
};
23072360

23082361
Expected<Decl *>
@@ -2663,6 +2716,16 @@ ASTDeserializer::getDeclCheckedImpl(DeclID DID) {
26632716
privateDiscriminatorRAII);
26642717
if (attrError)
26652718
return std::move(attrError);
2719+
SWIFT_DEFER {
2720+
// Record the attributes.
2721+
auto decl = declOrOffset.get();
2722+
if (decl && !decl->hasValidationStarted()) {
2723+
if (DAttrs)
2724+
declOrOffset.get()->getAttrs().setRawAttributeChain(DAttrs);
2725+
2726+
decl->setValidationToChecked();
2727+
}
2728+
};
26662729

26672730
auto entry = MF.DeclTypeCursor.advance();
26682731
if (entry.Kind != llvm::BitstreamEntry::Record) {
@@ -2680,56 +2743,8 @@ ASTDeserializer::getDeclCheckedImpl(DeclID DID) {
26802743
&MF, declOrOffset, DID, static_cast<decls_block::RecordKind>(recordID));
26812744

26822745
switch (recordID) {
2683-
case decls_block::TYPE_ALIAS_DECL: {
2684-
IdentifierID nameID;
2685-
DeclContextID contextID;
2686-
TypeID underlyingTypeID, interfaceTypeID;
2687-
bool isImplicit;
2688-
GenericEnvironmentID genericEnvID;
2689-
uint8_t rawAccessLevel;
2690-
ArrayRef<uint64_t> dependencyIDs;
2691-
2692-
decls_block::TypeAliasLayout::readRecord(scratch, nameID, contextID,
2693-
underlyingTypeID, interfaceTypeID,
2694-
isImplicit, genericEnvID,
2695-
rawAccessLevel, dependencyIDs);
2696-
2697-
Identifier name = MF.getIdentifier(nameID);
2698-
2699-
for (TypeID dependencyID : dependencyIDs) {
2700-
auto dependency = MF.getTypeChecked(dependencyID);
2701-
if (!dependency) {
2702-
return llvm::make_error<TypeError>(
2703-
name, takeErrorInfo(dependency.takeError()));
2704-
}
2705-
}
2706-
2707-
auto DC = MF.getDeclContext(contextID);
2708-
2709-
auto genericParams = MF.maybeReadGenericParams(DC);
2710-
if (declOrOffset.isComplete())
2711-
return declOrOffset;
2712-
2713-
auto alias = MF.createDecl<TypeAliasDecl>(SourceLoc(), SourceLoc(), name,
2714-
SourceLoc(), genericParams, DC);
2715-
declOrOffset = alias;
2716-
2717-
MF.configureGenericEnvironment(alias, genericEnvID);
2718-
2719-
alias->setUnderlyingType(MF.getType(underlyingTypeID));
2720-
2721-
if (auto accessLevel = getActualAccessLevel(rawAccessLevel)) {
2722-
alias->setAccess(*accessLevel);
2723-
} else {
2724-
MF.error();
2725-
return nullptr;
2726-
}
2727-
2728-
if (isImplicit)
2729-
alias->setImplicit();
2730-
2731-
break;
2732-
}
2746+
case decls_block::TypeAliasLayout::Code:
2747+
return deserializeTypeAlias(declOrOffset, scratch, blobData);
27332748

27342749
case decls_block::GENERIC_TYPE_PARAM_DECL: {
27352750
IdentifierID nameID;
@@ -4120,13 +4135,7 @@ ASTDeserializer::getDeclCheckedImpl(DeclID DID) {
41204135
return nullptr;
41214136
}
41224137

4123-
// Record the attributes.
4124-
if (DAttrs)
4125-
declOrOffset.get()->getAttrs().setRawAttributeChain(DAttrs);
4126-
4127-
auto decl = declOrOffset.get();
4128-
decl->setValidationToChecked();
4129-
return decl;
4138+
return declOrOffset.get();
41304139
}
41314140

41324141
/// Translate from the Serialization function type repr enum values to the AST

0 commit comments

Comments
 (0)