Skip to content

Commit df63a18

Browse files
authored
Merge pull request swiftlang#73113 from xymus/serial-get-context
Serialization: Intro the `UNWRAP` macro and protect against most errors in contexts
2 parents 07808e2 + bb25702 commit df63a18

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
@@ -53,6 +53,16 @@
5353

5454
#define DEBUG_TYPE "Serialization"
5555

56+
// Unwrap an Expected<> variable following the typical deserialization pattern:
57+
// - On a value, assign it to Output.
58+
// - On an error, return it to bubble it up to the caller.
59+
#define UNWRAP(Input, Output) { \
60+
auto ValueOrError = Input; \
61+
if (!ValueOrError) \
62+
return ValueOrError.takeError(); \
63+
Output = ValueOrError.get(); \
64+
}
65+
5666
STATISTIC(NumDeclsLoaded, "# of decls deserialized");
5767
STATISTIC(NumMemberListsLoaded,
5868
"# of nominals/extensions whose members were loaded");
@@ -2740,7 +2750,9 @@ Expected<DeclContext *>ModuleFile::getLocalDeclContext(LocalDeclContextID DCID)
27402750
implicit,
27412751
discriminator,
27422752
parentID);
2743-
DeclContext *parent = getDeclContext(parentID);
2753+
DeclContext *parent;
2754+
UNWRAP(getDeclContextChecked(parentID), parent);
2755+
27442756
auto type = getType(closureTypeID);
27452757

27462758
declContextOrOffset = new (ctx)
@@ -2752,7 +2764,8 @@ Expected<DeclContext *>ModuleFile::getLocalDeclContext(LocalDeclContextID DCID)
27522764
DeclContextID parentID;
27532765
decls_block::TopLevelCodeDeclContextLayout::readRecord(scratch,
27542766
parentID);
2755-
DeclContext *parent = getDeclContext(parentID);
2767+
DeclContext *parent;
2768+
UNWRAP(getDeclContextChecked(parentID), parent);
27562769

27572770
declContextOrOffset = new (ctx) SerializedTopLevelCodeDeclContext(parent);
27582771
break;
@@ -2782,7 +2795,8 @@ Expected<DeclContext *>ModuleFile::getLocalDeclContext(LocalDeclContextID DCID)
27822795
decls_block::DefaultArgumentInitializerLayout::readRecord(scratch,
27832796
parentID,
27842797
index);
2785-
DeclContext *parent = getDeclContext(parentID);
2798+
DeclContext *parent;
2799+
UNWRAP(getDeclContextChecked(parentID), parent);
27862800

27872801
declContextOrOffset = new (ctx) DefaultArgumentInitializer(parent, index);
27882802
break;
@@ -3357,7 +3371,8 @@ class DeclDeserializer {
33573371
}
33583372
}
33593373

3360-
auto DC = MF.getDeclContext(contextID);
3374+
DeclContext *DC;
3375+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
33613376

33623377
auto genericParams = MF.maybeReadGenericParams(DC);
33633378
if (declOrOffset.isComplete())
@@ -3429,7 +3444,9 @@ class DeclDeserializer {
34293444
isImplicit,
34303445
rawOverriddenIDs);
34313446

3432-
auto DC = MF.getDeclContext(contextID);
3447+
DeclContext *DC;
3448+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
3449+
34333450
if (declOrOffset.isComplete())
34343451
return declOrOffset;
34353452

@@ -3612,7 +3629,9 @@ class DeclDeserializer {
36123629
}
36133630
}
36143631

3615-
auto parent = MF.getDeclContext(contextID);
3632+
DeclContext *parent;
3633+
UNWRAP(MF.getDeclContextChecked(contextID), parent);
3634+
36163635
if (declOrOffset.isComplete())
36173636
return declOrOffset;
36183637

@@ -3776,7 +3795,9 @@ class DeclDeserializer {
37763795
}
37773796
}
37783797

3779-
auto DC = MF.getDeclContext(contextID);
3798+
DeclContext *DC;
3799+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
3800+
37803801
if (declOrOffset.isComplete())
37813802
return declOrOffset;
37823803

@@ -3932,7 +3953,9 @@ class DeclDeserializer {
39323953
auto paramName = MF.getIdentifier(paramNameID);
39333954
PrettySupplementalDeclNameTrace trace(paramName);
39343955

3935-
auto DC = MF.getDeclContext(contextID);
3956+
DeclContext *DC;
3957+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
3958+
39363959
if (declOrOffset.isComplete())
39373960
return declOrOffset;
39383961

@@ -4148,7 +4171,9 @@ class DeclDeserializer {
41484171
}
41494172
}
41504173

4151-
auto DC = MF.getDeclContext(contextID);
4174+
DeclContext *DC;
4175+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
4176+
41524177
if (declOrOffset.isComplete())
41534178
return declOrOffset;
41544179

@@ -4370,7 +4395,9 @@ class DeclDeserializer {
43704395
rawAccessLevel,
43714396
exportUnderlyingType);
43724397

