Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request apple#31926 from AnthonyLatsis/deserial-safe-submap
Serialization: Use checked substitution map deserialization for type nodes
  • Loading branch information
AnthonyLatsis committed May 21, 2020
2 parents e67e8ab + 946796c commit a85ac89
Showing 1 changed file with 23 additions and 12 deletions.
35 changes: 23 additions & 12 deletions lib/Serialization/Deserialization.cpp
Expand Up @@ -4848,7 +4848,9 @@ class TypeDeserializer {
auto substitutedType = substitutedTypeOrError.get();

// Read the substitutions.
auto subMap = MF.getSubstitutionMap(substitutionsID);
auto subMapOrError = MF.getSubstitutionMapChecked(substitutionsID);
if (!subMapOrError)
return subMapOrError.takeError();

auto parentTypeOrError = MF.getTypeChecked(parentTypeID);
if (!parentTypeOrError)
Expand All @@ -4858,11 +4860,12 @@ class TypeDeserializer {
if (alias &&
alias->getAttrs().isUnavailable(ctx) &&
alias->isCompatibilityAlias()) {
return alias->getUnderlyingType().subst(subMap);
return alias->getUnderlyingType().subst(subMapOrError.get());
}

auto parentType = parentTypeOrError.get();
return TypeAliasType::get(alias, parentType, subMap, substitutedType);
return TypeAliasType::get(alias, parentType, subMapOrError.get(),
substitutedType);
}

Expected<Type> deserializeNominalType(ArrayRef<uint64_t> scratch,
Expand Down Expand Up @@ -5180,9 +5183,11 @@ class TypeDeserializer {
return opaqueTypeOrError.takeError();

auto opaqueDecl = cast<OpaqueTypeDecl>(opaqueTypeOrError.get());
auto subs = MF.getSubstitutionMap(subsID);
auto subsOrError = MF.getSubstitutionMapChecked(subsID);
if (!subsOrError)
return subsOrError.takeError();

return OpaqueTypeArchetypeType::get(opaqueDecl, subs);
return OpaqueTypeArchetypeType::get(opaqueDecl, subsOrError.get());
}

Expected<Type> deserializeNestedArchetypeType(ArrayRef<uint64_t> scratch,
Expand Down Expand Up @@ -5317,8 +5322,11 @@ class TypeDeserializer {
if (!layout)
return nullptr;

auto subMap = MF.getSubstitutionMap(subMapID);
return SILBoxType::get(ctx, layout, subMap);
auto subMapOrError = MF.getSubstitutionMapChecked(subMapID);
if (!subMapOrError)
return subMapOrError.takeError();

return SILBoxType::get(ctx, layout, subMapOrError.get());
}

Expected<Type> deserializeSILFunctionType(ArrayRef<uint64_t> scratch,
Expand Down Expand Up @@ -5503,16 +5511,19 @@ class TypeDeserializer {

GenericSignature invocationSig =
MF.getGenericSignature(rawInvocationGenericSig);
SubstitutionMap invocationSubs =
MF.getSubstitutionMap(rawInvocationSubs).getCanonical();
SubstitutionMap patternSubs =
MF.getSubstitutionMap(rawPatternSubs).getCanonical();
auto invocationSubsOrErr = MF.getSubstitutionMapChecked(rawInvocationSubs);
if (!invocationSubsOrErr)
return invocationSubsOrErr.takeError();
auto patternSubsOrErr = MF.getSubstitutionMapChecked(rawPatternSubs);
if (!patternSubsOrErr)
return patternSubsOrErr.takeError();

return SILFunctionType::get(invocationSig, extInfo, coroutineKind.getValue(),
calleeConvention.getValue(),
allParams, allYields, allResults,
errorResult,
patternSubs, invocationSubs,
patternSubsOrErr.get().getCanonical(),
invocationSubsOrErr.get().getCanonical(),
ctx, witnessMethodConformance);
}

Expand Down

0 comments on commit a85ac89

Please sign in to comment.