Skip to content

Commit fff69c9

Browse files
committed
[Serialization] Unify ExistentialMetatype and Metatype deserialization
1 parent da9fa9e commit fff69c9

File tree

1 file changed

+28
-40
lines changed

1 file changed

+28
-40
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 28 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4567,69 +4567,57 @@ class swift::TypeDeserializer {
45674567
return deserializeAnyFunctionType(scratch, blobData, /*isGeneric*/true);
45684568
}
45694569

4570-
Expected<Type>
4571-
deserializeExistentialMetatypeType(ArrayRef<uint64_t> scratch,
4572-
StringRef blobData) {
4570+
template <typename Layout, typename ASTType, bool CanBeThin>
4571+
Expected<Type> deserializeAnyMetatypeType(ArrayRef<uint64_t> scratch,
4572+
StringRef blobData) {
45734573
TypeID instanceID;
45744574
uint8_t repr;
4575-
decls_block::ExistentialMetatypeTypeLayout::readRecord(scratch,
4576-
instanceID, repr);
4575+
Layout::readRecord(scratch, instanceID, repr);
4576+
45774577
auto instanceType = MF.getTypeChecked(instanceID);
45784578
if (!instanceType)
45794579
return instanceType.takeError();
45804580

45814581
switch (repr) {
45824582
case serialization::MetatypeRepresentation::MR_None:
4583-
return ExistentialMetatypeType::get(instanceType.get());
4583+
return ASTType::get(instanceType.get());
45844584

45854585
case serialization::MetatypeRepresentation::MR_Thin:
4586-
MF.error();
4587-
llvm_unreachable("an error is fatal");
4586+
if (!CanBeThin) {
4587+
MF.error();
4588+
llvm_unreachable("an error is fatal");
4589+
}
4590+
return ASTType::get(instanceType.get(),
4591+
MetatypeRepresentation::Thin);
45884592

45894593
case serialization::MetatypeRepresentation::MR_Thick:
4590-
return ExistentialMetatypeType::get(instanceType.get(),
4591-
MetatypeRepresentation::Thick);
4594+
return ASTType::get(instanceType.get(),
4595+
MetatypeRepresentation::Thick);
45924596

45934597
case serialization::MetatypeRepresentation::MR_ObjC:
4594-
return ExistentialMetatypeType::get(instanceType.get(),
4595-
MetatypeRepresentation::ObjC);
4598+
return ASTType::get(instanceType.get(),
4599+
MetatypeRepresentation::ObjC);
45964600

45974601
default:
45984602
MF.error();
45994603
llvm_unreachable("an error is fatal");
46004604
}
46014605
}
46024606

4607+
Expected<Type>
4608+
deserializeExistentialMetatypeType(ArrayRef<uint64_t> scratch,
4609+
StringRef blobData) {
4610+
return
4611+
deserializeAnyMetatypeType<decls_block::ExistentialMetatypeTypeLayout,
4612+
ExistentialMetatypeType, /*CanBeThin*/false>(
4613+
scratch, blobData);
4614+
}
4615+
46034616
Expected<Type> deserializeMetatypeType(ArrayRef<uint64_t> scratch,
46044617
StringRef blobData) {
4605-
TypeID instanceID;
4606-
uint8_t repr;
4607-
decls_block::MetatypeTypeLayout::readRecord(scratch, instanceID, repr);
4608-
4609-
auto instanceType = MF.getTypeChecked(instanceID);
4610-
if (!instanceType)
4611-
return instanceType.takeError();
4612-
4613-
switch (repr) {
4614-
case serialization::MetatypeRepresentation::MR_None:
4615-
return MetatypeType::get(instanceType.get());
4616-
4617-
case serialization::MetatypeRepresentation::MR_Thin:
4618-
return MetatypeType::get(instanceType.get(),
4619-
MetatypeRepresentation::Thin);
4620-
4621-
case serialization::MetatypeRepresentation::MR_Thick:
4622-
return MetatypeType::get(instanceType.get(),
4623-
MetatypeRepresentation::Thick);
4624-
4625-
case serialization::MetatypeRepresentation::MR_ObjC:
4626-
return MetatypeType::get(instanceType.get(),
4627-
MetatypeRepresentation::ObjC);
4628-
4629-
default:
4630-
MF.error();
4631-
llvm_unreachable("an error is fatal");
4632-
}
4618+
return deserializeAnyMetatypeType<decls_block::MetatypeTypeLayout,
4619+
MetatypeType, /*CanBeThin*/true>(
4620+
scratch, blobData);
46334621
}
46344622

46354623
Expected<Type> deserializeDynamicSelfType(ArrayRef<uint64_t> scratch,

0 commit comments

Comments
 (0)