(De-)serialized ProtocolConformance::DefaultedDefinitions.

Swift SVN r6166
This commit is contained in:
Doug Gregor
2013-07-11 18:34:03 +00:00
parent b9aca28a27
commit bb2046c37b
3 changed files with 16 additions and 2 deletions

View File

@@ -181,11 +181,12 @@ ProtocolConformance *ModuleFile::maybeReadConformance() {
return nullptr;
lastRecordOffset.reset();
unsigned valueCount, typeCount, inheritedCount;
unsigned valueCount, typeCount, inheritedCount, defaultedCount;
ArrayRef<uint64_t> rawIDs;
ProtocolConformanceLayout::readRecord(scratch, valueCount, typeCount,
inheritedCount, rawIDs);
inheritedCount, defaultedCount,
rawIDs);
ProtocolConformance *conformance =
ModuleContext->Ctx.Allocate<ProtocolConformance>(1);
@@ -219,6 +220,12 @@ ProtocolConformance *ModuleFile::maybeReadConformance() {
conformance->InheritedMapping.insert(std::make_pair(proto, inherited));
}
while (defaultedCount--) {
BCOffsetRAII restoreOffset(DeclTypeCursor);
auto decl = cast<ValueDecl>(getDecl(*rawIDIter++));
conformance->DefaultedDefinitions.insert(decl);
}
return conformance;
}

View File

@@ -553,6 +553,7 @@ namespace decls_block {
BCVBR<5>, // value mapping count
BCVBR<5>, // type mapping count
BCVBR<5>, // inherited conformances count
BCVBR<5>, // defaulted definitions count
BCArray<DeclIDField>
// The array contains value-value pairs, then type-type pairs,
// then protocol IDs. The additional conformances trail the record.

View File

@@ -645,6 +645,7 @@ Serializer::writeConformances(ArrayRef<ProtocolConformance *> conformances) {
for (auto conformance : conformances) {
SmallVector<DeclID, 16> data;
SmallVector<ProtocolConformance *, 8> inherited;
unsigned numDefaultedDefinitions = 0;
for (auto valueMapping : conformance->Mapping) {
data.push_back(addDeclRef(valueMapping.first));
data.push_back(addDeclRef(valueMapping.second));
@@ -657,11 +658,16 @@ Serializer::writeConformances(ArrayRef<ProtocolConformance *> conformances) {
data.push_back(addDeclRef(inheritedMapping.first));
inherited.push_back(inheritedMapping.second);
}
for (auto defaulted : conformance->DefaultedDefinitions) {
data.push_back(addDeclRef(defaulted));
++numDefaultedDefinitions;
}
ProtocolConformanceLayout::emitRecord(Out, ScratchRecord, abbrCode,
conformance->Mapping.size(),
conformance->TypeMapping.size(),
conformance->InheritedMapping.size(),
numDefaultedDefinitions,
data);
writeConformances(inherited);
}