@@ -808,24 +808,10 @@ static void skipGenericRequirements(llvm::BitstreamCursor &Cursor) {
808
808
}
809
809
810
810
void ModuleFile::configureGenericEnvironment (
811
- GenericContext *genericDecl, serialization::GenericSignatureID envID) {
812
- if (envID == 0 ) return ;
813
-
814
- auto sigOrEnv = getGenericSignatureOrEnvironment (envID);
815
-
816
- // If we just have a generic signature, set up lazy generic environment
817
- // creation.
818
- if (auto genericSig = sigOrEnv.dyn_cast <GenericSignature *>()) {
819
- genericDecl->setLazyGenericEnvironment (this , genericSig, envID);
820
- return ;
821
- }
822
-
823
- // If we have a full generic environment, it's because it happened to be
824
- // deserialized already. Record it directly.
825
- if (auto genericEnv = sigOrEnv.dyn_cast <GenericEnvironment *>()) {
826
- genericDecl->setGenericEnvironment (genericEnv);
827
- return ;
828
- }
811
+ GenericContext *genericDecl, serialization::GenericSignatureID sigID) {
812
+ if (sigID == 0 ) return ;
813
+ auto *genericSig = getGenericSignature (sigID);
814
+ genericDecl->setLazyGenericEnvironment (this , genericSig, sigID);
829
815
}
830
816
831
817
GenericSignature *ModuleFile::getGenericSignature (
@@ -835,20 +821,17 @@ GenericSignature *ModuleFile::getGenericSignature(
835
821
// Zero is a sentinel for having no generic signature.
836
822
if (ID == 0 ) return nullptr ;
837
823
838
- assert (ID <= GenericSignaturesAndEnvironments .size () &&
824
+ assert (ID <= GenericSignatures .size () &&
839
825
" invalid GenericSignature ID" );
840
- auto &sigOrEnvOrOffset = GenericSignaturesAndEnvironments [ID-1 ];
826
+ auto &sigOffset = GenericSignatures [ID-1 ];
841
827
842
828
// If we've already deserialized this generic signature, return it.
843
- if (sigOrEnvOrOffset.isComplete ()) {
844
- if (auto *env = sigOrEnvOrOffset.get ().dyn_cast <GenericEnvironment *>())
845
- return env->getGenericSignature ();
846
- return sigOrEnvOrOffset.get ().get <GenericSignature *>();
847
- }
829
+ if (sigOffset.isComplete ())
830
+ return sigOffset.get ();
848
831
849
832
// Read the generic signature.
850
833
BCOffsetRAII restoreOffset (DeclTypeCursor);
851
- DeclTypeCursor.JumpToBit (sigOrEnvOrOffset );
834
+ DeclTypeCursor.JumpToBit (sigOffset );
852
835
853
836
// Read the parameter types.
854
837
SmallVector<GenericTypeParamType *, 4 > paramTypes;
@@ -909,51 +892,16 @@ GenericSignature *ModuleFile::getGenericSignature(
909
892
// If we've already deserialized this generic signature, start over to return
910
893
// it directly.
911
894
// FIXME: Is this kind of re-entrancy actually possible?
912
- if (sigOrEnvOrOffset .isComplete ())
895
+ if (sigOffset .isComplete ())
913
896
return getGenericSignature (ID);
914
897
915
898
// Construct the generic signature from the loaded parameters and
916
899
// requirements.
917
900
auto signature = GenericSignature::get (paramTypes, requirements);
918
- sigOrEnvOrOffset = signature;
901
+ sigOffset = signature;
919
902
return signature;
920
903
}
921
904
922
- ModuleFile::GenericSignatureOrEnvironment
923
- ModuleFile::getGenericSignatureOrEnvironment (
924
- serialization::GenericSignatureID ID,
925
- bool wantEnvironment) {
926
- // The empty result with the type the caller expects.
927
- GenericSignatureOrEnvironment result;
928
- if (wantEnvironment)
929
- result = static_cast <GenericEnvironment *>(nullptr );
930
-
931
- // Zero is a sentinel for having no generic environment.
932
- if (ID == 0 ) return result;
933
-
934
- assert (ID <= GenericSignaturesAndEnvironments.size () &&
935
- " invalid GenericEnvironment ID" );
936
- auto &sigOrEnvOrOffset = GenericSignaturesAndEnvironments[ID-1 ];
937
-
938
- if (!sigOrEnvOrOffset.isComplete ()) {
939
- // Force the loading process by fetching the generic signature.
940
- (void )getGenericSignature (ID);
941
- assert (sigOrEnvOrOffset.isComplete ());
942
- }
943
-
944
- if (wantEnvironment)
945
- if (auto *sig = sigOrEnvOrOffset.get ().dyn_cast <GenericSignature *>())
946
- sigOrEnvOrOffset.uncheckedOverwrite (sig->getGenericEnvironment ());
947
-
948
- return sigOrEnvOrOffset.get ();
949
- }
950
-
951
- GenericEnvironment *
952
- ModuleFile::getGenericEnvironment (serialization::GenericSignatureID ID) {
953
- return getGenericSignatureOrEnvironment (ID, /* wantEnvironment=*/ true )
954
- .get <GenericEnvironment *>();
955
- }
956
-
957
905
SubstitutionMap ModuleFile::getSubstitutionMap (
958
906
serialization::SubstitutionMapID id) {
959
907
using namespace decls_block ;
@@ -3040,16 +2988,16 @@ class swift::DeclDeserializer {
3040
2988
DeclContextID contextID;
3041
2989
GenericSignatureID interfaceSigID;
3042
2990
TypeID interfaceTypeID;
3043
- GenericSignatureID genericEnvID ;
2991
+ GenericSignatureID genericSigID ;
3044
2992
SubstitutionMapID underlyingTypeID;
3045
2993
3046
2994
decls_block::OpaqueTypeLayout::readRecord (scratch, contextID,
3047
2995
namingDeclID, interfaceSigID,
3048
- interfaceTypeID, genericEnvID ,
2996
+ interfaceTypeID, genericSigID ,
3049
2997
underlyingTypeID);
3050
2998
3051
2999
auto declContext = MF.getDeclContext (contextID);
3052
- auto sig = MF.getGenericSignature (interfaceSigID);
3000
+ auto interfaceSig = MF.getGenericSignature (interfaceSigID);
3053
3001
auto interfaceType = MF.getType (interfaceTypeID)
3054
3002
->castTo <GenericTypeParamType>();
3055
3003
@@ -3060,7 +3008,7 @@ class swift::DeclDeserializer {
3060
3008
// Create the decl.
3061
3009
auto opaqueDecl =
3062
3010
new (ctx) OpaqueTypeDecl (nullptr , nullptr , declContext,
3063
- sig , interfaceType);
3011
+ interfaceSig , interfaceType);
3064
3012
declOrOffset = opaqueDecl;
3065
3013
3066
3014
auto namingDecl = cast<ValueDecl>(MF.getDecl (namingDeclID));
@@ -3069,14 +3017,15 @@ class swift::DeclDeserializer {
3069
3017
if (auto genericParams = MF.maybeReadGenericParams (opaqueDecl))
3070
3018
opaqueDecl->setGenericParams (genericParams);
3071
3019
3072
- auto genericEnv = MF.getGenericEnvironment (genericEnvID);
3073
- opaqueDecl->setGenericEnvironment (genericEnv);
3020
+ auto genericSig = MF.getGenericSignature (genericSigID);
3021
+ if (genericSig)
3022
+ opaqueDecl->setGenericEnvironment (genericSig->getGenericEnvironment ());
3074
3023
if (underlyingTypeID)
3075
3024
opaqueDecl->setUnderlyingTypeSubstitutions (
3076
3025
MF.getSubstitutionMap (underlyingTypeID));
3077
3026
SubstitutionMap subs;
3078
- if (genericEnv ) {
3079
- subs = genericEnv-> getGenericSignature () ->getIdentitySubstitutionMap ();
3027
+ if (genericSig ) {
3028
+ subs = genericSig ->getIdentitySubstitutionMap ();
3080
3029
}
3081
3030
auto opaqueTy = OpaqueTypeArchetypeType::get (opaqueDecl, subs);
3082
3031
auto metatype = MetatypeType::get (opaqueTy);
@@ -4727,18 +4676,19 @@ class swift::TypeDeserializer {
4727
4676
4728
4677
Expected<Type> deserializePrimaryArchetypeType (ArrayRef<uint64_t > scratch,
4729
4678
StringRef blobData) {
4730
- GenericSignatureID envID ;
4679
+ GenericSignatureID sigID ;
4731
4680
unsigned depth, index;
4732
4681
4733
- decls_block::PrimaryArchetypeTypeLayout::readRecord (scratch, envID ,
4682
+ decls_block::PrimaryArchetypeTypeLayout::readRecord (scratch, sigID ,
4734
4683
depth, index);
4735
4684
4736
- auto env = MF.getGenericEnvironment (envID );
4737
- if (!env )
4685
+ auto sig = MF.getGenericSignature (sigID );
4686
+ if (!sig )
4738
4687
MF.fatal ();
4739
4688
4740
4689
Type interfaceType = GenericTypeParamType::get (depth, index, ctx);
4741
- Type contextType = env->mapTypeIntoContext (interfaceType);
4690
+ Type contextType = sig->getGenericEnvironment ()
4691
+ ->mapTypeIntoContext (interfaceType);
4742
4692
4743
4693
if (contextType->hasError ())
4744
4694
MF.fatal ();
@@ -4777,18 +4727,7 @@ class swift::TypeDeserializer {
4777
4727
4778
4728
auto rootTy = MF.getType (rootID)->castTo <ArchetypeType>();
4779
4729
auto interfaceTy = MF.getType (interfaceTyID)->castTo <DependentMemberType>();
4780
- auto rootInterfaceTy = interfaceTy->getRootGenericParam ();
4781
-
4782
- auto sig = rootTy->getGenericEnvironment ()->getGenericSignature ();
4783
-
4784
- auto subs = SubstitutionMap::get (sig,
4785
- [&](SubstitutableType *t) -> Type {
4786
- if (t->isEqual (rootInterfaceTy))
4787
- return rootTy;
4788
- return t;
4789
- }, LookUpConformanceInModule (MF.getAssociatedModule ()));
4790
-
4791
- return Type (interfaceTy).subst (subs);
4730
+ return rootTy->getGenericEnvironment ()->mapTypeIntoContext (interfaceTy);
4792
4731
}
4793
4732
4794
4733
Expected<Type> deserializeGenericTypeParamType (ArrayRef<uint64_t > scratch,
@@ -5561,7 +5500,7 @@ void ModuleFile::finishNormalConformance(NormalProtocolConformance *conformance,
5561
5500
5562
5501
GenericEnvironment *ModuleFile::loadGenericEnvironment (const DeclContext *decl,
5563
5502
uint64_t contextData) {
5564
- return getGenericEnvironment (contextData );
5503
+ return decl-> getGenericSignatureOfContext ()-> getGenericEnvironment ();
5565
5504
}
5566
5505
5567
5506
void ModuleFile::loadRequirementSignature (const ProtocolDecl *decl,
0 commit comments