Skip to content

Commit 4d3307a

Browse files
authored
Merge pull request #73139 from xymus/serial-get-context-6.0
[6.0] Serialization: Protect against most errors in contexts for calls to `AnyObject` variables
2 parents 29fb2a6 + f74433b commit 4d3307a

File tree

1 file changed

+70
-23
lines changed

1 file changed

+70
-23
lines changed

lib/Serialization/Deserialization.cpp

Lines changed: 70 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,16 @@
5252

5353
#define DEBUG_TYPE "Serialization"
5454

55+
// Unwrap an Expected<> variable following the typical deserialization pattern:
56+
// - On a value, assign it to Output.
57+
// - On an error, return it to bubble it up to the caller.
58+
#define UNWRAP(Input, Output) { \
59+
auto ValueOrError = Input; \
60+
if (!ValueOrError) \
61+
return ValueOrError.takeError(); \
62+
Output = ValueOrError.get(); \
63+
}
64+
5565
STATISTIC(NumDeclsLoaded, "# of decls deserialized");
5666
STATISTIC(NumMemberListsLoaded,
5767
"# of nominals/extensions whose members were loaded");
@@ -2716,7 +2726,9 @@ Expected<DeclContext *>ModuleFile::getLocalDeclContext(LocalDeclContextID DCID)
27162726
implicit,
27172727
discriminator,
27182728
parentID);
2719-
DeclContext *parent = getDeclContext(parentID);
2729+
DeclContext *parent;
2730+
UNWRAP(getDeclContextChecked(parentID), parent);
2731+
27202732
auto type = getType(closureTypeID);
27212733

27222734
declContextOrOffset = new (ctx)
@@ -2728,7 +2740,8 @@ Expected<DeclContext *>ModuleFile::getLocalDeclContext(LocalDeclContextID DCID)
27282740
DeclContextID parentID;
27292741
decls_block::TopLevelCodeDeclContextLayout::readRecord(scratch,
27302742
parentID);
2731-
DeclContext *parent = getDeclContext(parentID);
2743+
DeclContext *parent;
2744+
UNWRAP(getDeclContextChecked(parentID), parent);
27322745

27332746
declContextOrOffset = new (ctx) SerializedTopLevelCodeDeclContext(parent);
27342747
break;
@@ -2758,7 +2771,8 @@ Expected<DeclContext *>ModuleFile::getLocalDeclContext(LocalDeclContextID DCID)
27582771
decls_block::DefaultArgumentInitializerLayout::readRecord(scratch,
27592772
parentID,
27602773
index);
2761-
DeclContext *parent = getDeclContext(parentID);
2774+
DeclContext *parent;
2775+
UNWRAP(getDeclContextChecked(parentID), parent);
27622776

27632777
declContextOrOffset = new (ctx) DefaultArgumentInitializer(parent, index);
27642778
break;
@@ -3333,7 +3347,8 @@ class DeclDeserializer {
33333347
}
33343348
}
33353349

3336-
auto DC = MF.getDeclContext(contextID);
3350+
DeclContext *DC;
3351+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
33373352

33383353
auto genericParams = MF.maybeReadGenericParams(DC);
33393354
if (declOrOffset.isComplete())
@@ -3405,7 +3420,9 @@ class DeclDeserializer {
34053420
isImplicit,
34063421
rawOverriddenIDs);
34073422

3408-
auto DC = MF.getDeclContext(contextID);
3423+
DeclContext *DC;
3424+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
3425+
34093426
if (declOrOffset.isComplete())
34103427
return declOrOffset;
34113428

@@ -3588,7 +3605,9 @@ class DeclDeserializer {
35883605
}
35893606
}
35903607

3591-
auto parent = MF.getDeclContext(contextID);
3608+
DeclContext *parent;
3609+
UNWRAP(MF.getDeclContextChecked(contextID), parent);
3610+
35923611
if (declOrOffset.isComplete())
35933612
return declOrOffset;
35943613

@@ -3752,7 +3771,9 @@ class DeclDeserializer {
37523771
}
37533772
}
37543773

3755-
auto DC = MF.getDeclContext(contextID);
3774+
DeclContext *DC;
3775+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
3776+
37563777
if (declOrOffset.isComplete())
37573778
return declOrOffset;
37583779

@@ -3908,7 +3929,9 @@ class DeclDeserializer {
39083929
auto paramName = MF.getIdentifier(paramNameID);
39093930
PrettySupplementalDeclNameTrace trace(paramName);
39103931

3911-
auto DC = MF.getDeclContext(contextID);
3932+
DeclContext *DC;
3933+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
3934+
39123935
if (declOrOffset.isComplete())
39133936
return declOrOffset;
39143937

@@ -4124,7 +4147,9 @@ class DeclDeserializer {
41244147
}
41254148
}
41264149

4127-
auto DC = MF.getDeclContext(contextID);
4150+
DeclContext *DC;
4151+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
4152+
41284153
if (declOrOffset.isComplete())
41294154
return declOrOffset;
41304155

@@ -4346,7 +4371,9 @@ class DeclDeserializer {
43464371
rawAccessLevel,
43474372
exportUnderlyingType);
43484373

