@@ -1717,6 +1717,35 @@ ModuleFile::getSubstitutionMapChecked(serialization::SubstitutionMapID id) {
17171717 return substitutions;
17181718}
17191719
1720+ bool ModuleFile::readInheritedProtocols (
1721+ SmallVectorImpl<ProtocolDecl *> &inherited) {
1722+ using namespace decls_block ;
1723+
1724+ BCOffsetRAII lastRecordOffset (DeclTypeCursor);
1725+
1726+ llvm::BitstreamEntry entry =
1727+ fatalIfUnexpected (DeclTypeCursor.advance (AF_DontPopBlockAtEnd));
1728+ if (entry.Kind != llvm::BitstreamEntry::Record)
1729+ return false ;
1730+
1731+ SmallVector<uint64_t , 8 > scratch;
1732+ unsigned recordID =
1733+ fatalIfUnexpected (DeclTypeCursor.readRecord (entry.ID , scratch));
1734+ if (recordID != INHERITED_PROTOCOLS)
1735+ return false ;
1736+
1737+ lastRecordOffset.reset ();
1738+
1739+ ArrayRef<uint64_t > inheritedIDs;
1740+ InheritedProtocolsLayout::readRecord (scratch, inheritedIDs);
1741+
1742+ llvm::transform (inheritedIDs, std::back_inserter (inherited),
1743+ [&](uint64_t protocolID) {
1744+ return cast<ProtocolDecl>(getDecl (protocolID));
1745+ });
1746+ return true ;
1747+ }
1748+
17201749bool ModuleFile::readDefaultWitnessTable (ProtocolDecl *proto) {
17211750 using namespace decls_block ;
17221751
@@ -4425,21 +4454,19 @@ class DeclDeserializer {
44254454 bool isImplicit, isClassBounded, isObjC, hasSelfOrAssocTypeRequirements;
44264455 TypeID superclassID;
44274456 uint8_t rawAccessLevel;
4428- unsigned numInheritedTypes;
4429- ArrayRef<uint64_t > rawInheritedAndDependencyIDs;
4457+ ArrayRef<uint64_t > dependencyIDs;
44304458
44314459 decls_block::ProtocolLayout::readRecord (scratch, nameID, contextID,
44324460 isImplicit, isClassBounded, isObjC,
44334461 hasSelfOrAssocTypeRequirements,
44344462 superclassID,
4435- rawAccessLevel, numInheritedTypes,
4436- rawInheritedAndDependencyIDs );
4463+ rawAccessLevel,
4464+ dependencyIDs );
44374465
44384466 Identifier name = MF.getIdentifier (nameID);
44394467 PrettySupplementalDeclNameTrace trace (name);
44404468
4441- for (TypeID dependencyID :
4442- rawInheritedAndDependencyIDs.slice (numInheritedTypes)) {
4469+ for (TypeID dependencyID : dependencyIDs) {
44434470 auto dependency = MF.getTypeChecked (dependencyID);
44444471 if (!dependency) {
44454472 return llvm::make_error<TypeError>(
@@ -4469,14 +4496,17 @@ class DeclDeserializer {
44694496 else
44704497 return MF.diagnoseFatal ();
44714498
4499+ SmallVector<ProtocolDecl *, 2 > inherited;
4500+ if (!MF.readInheritedProtocols (inherited))
4501+ return MF.diagnoseFatal ();
4502+ ctx.evaluator .cacheOutput (InheritedProtocolsRequest{proto},
4503+ ctx.AllocateCopy (inherited));
4504+
44724505 auto genericParams = MF.maybeReadGenericParams (DC);
44734506 assert (genericParams && " protocol with no generic parameters?" );
44744507 ctx.evaluator .cacheOutput (GenericParamListRequest{proto},
44754508 std::move (genericParams));
44764509
4477- handleInherited (proto,
4478- rawInheritedAndDependencyIDs.slice (0 , numInheritedTypes));
4479-
44804510 if (isImplicit)
44814511 proto->setImplicit ();
44824512 proto->setIsObjC (isObjC);
0 commit comments