Skip to content

Commit 64488b1

Browse files
committed
Serialization: Rework serialization of nested archetypes.
Explicitly serialize the parent archetype so that it can be any kind of root archetype.
1 parent 0cfca94 commit 64488b1

File tree

4 files changed

+77
-36
lines changed

4 files changed

+77
-36
lines changed

include/swift/Serialization/DeclTypeRecordNodes.def

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ TRAILING_INFO(TUPLE_TYPE_ELT)
8888
TYPE(FUNCTION)
8989
TRAILING_INFO(FUNCTION_PARAM)
9090
TYPE(METATYPE)
91-
TYPE(ARCHETYPE)
91+
TYPE(PRIMARY_ARCHETYPE)
92+
TYPE(OPENED_ARCHETYPE)
93+
TYPE(NESTED_ARCHETYPE)
9294
TYPE(PROTOCOL_COMPOSITION)
9395
TYPE(BOUND_GENERIC)
9496

include/swift/Serialization/ModuleFormat.h

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0;
5252
/// describe what change you made. The content of this comment isn't important;
5353
/// it just ensures a conflict if two people change the module format.
5454
/// Don't worry about adhering to the 80-column limit for this line.
55-
const uint16_t SWIFTMODULE_VERSION_MINOR = 474; // Last change: @_alwaysEmitIntoClient
55+
const uint16_t SWIFTMODULE_VERSION_MINOR = 475; // Last change: Generalize nested archetype serialization
5656

5757
using DeclIDField = BCFixed<31>;
5858

