@@ -1181,6 +1181,53 @@ ModuleFile::getGenericSignatureChecked(serialization::GenericSignatureID ID) {
11811181 return signature;
11821182}
11831183
1184+ Expected<GenericEnvironment *>
1185+ ModuleFile::getGenericEnvironmentChecked (serialization::GenericEnvironmentID ID) {
1186+ using namespace decls_block ;
1187+
1188+ assert (ID <= GenericEnvironments.size () &&
1189+ " invalid GenericEnvironment ID" );
1190+ auto &envOffset = GenericEnvironments[ID-1 ];
1191+
1192+ // If we've already deserialized this generic environment, return it.
1193+ if (envOffset.isComplete ())
1194+ return envOffset.get ();
1195+
1196+ // Read the generic environment.
1197+ BCOffsetRAII restoreOffset (DeclTypeCursor);
1198+ fatalIfNotSuccess (DeclTypeCursor.JumpToBit (envOffset));
1199+
1200+ llvm::BitstreamEntry entry =
1201+ fatalIfUnexpected (DeclTypeCursor.advance (AF_DontPopBlockAtEnd));
1202+ if (entry.Kind != llvm::BitstreamEntry::Record)
1203+ fatal ();
1204+
1205+ StringRef blobData;
1206+ SmallVector<uint64_t , 8 > scratch;
1207+ unsigned recordID = fatalIfUnexpected (
1208+ DeclTypeCursor.readRecord (entry.ID , scratch, &blobData));
1209+ if (recordID != GENERIC_ENVIRONMENT)
1210+ fatal ();
1211+
1212+ GenericSignatureID parentSigID;
1213+ TypeID existentialID;
1214+ GenericEnvironmentLayout::readRecord (scratch, existentialID, parentSigID);
1215+
1216+ auto existentialTypeOrError = getTypeChecked (existentialID);
1217+ if (!existentialTypeOrError)
1218+ return existentialTypeOrError.takeError ();
1219+
1220+ auto parentSigOrError = getGenericSignatureChecked (parentSigID);
1221+ if (!parentSigOrError)
1222+ return parentSigOrError.takeError ();
1223+
1224+ auto *genericEnv = GenericEnvironment::forOpenedExistential (
1225+ existentialTypeOrError.get (), parentSigOrError.get (), UUID::fromTime ());
1226+ envOffset = genericEnv;
1227+
1228+ return genericEnv;
1229+ }
1230+
11841231SubstitutionMap ModuleFile::getSubstitutionMap (
11851232 serialization::SubstitutionMapID id) {
11861233 auto map = getSubstitutionMapChecked (id);
@@ -5709,28 +5756,21 @@ class TypeDeserializer {
57095756
57105757 Expected<Type> deserializeOpenedArchetypeType (ArrayRef<uint64_t > scratch,
57115758 StringRef blobData) {
5712- TypeID existentialID;
57135759 TypeID interfaceID;
5714- GenericSignatureID sigID;
5715-
5716- decls_block::OpenedArchetypeTypeLayout::readRecord (scratch, existentialID,
5717- interfaceID, sigID);
5760+ GenericEnvironmentID genericEnvID;
57185761
5719- auto sigOrError = MF.getGenericSignatureChecked (sigID);
5720- if (!sigOrError)
5721- return sigOrError.takeError ();
5762+ decls_block::OpenedArchetypeTypeLayout::readRecord (scratch,
5763+ interfaceID, genericEnvID);
57225764
57235765 auto interfaceTypeOrError = MF.getTypeChecked (interfaceID);
57245766 if (!interfaceTypeOrError)
57255767 return interfaceTypeOrError.takeError ();
57265768
5727- auto existentialTypeOrError = MF.getTypeChecked (existentialID );
5728- if (!existentialTypeOrError )
5729- return existentialTypeOrError .takeError ();
5769+ auto envOrError = MF.getGenericEnvironmentChecked (genericEnvID );
5770+ if (!envOrError )
5771+ return envOrError .takeError ();
57305772
5731- auto env = GenericEnvironment::forOpenedArchetypeSignature (
5732- existentialTypeOrError.get (), sigOrError.get (), UUID::fromTime ());
5733- return env->mapTypeIntoContext (interfaceTypeOrError.get ())
5773+ return envOrError.get ()->mapTypeIntoContext (interfaceTypeOrError.get ())
57345774 ->castTo <OpenedArchetypeType>();
57355775 }
57365776
0 commit comments