Skip to content

Commit 73ae727

Browse files
committed
Fix (de-)serialization of opaque result types for structural opaque types.
Serialize the ordinal value of OpaqueTypeArchetypeTypes and properly set the interface type of OpaqueTypeDecl on deserialization.
1 parent 99a9c02 commit 73ae727

File tree

3 files changed

+22
-29
lines changed

3 files changed

+22
-29
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3447,58 +3447,50 @@ class DeclDeserializer {
34473447
GenericSignatureID interfaceSigID;
34483448
TypeID interfaceTypeID;
34493449
GenericSignatureID genericSigID;
3450-
SubstitutionMapID underlyingTypeID;
3450+
SubstitutionMapID underlyingTypeSubsID;
34513451
uint8_t rawAccessLevel;
34523452
decls_block::OpaqueTypeLayout::readRecord(scratch, contextID,
34533453
namingDeclID, interfaceSigID,
34543454
interfaceTypeID, genericSigID,
3455-
underlyingTypeID, rawAccessLevel);
3455+
underlyingTypeSubsID,
3456+
rawAccessLevel);
34563457

34573458
auto declContext = MF.getDeclContext(contextID);
34583459
auto interfaceSig = MF.getGenericSignature(interfaceSigID);
3459-
auto interfaceType = MF.getType(interfaceTypeID)
3460-
->castTo<GenericTypeParamType>();
3460+
auto interfaceType = MF.getType(interfaceTypeID);
34613461

34623462
// Check for reentrancy.
34633463
if (declOrOffset.isComplete())
34643464
return cast<OpaqueTypeDecl>(declOrOffset.get());
3465-
3465+
3466+
auto genericParams = MF.maybeReadGenericParams(declContext);
3467+
34663468
// Create the decl.
34673469
auto opaqueDecl = OpaqueTypeDecl::get(
3468-
/*NamingDecl*/ nullptr, /*GenericParams*/ nullptr, declContext,
3469-
interfaceSig, /*OpaqueReturnTypeReprs*/ { }, interfaceType);
3470+
/*NamingDecl=*/ nullptr, genericParams, declContext,
3471+
interfaceSig, /*OpaqueReturnTypeReprs*/ { },
3472+
interfaceType->castTo<GenericTypeParamType>());
34703473
declOrOffset = opaqueDecl;
34713474

34723475
auto namingDecl = cast<ValueDecl>(MF.getDecl(namingDeclID));
34733476
opaqueDecl->setNamingDecl(namingDecl);
34743477

3478+
opaqueDecl->setInterfaceType(MetatypeType::get(interfaceType));
3479+
34753480
if (auto accessLevel = getActualAccessLevel(rawAccessLevel))
34763481
opaqueDecl->setAccess(*accessLevel);
34773482
else
34783483
MF.fatal();
34793484

3480-
if (auto genericParams = MF.maybeReadGenericParams(opaqueDecl)) {
3481-
ctx.evaluator.cacheOutput(GenericParamListRequest{opaqueDecl},
3482-
std::move(genericParams));
3483-
}
3484-
34853485
auto genericSig = MF.getGenericSignature(genericSigID);
34863486
if (genericSig)
34873487
opaqueDecl->setGenericSignature(genericSig);
3488-
if (underlyingTypeID) {
3489-
auto subMapOrError = MF.getSubstitutionMapChecked(underlyingTypeID);
3488+
if (underlyingTypeSubsID) {
3489+
auto subMapOrError = MF.getSubstitutionMapChecked(underlyingTypeSubsID);
34903490
if (!subMapOrError)
34913491
return subMapOrError.takeError();
34923492
opaqueDecl->setUnderlyingTypeSubstitutions(subMapOrError.get());
34933493
}
3494-
SubstitutionMap subs;
3495-
if (genericSig) {
3496-
subs = genericSig->getIdentitySubstitutionMap();
3497-
}
3498-
// TODO [OPAQUE SUPPORT]: multiple opaque types
3499-
auto opaqueTy = OpaqueTypeArchetypeType::get(opaqueDecl, 0, subs);
3500-
auto metatype = MetatypeType::get(opaqueTy);
3501-
opaqueDecl->setInterfaceType(metatype);
35023494
return opaqueDecl;
35033495
}
35043496

@@ -5522,9 +5514,10 @@ class TypeDeserializer {
55225514
Expected<Type> deserializeOpaqueArchetypeType(ArrayRef<uint64_t> scratch,
55235515
StringRef blobData) {
55245516
DeclID opaqueDeclID;
5517+
unsigned ordinal;
55255518
SubstitutionMapID subsID;
5526-
decls_block::OpaqueArchetypeTypeLayout::readRecord(scratch,
5527-
opaqueDeclID, subsID);
5519+
decls_block::OpaqueArchetypeTypeLayout::readRecord(
5520+
scratch, opaqueDeclID, ordinal, subsID);
55285521

55295522
auto opaqueTypeOrError = MF.getDeclChecked(opaqueDeclID);
55305523
if (!opaqueTypeOrError)
@@ -5535,9 +5528,7 @@ class TypeDeserializer {
55355528
if (!subsOrError)
55365529
return subsOrError.takeError();
55375530

5538-
// TODO [OPAQUE SUPPORT]: to support multiple opaque types we will probably
5539-
// have to serialize the ordinal, which is always 0 for now
5540-
return OpaqueTypeArchetypeType::get(opaqueDecl, 0, subsOrError.get());
5531+
return OpaqueTypeArchetypeType::get(opaqueDecl, ordinal, subsOrError.get());
55415532
}
55425533

55435534
Expected<Type> deserializeNestedArchetypeType(ArrayRef<uint64_t> scratch,

lib/Serialization/ModuleFormat.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ const uint16_t SWIFTMODULE_VERSION_MAJOR = 0;
5656
/// describe what change you made. The content of this comment isn't important;
5757
/// it just ensures a conflict if two people change the module format.
5858
/// Don't worry about adhering to the 80-column limit for this line.
59-
const uint16_t SWIFTMODULE_VERSION_MINOR = 653; // `IsDistributed` bit on SILFunction
59+
const uint16_t SWIFTMODULE_VERSION_MINOR = 654; // opaque result type orinal
6060

6161
/// A standard hash seed used for all string hashes in a serialized module.
6262
///
@@ -1083,6 +1083,7 @@ namespace decls_block {
10831083
using OpaqueArchetypeTypeLayout = BCRecordLayout<
10841084
OPAQUE_ARCHETYPE_TYPE,
10851085
DeclIDField, // the opaque type decl
1086+
BCVBR<4>, // the ordinal
10861087
SubstitutionMapIDField // the arguments
10871088
>;
10881089

lib/Serialization/Serialization.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4485,7 +4485,8 @@ class Serializer::TypeSerializer : public TypeVisitor<TypeSerializer> {
44854485
auto substMapID = S.addSubstitutionMapRef(archetypeTy->getSubstitutions());
44864486
unsigned abbrCode = S.DeclTypeAbbrCodes[OpaqueArchetypeTypeLayout::Code];
44874487
OpaqueArchetypeTypeLayout::emitRecord(S.Out, S.ScratchRecord, abbrCode,
4488-
declID, substMapID);
4488+
declID, archetypeTy->getOrdinal(),
4489+
substMapID);
44894490
}
44904491

44914492
void visitNestedArchetypeType(const NestedArchetypeType *archetypeTy) {

0 commit comments

Comments
 (0)