Skip to content

Commit a85ac89

Browse files
Merge pull request swiftlang#31926 from AnthonyLatsis/deserial-safe-submap
Serialization: Use checked substitution map deserialization for type nodes
2 parents e67e8ab + 946796c commit a85ac89

File tree

1 file changed

+23
-12
lines changed

1 file changed

+23
-12
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4848,7 +4848,9 @@ class TypeDeserializer {
48484848
auto substitutedType = substitutedTypeOrError.get();
48494849

48504850
// Read the substitutions.
4851-
auto subMap = MF.getSubstitutionMap(substitutionsID);
4851+
auto subMapOrError = MF.getSubstitutionMapChecked(substitutionsID);
4852+
if (!subMapOrError)
4853+
return subMapOrError.takeError();
48524854

48534855
auto parentTypeOrError = MF.getTypeChecked(parentTypeID);
48544856
if (!parentTypeOrError)
@@ -4858,11 +4860,12 @@ class TypeDeserializer {
48584860
if (alias &&
48594861
alias->getAttrs().isUnavailable(ctx) &&
48604862
alias->isCompatibilityAlias()) {
4861-
return alias->getUnderlyingType().subst(subMap);
4863+
return alias->getUnderlyingType().subst(subMapOrError.get());
48624864
}
48634865

48644866
auto parentType = parentTypeOrError.get();
4865-
return TypeAliasType::get(alias, parentType, subMap, substitutedType);
4867+
return TypeAliasType::get(alias, parentType, subMapOrError.get(),
4868+
substitutedType);
48664869
}
48674870

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

51825185
auto opaqueDecl = cast<OpaqueTypeDecl>(opaqueTypeOrError.get());
5183-
auto subs = MF.getSubstitutionMap(subsID);
5186+
auto subsOrError = MF.getSubstitutionMapChecked(subsID);
5187+
if (!subsOrError)
5188+
return subsOrError.takeError();
51845189

5185-
return OpaqueTypeArchetypeType::get(opaqueDecl, subs);
5190+
return OpaqueTypeArchetypeType::get(opaqueDecl, subsOrError.get());
51865191
}
51875192

51885193
Expected<Type> deserializeNestedArchetypeType(ArrayRef<uint64_t> scratch,
@@ -5317,8 +5322,11 @@ class TypeDeserializer {
53175322
if (!layout)
53185323
return nullptr;
53195324

5320-
auto subMap = MF.getSubstitutionMap(subMapID);
5321-
return SILBoxType::get(ctx, layout, subMap);
5325+
auto subMapOrError = MF.getSubstitutionMapChecked(subMapID);
5326+
if (!subMapOrError)
5327+
return subMapOrError.takeError();
5328+
5329+
return SILBoxType::get(ctx, layout, subMapOrError.get());
53225330
}
53235331

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

55045512
GenericSignature invocationSig =
55055513
MF.getGenericSignature(rawInvocationGenericSig);
5506-
SubstitutionMap invocationSubs =
5507-
MF.getSubstitutionMap(rawInvocationSubs).getCanonical();
5508-
SubstitutionMap patternSubs =
5509-
MF.getSubstitutionMap(rawPatternSubs).getCanonical();
5514+
auto invocationSubsOrErr = MF.getSubstitutionMapChecked(rawInvocationSubs);
5515+
if (!invocationSubsOrErr)
5516+
return invocationSubsOrErr.takeError();
5517+
auto patternSubsOrErr = MF.getSubstitutionMapChecked(rawPatternSubs);
5518+
if (!patternSubsOrErr)
5519+
return patternSubsOrErr.takeError();
55105520

55115521
return SILFunctionType::get(invocationSig, extInfo, coroutineKind.getValue(),
55125522
calleeConvention.getValue(),
55135523
allParams, allYields, allResults,
55145524
errorResult,
5515-
patternSubs, invocationSubs,
5525+
patternSubsOrErr.get().getCanonical(),
5526+
invocationSubsOrErr.get().getCanonical(),
55165527
ctx, witnessMethodConformance);
55175528
}
55185529

0 commit comments

Comments
 (0)