@@ -1188,6 +1188,53 @@ ModuleFile::getGenericSignatureChecked(serialization::GenericSignatureID ID) {
11881188 return signature;
11891189}
11901190
1191+ Expected<GenericEnvironment *>
1192+ ModuleFile::getGenericEnvironmentChecked (serialization::GenericEnvironmentID ID) {
1193+ using namespace decls_block ;
1194+
1195+ assert (ID <= GenericEnvironments.size () &&
1196+ " invalid GenericEnvironment ID" );
1197+ auto &envOffset = GenericEnvironments[ID-1 ];
1198+
1199+ // If we've already deserialized this generic environment, return it.
1200+ if (envOffset.isComplete ())
1201+ return envOffset.get ();
1202+
1203+ // Read the generic environment.
1204+ BCOffsetRAII restoreOffset (DeclTypeCursor);
1205+ fatalIfNotSuccess (DeclTypeCursor.JumpToBit (envOffset));
1206+
1207+ llvm::BitstreamEntry entry =
1208+ fatalIfUnexpected (DeclTypeCursor.advance (AF_DontPopBlockAtEnd));
1209+ if (entry.Kind != llvm::BitstreamEntry::Record)
1210+ fatal ();
1211+
1212+ StringRef blobData;
1213+ SmallVector<uint64_t , 8 > scratch;
1214+ unsigned recordID = fatalIfUnexpected (
1215+ DeclTypeCursor.readRecord (entry.ID , scratch, &blobData));
1216+ if (recordID != GENERIC_ENVIRONMENT)
1217+ fatal ();
1218+
1219+ GenericSignatureID parentSigID;
1220+ TypeID existentialID;
1221+ GenericEnvironmentLayout::readRecord (scratch, existentialID, parentSigID);
1222+
1223+ auto existentialTypeOrError = getTypeChecked (existentialID);
1224+ if (!existentialTypeOrError)
1225+ return existentialTypeOrError.takeError ();
1226+
1227+ auto parentSigOrError = getGenericSignatureChecked (parentSigID);
1228+ if (!parentSigOrError)
1229+ return parentSigOrError.takeError ();
1230+
1231+ auto *genericEnv = GenericEnvironment::forOpenedExistential (
1232+ existentialTypeOrError.get (), parentSigOrError.get (), UUID::fromTime ());
1233+ envOffset = genericEnv;
1234+
1235+ return genericEnv;
1236+ }
1237+
11911238SubstitutionMap ModuleFile::getSubstitutionMap (
11921239 serialization::SubstitutionMapID id) {
11931240 auto map = getSubstitutionMapChecked (id);
@@ -5747,29 +5794,22 @@ Expected<Type> DESERIALIZE_TYPE(PRIMARY_ARCHETYPE_TYPE)(
57475794
57485795Expected<Type> DESERIALIZE_TYPE (OPENED_ARCHETYPE_TYPE)(
57495796 ModuleFile &MF, SmallVectorImpl<uint64_t > &scratch, StringRef blobData) {
5750- TypeID existentialID;
57515797 TypeID interfaceID;
5752- GenericSignatureID sigID ;
5798+ GenericEnvironmentID genericEnvID ;
57535799
5754- decls_block::OpenedArchetypeTypeLayout::readRecord (scratch, existentialID,
5755- interfaceID, sigID);
5756-
5757- auto sigOrError = MF.getGenericSignatureChecked (sigID);
5758- if (!sigOrError)
5759- return sigOrError.takeError ();
5800+ decls_block::OpenedArchetypeTypeLayout::readRecord (scratch,
5801+ interfaceID,
5802+ genericEnvID);
57605803
57615804 auto interfaceTypeOrError = MF.getTypeChecked (interfaceID);
57625805 if (!interfaceTypeOrError)
57635806 return interfaceTypeOrError.takeError ();
57645807
5765- auto existentialTypeOrError = MF.getTypeChecked (existentialID );
5766- if (!existentialTypeOrError )
5767- return existentialTypeOrError .takeError ();
5808+ auto envOrError = MF.getGenericEnvironmentChecked (genericEnvID );
5809+ if (!envOrError )
5810+ return envOrError .takeError ();
57685811
5769- auto env = GenericEnvironment::forOpenedArchetypeSignature (
5770- existentialTypeOrError.get (), sigOrError.get (), UUID::fromTime ());
5771- return env->mapTypeIntoContext (interfaceTypeOrError.get ())
5772- ->castTo <OpenedArchetypeType>();
5812+ return envOrError.get ()->mapTypeIntoContext (interfaceTypeOrError.get ());
57735813}
57745814
57755815Expected<Type> DESERIALIZE_TYPE (OPAQUE_ARCHETYPE_TYPE)(
0 commit comments