@@ -766,17 +766,24 @@ namespace decls_block {
766766
MetatypeRepresentationField // representation
767767
>;
768768

769-
using ArchetypeTypeLayout = BCRecordLayout<
770-
ARCHETYPE_TYPE,
769+
using PrimaryArchetypeTypeLayout = BCRecordLayout<
770+
PRIMARY_ARCHETYPE_TYPE,
771771
GenericEnvironmentIDField, // generic environment
772-
TypeIDField // interface type
772+
BCVBR<4>, // generic type parameter depth
773+
BCVBR<4> // index + 1, or zero if we have a generic type parameter decl
773774
>;
774775

775-
using OpenedExistentialTypeLayout = BCRecordLayout<
776-
OPENED_EXISTENTIAL_TYPE,
776+
using OpenedArchetypeTypeLayout = BCRecordLayout<
777+
OPENED_ARCHETYPE_TYPE,
777778
TypeIDField // the existential type
778779
>;
779-
780+
781+
using NestedArchetypeTypeLayout = BCRecordLayout<
782+
NESTED_ARCHETYPE_TYPE,
783+
TypeIDField, // root archetype
784+
TypeIDField // interface type relative to root
785+
>;
786+
780787
using DynamicSelfTypeLayout = BCRecordLayout<
781788
DYNAMIC_SELF_TYPE,
782789
TypeIDField // self type
@@ -1058,7 +1065,7 @@ namespace decls_block {
10581065
// - the foreign error convention, if any
10591066
// - inlinable body text, if any
10601067
>;
1061-
1068+
10621069
// TODO: remove the unnecessary FuncDecl components here
10631070
using AccessorLayout = BCRecordLayout<
10641071
ACCESSOR_DECL,

lib/Serialization/Deserialization.cpp

Lines changed: 31 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3027,7 +3027,7 @@ class swift::DeclDeserializer {
30273027
MF.error();
30283028
return nullptr;
30293029
}
3030-
3030+
30313031
// Set the interface type.
30323032
fn->computeType();
30333033

@@ -4686,20 +4686,20 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
46864686
break;
46874687
}
46884688

4689-
case decls_block::ARCHETYPE_TYPE: {
4689+
case decls_block::PRIMARY_ARCHETYPE_TYPE: {
46904690
GenericEnvironmentID envID;
4691-
TypeID interfaceTypeID;
4691+
unsigned depth, index;
46924692

4693-
decls_block::ArchetypeTypeLayout::readRecord(scratch, envID,
4694-
interfaceTypeID);
4693+
decls_block::PrimaryArchetypeTypeLayout::readRecord(scratch, envID,
4694+
depth, index);
46954695

46964696
auto env = getGenericEnvironment(envID);
46974697
if (!env) {
46984698
error();
46994699
break;
47004700
}
47014701

4702-
Type interfaceType = getType(interfaceTypeID);
4702+
Type interfaceType = GenericTypeParamType::get(depth, index, ctx);
47034703
Type contextType = env->mapTypeIntoContext(interfaceType);
47044704
typeOrOffset = contextType;
47054705

@@ -4711,15 +4711,37 @@ Expected<Type> ModuleFile::getTypeChecked(TypeID TID) {
47114711
break;
47124712
}
47134713

4714-
case decls_block::OPENED_EXISTENTIAL_TYPE: {
4714+
case decls_block::OPENED_ARCHETYPE_TYPE: {
47154715
TypeID existentialID;
47164716

4717-
decls_block::OpenedExistentialTypeLayout::readRecord(scratch,
4718-
existentialID);
4717+
decls_block::OpenedArchetypeTypeLayout::readRecord(scratch,
4718+
existentialID);
47194719

47204720
typeOrOffset = OpenedArchetypeType::get(getType(existentialID));
47214721
break;
47224722
}
4723+
4724+
case decls_block::NESTED_ARCHETYPE_TYPE: {
4725+
TypeID rootID, interfaceTyID;
4726+
decls_block::NestedArchetypeTypeLayout::readRecord(scratch,
4727+
rootID, interfaceTyID);
4728+
4729+
auto rootTy = getType(rootID)->castTo<ArchetypeType>();
4730+
auto interfaceTy = getType(interfaceTyID)->castTo<DependentMemberType>();
4731+
auto rootInterfaceTy = interfaceTy->getRootGenericParam();
4732+
4733+
auto sig = rootTy->getGenericEnvironment()->getGenericSignature();
4734+
4735+
auto subs = SubstitutionMap::get(sig,
4736+
[&](SubstitutableType *t) -> Type {
4737+
if (t->isEqual(rootInterfaceTy))
4738+
return rootTy;
4739+
return t;
4740+
}, LookUpConformanceInModule(getAssociatedModule()));
4741+
4742+
typeOrOffset = Type(interfaceTy).subst(subs);
4743+
break;
4744+
}
47234745

47244746
case decls_block::GENERIC_TYPE_PARAM_TYPE: {
47254747
DeclID declIDOrDepth;

lib/Serialization/Serialization.cpp

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3291,7 +3291,7 @@ void Serializer::writeDecl(const Decl *D) {
32913291
Type ty = fn->getInterfaceType();
32923292
for (auto dependency : collectDependenciesFromType(ty->getCanonicalType()))
32933293
nameComponentsAndDependencies.push_back(addTypeRef(dependency));
3294-
3294+
32953295
FuncLayout::emitRecord(Out, ScratchRecord, abbrCode,
32963296
contextID,
32973297
fn->isImplicit(),
@@ -3328,7 +3328,7 @@ void Serializer::writeDecl(const Decl *D) {
33283328

33293329
break;
33303330
}
3331-
3331+
33323332
case DeclKind::Accessor: {
33333333
auto fn = cast<AccessorDecl>(D);
33343334
verifyAttrSerializable(fn);
@@ -3818,32 +3818,41 @@ void Serializer::writeType(Type ty) {
38183818
addTypeRef(dynamicSelfTy->getSelfType()));
38193819
break;
38203820
}
3821-
3822-
case TypeKind::PrimaryArchetype:
3823-
case TypeKind::NestedArchetype: {
3824-
auto archetypeTy = cast<ArchetypeType>(ty.getPointer());
3825-
assert(isa<PrimaryArchetypeType>(archetypeTy->getRoot())
3826-
&& "need to implement for nested archetypes of opened/opaque types");
3827-
3821+
3822+
case TypeKind::PrimaryArchetype: {
3823+
auto archetypeTy = cast<PrimaryArchetypeType>(ty.getPointer());
38283824
auto env = archetypeTy->getGenericEnvironment();
38293825

38303826
GenericEnvironmentID envID = addGenericEnvironmentRef(env);
3831-
Type interfaceType = archetypeTy->getInterfaceType();
3832-
3833-
unsigned abbrCode = DeclTypeAbbrCodes[ArchetypeTypeLayout::Code];
3834-
ArchetypeTypeLayout::emitRecord(Out, ScratchRecord, abbrCode,
3835-
envID, addTypeRef(interfaceType));
3827+
auto interfaceType = archetypeTy->getInterfaceType()
3828+
->castTo<GenericTypeParamType>();
3829+
3830+
unsigned abbrCode = DeclTypeAbbrCodes[PrimaryArchetypeTypeLayout::Code];
3831+
PrimaryArchetypeTypeLayout::emitRecord(Out, ScratchRecord, abbrCode,
3832+
envID,
3833+
interfaceType->getDepth(),
3834+
interfaceType->getIndex());
38363835
break;
38373836
}
38383837

38393838
case TypeKind::OpenedArchetype: {
38403839
auto archetypeTy = cast<OpenedArchetypeType>(ty.getPointer());
3841-
unsigned abbrCode = DeclTypeAbbrCodes[OpenedExistentialTypeLayout::Code];
3842-
OpenedExistentialTypeLayout::emitRecord(Out, ScratchRecord, abbrCode,
3840+
unsigned abbrCode = DeclTypeAbbrCodes[OpenedArchetypeTypeLayout::Code];
3841+
OpenedArchetypeTypeLayout::emitRecord(Out, ScratchRecord, abbrCode,
38433842
addTypeRef(archetypeTy->getOpenedExistentialType()));
38443843
break;
38453844
}
38463845

3846+
case TypeKind::NestedArchetype: {
3847+
auto archetypeTy = cast<NestedArchetypeType>(ty.getPointer());
3848+
auto rootTypeID = addTypeRef(archetypeTy->getRoot());
3849+
auto interfaceTypeID = addTypeRef(archetypeTy->getInterfaceType());
3850+
unsigned abbrCode = DeclTypeAbbrCodes[NestedArchetypeTypeLayout::Code];
3851+
NestedArchetypeTypeLayout::emitRecord(Out, ScratchRecord, abbrCode,
3852+
rootTypeID, interfaceTypeID);
3853+
break;
3854+
}
3855+
38473856
case TypeKind::GenericTypeParam: {
38483857
auto genericParam = cast<GenericTypeParamType>(ty.getPointer());
38493858
unsigned abbrCode = DeclTypeAbbrCodes[GenericTypeParamTypeLayout::Code];
@@ -4098,7 +4107,9 @@ void Serializer::writeAllDeclsAndTypes() {
40984107
registerDeclTypeAbbr<FunctionParamLayout>();
40994108
registerDeclTypeAbbr<MetatypeTypeLayout>();
41004109
registerDeclTypeAbbr<ExistentialMetatypeTypeLayout>();
4101-
registerDeclTypeAbbr<ArchetypeTypeLayout>();
4110+
registerDeclTypeAbbr<PrimaryArchetypeTypeLayout>();
4111+
registerDeclTypeAbbr<OpenedArchetypeTypeLayout>();
4112+
registerDeclTypeAbbr<NestedArchetypeTypeLayout>();
41024113
registerDeclTypeAbbr<ProtocolCompositionTypeLayout>();
41034114
registerDeclTypeAbbr<BoundGenericTypeLayout>();
41044115
registerDeclTypeAbbr<GenericFunctionTypeLayout>();
@@ -4111,7 +4122,6 @@ void Serializer::writeAllDeclsAndTypes() {
41114122
registerDeclTypeAbbr<UnboundGenericTypeLayout>();
41124123
registerDeclTypeAbbr<OptionalTypeLayout>();
41134124
registerDeclTypeAbbr<DynamicSelfTypeLayout>();
4114-
registerDeclTypeAbbr<OpenedExistentialTypeLayout>();
41154125

41164126
registerDeclTypeAbbr<TypeAliasLayout>();
41174127
registerDeclTypeAbbr<GenericTypeParamTypeLayout>();

0 commit comments

Comments
 (0)