(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; return nullptr;
lastRecordOffset.reset(); lastRecordOffset.reset();
unsigned valueCount, typeCount, inheritedCount; unsigned valueCount, typeCount, inheritedCount, defaultedCount;
ArrayRef<uint64_t> rawIDs; ArrayRef<uint64_t> rawIDs;
ProtocolConformanceLayout::readRecord(scratch, valueCount, typeCount, ProtocolConformanceLayout::readRecord(scratch, valueCount, typeCount,
inheritedCount, rawIDs); inheritedCount, defaultedCount,
rawIDs);
ProtocolConformance *conformance = ProtocolConformance *conformance =
ModuleContext->Ctx.Allocate<ProtocolConformance>(1); ModuleContext->Ctx.Allocate<ProtocolConformance>(1);
@@ -219,6 +220,12 @@ ProtocolConformance *ModuleFile::maybeReadConformance() {
conformance->InheritedMapping.insert(std::make_pair(proto, inherited)); 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; return conformance;
} }

View File

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

View File

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