53
53
54
54
#define DEBUG_TYPE " Serialization"
55
55
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
+
56
66
STATISTIC (NumDeclsLoaded, " # of decls deserialized" );
57
67
STATISTIC (NumMemberListsLoaded,
58
68
" # of nominals/extensions whose members were loaded" );
@@ -2740,7 +2750,9 @@ Expected<DeclContext *>ModuleFile::getLocalDeclContext(LocalDeclContextID DCID)
2740
2750
implicit,
2741
2751
discriminator,
2742
2752
parentID);
2743
- DeclContext *parent = getDeclContext (parentID);
2753
+ DeclContext *parent;
2754
+ UNWRAP (getDeclContextChecked (parentID), parent);
2755
+
2744
2756
auto type = getType (closureTypeID);
2745
2757
2746
2758
declContextOrOffset = new (ctx)
@@ -2752,7 +2764,8 @@ Expected<DeclContext *>ModuleFile::getLocalDeclContext(LocalDeclContextID DCID)
2752
2764
DeclContextID parentID;
2753
2765
decls_block::TopLevelCodeDeclContextLayout::readRecord (scratch,
2754
2766
parentID);
2755
- DeclContext *parent = getDeclContext (parentID);
2767
+ DeclContext *parent;
2768
+ UNWRAP (getDeclContextChecked (parentID), parent);
2756
2769
2757
2770
declContextOrOffset = new (ctx) SerializedTopLevelCodeDeclContext (parent);
2758
2771
break ;
@@ -2782,7 +2795,8 @@ Expected<DeclContext *>ModuleFile::getLocalDeclContext(LocalDeclContextID DCID)
2782
2795
decls_block::DefaultArgumentInitializerLayout::readRecord (scratch,
2783
2796
parentID,
2784
2797
index);
2785
- DeclContext *parent = getDeclContext (parentID);
2798
+ DeclContext *parent;
2799
+ UNWRAP (getDeclContextChecked (parentID), parent);
2786
2800
2787
2801
declContextOrOffset = new (ctx) DefaultArgumentInitializer (parent, index);
2788
2802
break ;
@@ -3357,7 +3371,8 @@ class DeclDeserializer {
3357
3371
}
3358
3372
}
3359
3373
3360
- auto DC = MF.getDeclContext (contextID);
3374
+ DeclContext *DC;
3375
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
3361
3376
3362
3377
auto genericParams = MF.maybeReadGenericParams (DC);
3363
3378
if (declOrOffset.isComplete ())
@@ -3429,7 +3444,9 @@ class DeclDeserializer {
3429
3444
isImplicit,
3430
3445
rawOverriddenIDs);
3431
3446
3432
- auto DC = MF.getDeclContext (contextID);
3447
+ DeclContext *DC;
3448
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
3449
+
3433
3450
if (declOrOffset.isComplete ())
3434
3451
return declOrOffset;
3435
3452
@@ -3612,7 +3629,9 @@ class DeclDeserializer {
3612
3629
}
3613
3630
}
3614
3631
3615
- auto parent = MF.getDeclContext (contextID);
3632
+ DeclContext *parent;
3633
+ UNWRAP (MF.getDeclContextChecked (contextID), parent);
3634
+
3616
3635
if (declOrOffset.isComplete ())
3617
3636
return declOrOffset;
3618
3637
@@ -3776,7 +3795,9 @@ class DeclDeserializer {
3776
3795
}
3777
3796
}
3778
3797
3779
- auto DC = MF.getDeclContext (contextID);
3798
+ DeclContext *DC;
3799
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
3800
+
3780
3801
if (declOrOffset.isComplete ())
3781
3802
return declOrOffset;
3782
3803
@@ -3932,7 +3953,9 @@ class DeclDeserializer {
3932
3953
auto paramName = MF.getIdentifier (paramNameID);
3933
3954
PrettySupplementalDeclNameTrace trace (paramName);
3934
3955
3935
- auto DC = MF.getDeclContext (contextID);
3956
+ DeclContext *DC;
3957
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
3958
+
3936
3959
if (declOrOffset.isComplete ())
3937
3960
return declOrOffset;
3938
3961
@@ -4148,7 +4171,9 @@ class DeclDeserializer {
4148
4171
}
4149
4172
}
4150
4173
4151
- auto DC = MF.getDeclContext (contextID);
4174
+ DeclContext *DC;
4175
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4176
+
4152
4177
if (declOrOffset.isComplete ())
4153
4178
return declOrOffset;
4154
4179
@@ -4370,7 +4395,9 @@ class DeclDeserializer {
4370
4395
rawAccessLevel,
4371
4396
exportUnderlyingType);
4372
4397
4373
- auto declContext = MF.getDeclContext (contextID);
4398
+ DeclContext *declContext;
4399
+ UNWRAP (MF.getDeclContextChecked (contextID), declContext);
4400
+
4374
4401
auto interfaceSigOrErr = MF.getGenericSignatureChecked (interfaceSigID);
4375
4402
if (!interfaceSigOrErr)
4376
4403
return interfaceSigOrErr.takeError ();
@@ -4473,7 +4500,8 @@ class DeclDeserializer {
4473
4500
if (!StaticSpelling.has_value ())
4474
4501
return MF.diagnoseFatal ();
4475
4502
4476
- auto dc = MF.getDeclContext (contextID);
4503
+ DeclContext *dc;
4504
+ UNWRAP (MF.getDeclContextChecked (contextID), dc);
4477
4505
4478
4506
SmallVector<std::pair<Pattern *, DeclContextID>, 4 > patterns;
4479
4507
for (unsigned i = 0 ; i != numPatterns; ++i) {
@@ -4509,8 +4537,11 @@ class DeclDeserializer {
4509
4537
4510
4538
for (unsigned i = 0 ; i != patterns.size (); ++i) {
4511
4539
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));
4514
4545
}
4515
4546
4516
4547
return binding;
@@ -4543,7 +4574,9 @@ class DeclDeserializer {
4543
4574
}
4544
4575
}
4545
4576
4546
- auto DC = MF.getDeclContext (contextID);
4577
+ DeclContext *DC;
4578
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4579
+
4547
4580
if (declOrOffset.isComplete ())
4548
4581
return declOrOffset;
4549
4582
@@ -4614,7 +4647,8 @@ class DeclDeserializer {
4614
4647
Identifier name = MF.getIdentifier (nameID);
4615
4648
PrettySupplementalDeclNameTrace trace (name);
4616
4649
4617
- auto DC = MF.getDeclContext (contextID);
4650
+ DeclContext *DC;
4651
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4618
4652
4619
4653
auto result = MF.createDecl <OperatorDecl>(
4620
4654
DC, SourceLoc (), name, SourceLoc ());
@@ -4650,7 +4684,8 @@ class DeclDeserializer {
4650
4684
if (!precedenceGroup)
4651
4685
return precedenceGroup.takeError ();
4652
4686
4653
- auto DC = MF.getDeclContext (contextID);
4687
+ DeclContext *DC;
4688
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4654
4689
4655
4690
auto result = MF.createDecl <InfixOperatorDecl>(
4656
4691
DC, SourceLoc (), name, SourceLoc (), SourceLoc (), Identifier (),
@@ -4677,7 +4712,8 @@ class DeclDeserializer {
4677
4712
assignment, numHigherThan,
4678
4713
rawRelations);
4679
4714
4680
- auto DC = MF.getDeclContext (contextID);
4715
+ DeclContext *DC;
4716
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4681
4717
4682
4718
auto associativity = getActualAssociativity (rawAssociativity);
4683
4719
if (!associativity.has_value ())
@@ -4760,7 +4796,9 @@ class DeclDeserializer {
4760
4796
}
4761
4797
}
4762
4798
4763
- auto DC = MF.getDeclContext (contextID);
4799
+ DeclContext *DC;
4800
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4801
+
4764
4802
if (declOrOffset.isComplete ())
4765
4803
return declOrOffset;
4766
4804
@@ -4921,7 +4959,9 @@ class DeclDeserializer {
4921
4959
}
4922
4960
}
4923
4961
4924
- DeclContext *DC = MF.getDeclContext (contextID);
4962
+ DeclContext *DC;
4963
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4964
+
4925
4965
if (declOrOffset.isComplete ())
4926
4966
return declOrOffset;
4927
4967
@@ -5028,7 +5068,9 @@ class DeclDeserializer {
5028
5068
}
5029
5069
}
5030
5070
5031
- auto parent = MF.getDeclContext (contextID);
5071
+ DeclContext *parent;
5072
+ UNWRAP (MF.getDeclContextChecked (contextID), parent);
5073
+
5032
5074
if (declOrOffset.isComplete ())
5033
5075
return declOrOffset;
5034
5076
@@ -5103,7 +5145,8 @@ class DeclDeserializer {
5103
5145
numConformances, numInherited,
5104
5146
data);
5105
5147
5106
- auto DC = MF.getDeclContext (contextID);
5148
+ DeclContext *DC;
5149
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
5107
5150
5108
5151
auto conformanceIDs = data.slice (0 , numConformances);
5109
5152
data = data.slice (numConformances);
@@ -5190,7 +5233,9 @@ class DeclDeserializer {
5190
5233
isImplicit, isObjC,
5191
5234
genericSigID);
5192
5235
5193
- DeclContext *DC = MF.getDeclContext (contextID);
5236
+ DeclContext *DC;
5237
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
5238
+
5194
5239
if (declOrOffset.isComplete ())
5195
5240
return declOrOffset;
5196
5241
@@ -5265,7 +5310,9 @@ class DeclDeserializer {
5265
5310
}
5266
5311
}
5267
5312
5268
- auto parent = MF.getDeclContext (contextID);
5313
+ DeclContext *parent;
5314
+ UNWRAP (MF.getDeclContextChecked (contextID), parent);
5315
+
5269
5316
if (declOrOffset.isComplete ())
5270
5317
return declOrOffset;
5271
5318
0 commit comments