4349-
auto declContext = MF.getDeclContext(contextID);
4374+
DeclContext *declContext;
4375+
UNWRAP(MF.getDeclContextChecked(contextID), declContext);
4376+
43504377
auto interfaceSigOrErr = MF.getGenericSignatureChecked(interfaceSigID);
43514378
if (!interfaceSigOrErr)
43524379
return interfaceSigOrErr.takeError();
@@ -4449,7 +4476,8 @@ class DeclDeserializer {
44494476
if (!StaticSpelling.has_value())
44504477
return MF.diagnoseFatal();
44514478

4452-
auto dc = MF.getDeclContext(contextID);
4479+
DeclContext *dc;
4480+
UNWRAP(MF.getDeclContextChecked(contextID), dc);
44534481

44544482
SmallVector<std::pair<Pattern *, DeclContextID>, 4> patterns;
44554483
for (unsigned i = 0; i != numPatterns; ++i) {
@@ -4485,8 +4513,11 @@ class DeclDeserializer {
44854513

44864514
for (unsigned i = 0; i != patterns.size(); ++i) {
44874515
binding->setPattern(i, patterns[i].first);
4488-
if (auto *context = MF.getDeclContext(patterns[i].second))
4489-
binding->setInitContext(i, cast<PatternBindingInitializer>(context));
4516+
4517+
DeclContext *dcPattern;
4518+
UNWRAP(MF.getDeclContextChecked(patterns[i].second), dcPattern);
4519+
if (dcPattern)
4520+
binding->setInitContext(i, cast<PatternBindingInitializer>(dcPattern));
44904521
}
44914522

44924523
return binding;
@@ -4519,7 +4550,9 @@ class DeclDeserializer {
45194550
}
45204551
}
45214552

4522-
auto DC = MF.getDeclContext(contextID);
4553+
DeclContext *DC;
4554+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
4555+
45234556
if (declOrOffset.isComplete())
45244557
return declOrOffset;
45254558

@@ -4590,7 +4623,8 @@ class DeclDeserializer {
45904623
Identifier name = MF.getIdentifier(nameID);
45914624
PrettySupplementalDeclNameTrace trace(name);
45924625

4593-
auto DC = MF.getDeclContext(contextID);
4626+
DeclContext *DC;
4627+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
45944628

45954629
auto result = MF.createDecl<OperatorDecl>(
45964630
DC, SourceLoc(), name, SourceLoc());
@@ -4626,7 +4660,8 @@ class DeclDeserializer {
46264660
if (!precedenceGroup)
46274661
return precedenceGroup.takeError();
46284662

4629-
auto DC = MF.getDeclContext(contextID);
4663+
DeclContext *DC;
4664+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
46304665

46314666
auto result = MF.createDecl<InfixOperatorDecl>(
46324667
DC, SourceLoc(), name, SourceLoc(), SourceLoc(), Identifier(),
@@ -4653,7 +4688,8 @@ class DeclDeserializer {
46534688
assignment, numHigherThan,
46544689
rawRelations);
46554690

4656-
auto DC = MF.getDeclContext(contextID);
4691+
DeclContext *DC;
4692+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
46574693

46584694
auto associativity = getActualAssociativity(rawAssociativity);
46594695
if (!associativity.has_value())
@@ -4736,7 +4772,9 @@ class DeclDeserializer {
47364772
}
47374773
}
47384774

4739-
auto DC = MF.getDeclContext(contextID);
4775+
DeclContext *DC;
4776+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
4777+
47404778
if (declOrOffset.isComplete())
47414779
return declOrOffset;
47424780

@@ -4897,7 +4935,9 @@ class DeclDeserializer {
48974935
}
48984936
}
48994937

4900-
DeclContext *DC = MF.getDeclContext(contextID);
4938+
DeclContext *DC;
4939+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
4940+
49014941
if (declOrOffset.isComplete())
49024942
return declOrOffset;
49034943

@@ -5004,7 +5044,9 @@ class DeclDeserializer {
50045044
}
50055045
}
50065046

5007-
auto parent = MF.getDeclContext(contextID);
5047+
DeclContext *parent;
5048+
UNWRAP(MF.getDeclContextChecked(contextID), parent);
5049+
50085050
if (declOrOffset.isComplete())
50095051
return declOrOffset;
50105052

@@ -5079,7 +5121,8 @@ class DeclDeserializer {
50795121
numConformances, numInherited,
50805122
data);
50815123

5082-
auto DC = MF.getDeclContext(contextID);
5124+
DeclContext *DC;
5125+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
50835126

50845127
auto conformanceIDs = data.slice(0, numConformances);
50855128
data = data.slice(numConformances);
@@ -5166,7 +5209,9 @@ class DeclDeserializer {
51665209
isImplicit, isObjC,
51675210
genericSigID);
51685211

5169-
DeclContext *DC = MF.getDeclContext(contextID);
5212+
DeclContext *DC;
5213+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
5214+
51705215
if (declOrOffset.isComplete())
51715216
return declOrOffset;
51725217

@@ -5241,7 +5286,9 @@ class DeclDeserializer {
52415286
}
52425287
}
52435288

5244-
auto parent = MF.getDeclContext(contextID);
5289+
DeclContext *parent;
5290+
UNWRAP(MF.getDeclContextChecked(contextID), parent);
5291+
52455292
if (declOrOffset.isComplete())
52465293
return declOrOffset;
52475294

0 commit comments

Comments
 (0)