Skip to content

Commit 89db645

Browse files
authored
Merge pull request #69375 from hjyamauchi/debugger2
Add a few deserialization recovery paths.
2 parents 64f273c + c4864d2 commit 89db645

File tree

2 files changed

+29
-8
lines changed

2 files changed

+29
-8
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -601,7 +601,10 @@ Expected<Pattern *> ModuleFile::readPattern(DeclContext *owningDC) {
601601

602602
auto var = cast<VarDecl>(deserialized.get());
603603
auto result = NamedPattern::createImplicit(getContext(), var);
604-
recordPatternType(result, getType(typeID));
604+
auto typeOrErr = getTypeChecked(typeID);
605+
if (!typeOrErr)
606+
return typeOrErr.takeError();
607+
recordPatternType(result, typeOrErr.get());
605608
restoreOffset.reset();
606609
return result;
607610
}
@@ -3037,7 +3040,14 @@ void ModuleFile::configureStorage(AbstractStorageDecl *decl,
30373040

30383041
SmallVector<AccessorDecl*, 8> accessors;
30393042
for (DeclID id : rawIDs.IDs) {
3040-
auto accessor = dyn_cast_or_null<AccessorDecl>(getDecl(id));
3043+
auto accessorOrErr = getDeclChecked(id);
3044+
if (!accessorOrErr) {
3045+
if (!getContext().LangOpts.EnableDeserializationRecovery)
3046+
fatal(accessorOrErr.takeError());
3047+
diagnoseAndConsumeError(accessorOrErr.takeError());
3048+
continue;
3049+
}
3050+
auto accessor = dyn_cast_or_null<AccessorDecl>(accessorOrErr.get());
30413051
if (!accessor) return;
30423052
accessors.push_back(accessor);
30433053
}
@@ -3258,9 +3268,11 @@ class DeclDeserializer {
32583268
auto genericSig = MF.getGenericSignature(genericSigID);
32593269
alias->setGenericSignature(genericSig);
32603270

3261-
auto underlying = MF.getType(underlyingTypeID);
3262-
alias->setUnderlyingType(underlying);
3263-
3271+
auto underlyingOrErr = MF.getTypeChecked(underlyingTypeID);
3272+
if (!underlyingOrErr)
3273+
return underlyingOrErr.takeError();
3274+
alias->setUnderlyingType(underlyingOrErr.get());
3275+
32643276
if (auto accessLevel = getActualAccessLevel(rawAccessLevel))
32653277
alias->setAccess(*accessLevel);
32663278
else
@@ -4214,7 +4226,9 @@ class DeclDeserializer {
42144226
rawAccessLevel);
42154227

42164228
auto declContext = MF.getDeclContext(contextID);
4217-
auto interfaceSig = MF.getGenericSignature(interfaceSigID);
4229+
auto interfaceSigOrErr = MF.getGenericSignatureChecked(interfaceSigID);
4230+
if (!interfaceSigOrErr)
4231+
return interfaceSigOrErr.takeError();
42184232

42194233
// Check for reentrancy.
42204234
if (declOrOffset.isComplete())
@@ -4225,7 +4239,7 @@ class DeclDeserializer {
42254239
// Create the decl.
42264240
auto opaqueDecl = OpaqueTypeDecl::get(
42274241
/*NamingDecl=*/ nullptr, genericParams, declContext,
4228-
interfaceSig, /*OpaqueReturnTypeReprs*/ { });
4242+
interfaceSigOrErr.get(), /*OpaqueReturnTypeReprs*/ { });
42294243
declOrOffset = opaqueDecl;
42304244

42314245
auto namingDecl = cast<ValueDecl>(MF.getDecl(namingDeclID));

lib/Serialization/ModuleFile.cpp

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,14 @@ TypeDecl *ModuleFile::lookupNestedType(Identifier name,
440440
Decl *decl = declOrOffset;
441441
if (decl != parent)
442442
continue;
443-
return cast<TypeDecl>(getDecl(entry.second));
443+
Expected<Decl *> typeOrErr = getDeclChecked(entry.second);
444+
if (!typeOrErr) {
445+
if (!getContext().LangOpts.EnableDeserializationRecovery)
446+
fatal(typeOrErr.takeError());
447+
diagnoseAndConsumeError(typeOrErr.takeError());
448+
continue;
449+
}
450+
return cast<TypeDecl>(typeOrErr.get());
444451
}
445452
}
446453
}

0 commit comments

Comments
 (0)