Skip to content

Commit b76774f

Browse files
committed
[Serialization] Sink readMembers into its only caller.
The next commit is going to want to look at the container whose members are being loaded.
1 parent 7397340 commit b76774f

File tree

2 files changed

+46
-63
lines changed

2 files changed

+46
-63
lines changed

include/swift/Serialization/ModuleFile.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -526,15 +526,6 @@ class ModuleFile : public LazyMemberLoader {
526526
GenericContext *genericDecl,
527527
serialization::GenericEnvironmentID envID);
528528

529-
/// Populates the vector with members of a DeclContext from \c DeclTypeCursor.
530-
///
531-
/// Returns true if there is an error.
532-
///
533-
/// Note: this destroys the cursor's position in the stream. Furthermore,
534-
/// because it reads from the cursor, it is not possible to reset the cursor
535-
/// after reading. Nothing should ever follow a MEMBERS record.
536-
bool readMembers(SmallVectorImpl<Decl *> &Members);
537-
538529
/// Populates the protocol's default witness table.
539530
///
540531
/// Returns true if there is an error.

lib/Serialization/Deserialization.cpp

Lines changed: 46 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1235,47 +1235,6 @@ GenericEnvironment *ModuleFile::getGenericEnvironment(
12351235
;
12361236
}
12371237

1238-
bool ModuleFile::readMembers(SmallVectorImpl<Decl *> &Members) {
1239-
using namespace decls_block;
1240-
1241-
auto entry = DeclTypeCursor.advance();
1242-
if (entry.Kind != llvm::BitstreamEntry::Record)
1243-
return true;
1244-
1245-
SmallVector<uint64_t, 16> memberIDBuffer;
1246-
1247-
unsigned kind = DeclTypeCursor.readRecord(entry.ID, memberIDBuffer);
1248-
assert(kind == MEMBERS);
1249-
(void)kind;
1250-
1251-
ArrayRef<uint64_t> rawMemberIDs;
1252-
decls_block::MembersLayout::readRecord(memberIDBuffer, rawMemberIDs);
1253-
1254-
if (rawMemberIDs.empty())
1255-
return false;
1256-
1257-
Members.reserve(rawMemberIDs.size());
1258-
for (DeclID rawID : rawMemberIDs) {
1259-
Expected<Decl *> D = getDeclChecked(rawID);
1260-
if (!D) {
1261-
if (!getContext().LangOpts.EnableDeserializationRecovery)
1262-
fatal(D.takeError());
1263-
1264-
// Silently drop the member if it had an override-related problem.
1265-
llvm::handleAllErrors(D.takeError(),
1266-
[](const OverrideError &) { /* expected */ },
1267-
[this](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
1268-
fatal(std::move(unhandled));
1269-
});
1270-
continue;
1271-
}
1272-
assert(D.get() && "unchecked error deserializing next member");
1273-
Members.push_back(D.get());
1274-
}
1275-
1276-
return false;
1277-
}
1278-
12791238
bool ModuleFile::readDefaultWitnessTable(ProtocolDecl *proto) {
12801239
using namespace decls_block;
12811240

@@ -2834,7 +2793,7 @@ ModuleFile::getDeclChecked(DeclID DID, Optional<DeclContext *> ForcedContext) {
28342793
if (!overridden) {
28352794
llvm::handleAllErrors(overridden.takeError(),
28362795
[](const XRefError &) { /* expected */ },
2837-
[this](std::unique_ptr<llvm::ErrorInfoBase> unhandled){
2796+
[this](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
28382797
fatal(std::move(unhandled));
28392798
});
28402799
return llvm::make_error<OverrideError>(name);
@@ -4432,28 +4391,61 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
44324391
return typeOrOffset;
44334392
}
44344393

4435-
void ModuleFile::loadAllMembers(Decl *D, uint64_t contextData) {
4436-
PrettyStackTraceDecl trace("loading members for", D);
4394+
void ModuleFile::loadAllMembers(Decl *container, uint64_t contextData) {
4395+
PrettyStackTraceDecl trace("loading members for", container);
44374396
++NumMemberListsLoaded;
44384397

4398+
IterableDeclContext *IDC;
4399+
if (auto *nominal = dyn_cast<NominalTypeDecl>(container))
4400+
IDC = nominal;
4401+
else
4402+
IDC = cast<ExtensionDecl>(container);
4403+
44394404
BCOffsetRAII restoreOffset(DeclTypeCursor);
44404405
DeclTypeCursor.JumpToBit(contextData);
4406+
auto entry = DeclTypeCursor.advance();
4407+
if (entry.Kind != llvm::BitstreamEntry::Record) {
4408+
error();
4409+
return;
4410+
}
4411+
4412+
SmallVector<uint64_t, 16> memberIDBuffer;
4413+
4414+
unsigned kind = DeclTypeCursor.readRecord(entry.ID, memberIDBuffer);
4415+
assert(kind == decls_block::MEMBERS);
4416+
(void)kind;
4417+
4418+
ArrayRef<uint64_t> rawMemberIDs;
4419+
decls_block::MembersLayout::readRecord(memberIDBuffer, rawMemberIDs);
4420+
4421+
if (rawMemberIDs.empty())
4422+
return;
4423+
44414424
SmallVector<Decl *, 16> members;
4442-
bool Err = readMembers(members);
4443-
assert(!Err && "unable to read members");
4444-
(void)Err;
4425+
members.reserve(rawMemberIDs.size());
4426+
for (DeclID rawID : rawMemberIDs) {
4427+
Expected<Decl *> next = getDeclChecked(rawID);
4428+
if (!next) {
4429+
if (!getContext().LangOpts.EnableDeserializationRecovery)
4430+
fatal(next.takeError());
44454431

4446-
IterableDeclContext *IDC;
4447-
if (auto *nominal = dyn_cast<NominalTypeDecl>(D))
4448-
IDC = nominal;
4449-
else
4450-
IDC = cast<ExtensionDecl>(D);
4432+
// Silently drop the member if it had an override-related problem.
4433+
llvm::handleAllErrors(next.takeError(),
4434+
[](const OverrideError &) { /* expected */ },
4435+
[this](std::unique_ptr<llvm::ErrorInfoBase> unhandled) {
4436+
fatal(std::move(unhandled));
4437+
});
4438+
continue;
4439+
}
4440+
assert(next.get() && "unchecked error deserializing next member");
4441+
members.push_back(next.get());
4442+
}
44514443

44524444
for (auto member : members)
44534445
IDC->addMember(member);
44544446

4455-
if (auto *proto = dyn_cast<ProtocolDecl>(D)) {
4456-
PrettyStackTraceDecl trace("reading default witness table for", D);
4447+
if (auto *proto = dyn_cast<ProtocolDecl>(container)) {
4448+
PrettyStackTraceDecl trace("reading default witness table for", proto);
44574449
bool Err = readDefaultWitnessTable(proto);
44584450
assert(!Err && "unable to read default witness table");
44594451
(void)Err;

0 commit comments

Comments
 (0)