4373-
auto declContext = MF.getDeclContext(contextID);
4398+
DeclContext *declContext;
4399+
UNWRAP(MF.getDeclContextChecked(contextID), declContext);
4400+
43744401
auto interfaceSigOrErr = MF.getGenericSignatureChecked(interfaceSigID);
43754402
if (!interfaceSigOrErr)
43764403
return interfaceSigOrErr.takeError();
@@ -4473,7 +4500,8 @@ class DeclDeserializer {
44734500
if (!StaticSpelling.has_value())
44744501
return MF.diagnoseFatal();
44754502

4476-
auto dc = MF.getDeclContext(contextID);
4503+
DeclContext *dc;
4504+
UNWRAP(MF.getDeclContextChecked(contextID), dc);
44774505

44784506
SmallVector<std::pair<Pattern *, DeclContextID>, 4> patterns;
44794507
for (unsigned i = 0; i != numPatterns; ++i) {
@@ -4509,8 +4537,11 @@ class DeclDeserializer {
45094537

45104538
for (unsigned i = 0; i != patterns.size(); ++i) {
45114539
binding->setPattern(i, patterns[i].first);
4512-
if (auto *context = MF.getDeclContext(patterns[i].second))
4513-
binding->setInitContext(i, cast<PatternBindingInitializer>(context));
4540+
4541+
DeclContext *dcPattern;
4542+
UNWRAP(MF.getDeclContextChecked(patterns[i].second), dcPattern);
4543+
if (dcPattern)
4544+
binding->setInitContext(i, cast<PatternBindingInitializer>(dcPattern));
45144545
}
45154546

45164547
return binding;
@@ -4543,7 +4574,9 @@ class DeclDeserializer {
45434574
}
45444575
}
45454576

4546-
auto DC = MF.getDeclContext(contextID);
4577+
DeclContext *DC;
4578+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
4579+
45474580
if (declOrOffset.isComplete())
45484581
return declOrOffset;
45494582

@@ -4614,7 +4647,8 @@ class DeclDeserializer {
46144647
Identifier name = MF.getIdentifier(nameID);
46154648
PrettySupplementalDeclNameTrace trace(name);
46164649

4617-
auto DC = MF.getDeclContext(contextID);
4650+
DeclContext *DC;
4651+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
46184652

46194653
auto result = MF.createDecl<OperatorDecl>(
46204654
DC, SourceLoc(), name, SourceLoc());
@@ -4650,7 +4684,8 @@ class DeclDeserializer {
46504684
if (!precedenceGroup)
46514685
return precedenceGroup.takeError();
46524686

4653-
auto DC = MF.getDeclContext(contextID);
4687+
DeclContext *DC;
4688+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
46544689

46554690
auto result = MF.createDecl<InfixOperatorDecl>(
46564691
DC, SourceLoc(), name, SourceLoc(), SourceLoc(), Identifier(),
@@ -4677,7 +4712,8 @@ class DeclDeserializer {
46774712
assignment, numHigherThan,
46784713
rawRelations);
46794714

4680-
auto DC = MF.getDeclContext(contextID);
4715+
DeclContext *DC;
4716+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
46814717

46824718
auto associativity = getActualAssociativity(rawAssociativity);
46834719
if (!associativity.has_value())
@@ -4760,7 +4796,9 @@ class DeclDeserializer {
47604796
}
47614797
}
47624798

4763-
auto DC = MF.getDeclContext(contextID);
4799+
DeclContext *DC;
4800+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
4801+
47644802
if (declOrOffset.isComplete())
47654803
return declOrOffset;
47664804

@@ -4921,7 +4959,9 @@ class DeclDeserializer {
49214959
}
49224960
}
49234961

4924-
DeclContext *DC = MF.getDeclContext(contextID);
4962+
DeclContext *DC;
4963+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
4964+
49254965
if (declOrOffset.isComplete())
49264966
return declOrOffset;
49274967

@@ -5028,7 +5068,9 @@ class DeclDeserializer {
50285068
}
50295069
}
50305070

5031-
auto parent = MF.getDeclContext(contextID);
5071+
DeclContext *parent;
5072+
UNWRAP(MF.getDeclContextChecked(contextID), parent);
5073+
50325074
if (declOrOffset.isComplete())
50335075
return declOrOffset;
50345076

@@ -5103,7 +5145,8 @@ class DeclDeserializer {
51035145
numConformances, numInherited,
51045146
data);
51055147

5106-
auto DC = MF.getDeclContext(contextID);
5148+
DeclContext *DC;
5149+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
51075150

51085151
auto conformanceIDs = data.slice(0, numConformances);
51095152
data = data.slice(numConformances);
@@ -5190,7 +5233,9 @@ class DeclDeserializer {
51905233
isImplicit, isObjC,
51915234
genericSigID);
51925235

5193-
DeclContext *DC = MF.getDeclContext(contextID);
5236+
DeclContext *DC;
5237+
UNWRAP(MF.getDeclContextChecked(contextID), DC);
5238+
51945239
if (declOrOffset.isComplete())
51955240
return declOrOffset;
51965241

@@ -5265,7 +5310,9 @@ class DeclDeserializer {
52655310
}
52665311
}
52675312

5268-
auto parent = MF.getDeclContext(contextID);
5313+
DeclContext *parent;
5314+
UNWRAP(MF.getDeclContextChecked(contextID), parent);
5315+
52695316
if (declOrOffset.isComplete())
52705317
return declOrOffset;
52715318

0 commit comments

Comments
 (0)