52
52
53
53
#define DEBUG_TYPE " Serialization"
54
54
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
+
55
65
STATISTIC (NumDeclsLoaded, " # of decls deserialized" );
56
66
STATISTIC (NumMemberListsLoaded,
57
67
" # of nominals/extensions whose members were loaded" );
@@ -2716,7 +2726,9 @@ Expected<DeclContext *>ModuleFile::getLocalDeclContext(LocalDeclContextID DCID)
2716
2726
implicit,
2717
2727
discriminator,
2718
2728
parentID);
2719
- DeclContext *parent = getDeclContext (parentID);
2729
+ DeclContext *parent;
2730
+ UNWRAP (getDeclContextChecked (parentID), parent);
2731
+
2720
2732
auto type = getType (closureTypeID);
2721
2733
2722
2734
declContextOrOffset = new (ctx)
@@ -2728,7 +2740,8 @@ Expected<DeclContext *>ModuleFile::getLocalDeclContext(LocalDeclContextID DCID)
2728
2740
DeclContextID parentID;
2729
2741
decls_block::TopLevelCodeDeclContextLayout::readRecord (scratch,
2730
2742
parentID);
2731
- DeclContext *parent = getDeclContext (parentID);
2743
+ DeclContext *parent;
2744
+ UNWRAP (getDeclContextChecked (parentID), parent);
2732
2745
2733
2746
declContextOrOffset = new (ctx) SerializedTopLevelCodeDeclContext (parent);
2734
2747
break ;
@@ -2758,7 +2771,8 @@ Expected<DeclContext *>ModuleFile::getLocalDeclContext(LocalDeclContextID DCID)
2758
2771
decls_block::DefaultArgumentInitializerLayout::readRecord (scratch,
2759
2772
parentID,
2760
2773
index);
2761
- DeclContext *parent = getDeclContext (parentID);
2774
+ DeclContext *parent;
2775
+ UNWRAP (getDeclContextChecked (parentID), parent);
2762
2776
2763
2777
declContextOrOffset = new (ctx) DefaultArgumentInitializer (parent, index);
2764
2778
break ;
@@ -3333,7 +3347,8 @@ class DeclDeserializer {
3333
3347
}
3334
3348
}
3335
3349
3336
- auto DC = MF.getDeclContext (contextID);
3350
+ DeclContext *DC;
3351
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
3337
3352
3338
3353
auto genericParams = MF.maybeReadGenericParams (DC);
3339
3354
if (declOrOffset.isComplete ())
@@ -3405,7 +3420,9 @@ class DeclDeserializer {
3405
3420
isImplicit,
3406
3421
rawOverriddenIDs);
3407
3422
3408
- auto DC = MF.getDeclContext (contextID);
3423
+ DeclContext *DC;
3424
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
3425
+
3409
3426
if (declOrOffset.isComplete ())
3410
3427
return declOrOffset;
3411
3428
@@ -3588,7 +3605,9 @@ class DeclDeserializer {
3588
3605
}
3589
3606
}
3590
3607
3591
- auto parent = MF.getDeclContext (contextID);
3608
+ DeclContext *parent;
3609
+ UNWRAP (MF.getDeclContextChecked (contextID), parent);
3610
+
3592
3611
if (declOrOffset.isComplete ())
3593
3612
return declOrOffset;
3594
3613
@@ -3752,7 +3771,9 @@ class DeclDeserializer {
3752
3771
}
3753
3772
}
3754
3773
3755
- auto DC = MF.getDeclContext (contextID);
3774
+ DeclContext *DC;
3775
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
3776
+
3756
3777
if (declOrOffset.isComplete ())
3757
3778
return declOrOffset;
3758
3779
@@ -3908,7 +3929,9 @@ class DeclDeserializer {
3908
3929
auto paramName = MF.getIdentifier (paramNameID);
3909
3930
PrettySupplementalDeclNameTrace trace (paramName);
3910
3931
3911
- auto DC = MF.getDeclContext (contextID);
3932
+ DeclContext *DC;
3933
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
3934
+
3912
3935
if (declOrOffset.isComplete ())
3913
3936
return declOrOffset;
3914
3937
@@ -4124,7 +4147,9 @@ class DeclDeserializer {
4124
4147
}
4125
4148
}
4126
4149
4127
- auto DC = MF.getDeclContext (contextID);
4150
+ DeclContext *DC;
4151
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4152
+
4128
4153
if (declOrOffset.isComplete ())
4129
4154
return declOrOffset;
4130
4155
@@ -4346,7 +4371,9 @@ class DeclDeserializer {
4346
4371
rawAccessLevel,
4347
4372
exportUnderlyingType);
4348
4373
4349
- auto declContext = MF.getDeclContext (contextID);
4374
+ DeclContext *declContext;
4375
+ UNWRAP (MF.getDeclContextChecked (contextID), declContext);
4376
+
4350
4377
auto interfaceSigOrErr = MF.getGenericSignatureChecked (interfaceSigID);
4351
4378
if (!interfaceSigOrErr)
4352
4379
return interfaceSigOrErr.takeError ();
@@ -4449,7 +4476,8 @@ class DeclDeserializer {
4449
4476
if (!StaticSpelling.has_value ())
4450
4477
return MF.diagnoseFatal ();
4451
4478
4452
- auto dc = MF.getDeclContext (contextID);
4479
+ DeclContext *dc;
4480
+ UNWRAP (MF.getDeclContextChecked (contextID), dc);
4453
4481
4454
4482
SmallVector<std::pair<Pattern *, DeclContextID>, 4 > patterns;
4455
4483
for (unsigned i = 0 ; i != numPatterns; ++i) {
@@ -4485,8 +4513,11 @@ class DeclDeserializer {
4485
4513
4486
4514
for (unsigned i = 0 ; i != patterns.size (); ++i) {
4487
4515
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));
4490
4521
}
4491
4522
4492
4523
return binding;
@@ -4519,7 +4550,9 @@ class DeclDeserializer {
4519
4550
}
4520
4551
}
4521
4552
4522
- auto DC = MF.getDeclContext (contextID);
4553
+ DeclContext *DC;
4554
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4555
+
4523
4556
if (declOrOffset.isComplete ())
4524
4557
return declOrOffset;
4525
4558
@@ -4590,7 +4623,8 @@ class DeclDeserializer {
4590
4623
Identifier name = MF.getIdentifier (nameID);
4591
4624
PrettySupplementalDeclNameTrace trace (name);
4592
4625
4593
- auto DC = MF.getDeclContext (contextID);
4626
+ DeclContext *DC;
4627
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4594
4628
4595
4629
auto result = MF.createDecl <OperatorDecl>(
4596
4630
DC, SourceLoc (), name, SourceLoc ());
@@ -4626,7 +4660,8 @@ class DeclDeserializer {
4626
4660
if (!precedenceGroup)
4627
4661
return precedenceGroup.takeError ();
4628
4662
4629
- auto DC = MF.getDeclContext (contextID);
4663
+ DeclContext *DC;
4664
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4630
4665
4631
4666
auto result = MF.createDecl <InfixOperatorDecl>(
4632
4667
DC, SourceLoc (), name, SourceLoc (), SourceLoc (), Identifier (),
@@ -4653,7 +4688,8 @@ class DeclDeserializer {
4653
4688
assignment, numHigherThan,
4654
4689
rawRelations);
4655
4690
4656
- auto DC = MF.getDeclContext (contextID);
4691
+ DeclContext *DC;
4692
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4657
4693
4658
4694
auto associativity = getActualAssociativity (rawAssociativity);
4659
4695
if (!associativity.has_value ())
@@ -4736,7 +4772,9 @@ class DeclDeserializer {
4736
4772
}
4737
4773
}
4738
4774
4739
- auto DC = MF.getDeclContext (contextID);
4775
+ DeclContext *DC;
4776
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4777
+
4740
4778
if (declOrOffset.isComplete ())
4741
4779
return declOrOffset;
4742
4780
@@ -4897,7 +4935,9 @@ class DeclDeserializer {
4897
4935
}
4898
4936
}
4899
4937
4900
- DeclContext *DC = MF.getDeclContext (contextID);
4938
+ DeclContext *DC;
4939
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
4940
+
4901
4941
if (declOrOffset.isComplete ())
4902
4942
return declOrOffset;
4903
4943
@@ -5004,7 +5044,9 @@ class DeclDeserializer {
5004
5044
}
5005
5045
}
5006
5046
5007
- auto parent = MF.getDeclContext (contextID);
5047
+ DeclContext *parent;
5048
+ UNWRAP (MF.getDeclContextChecked (contextID), parent);
5049
+
5008
5050
if (declOrOffset.isComplete ())
5009
5051
return declOrOffset;
5010
5052
@@ -5079,7 +5121,8 @@ class DeclDeserializer {
5079
5121
numConformances, numInherited,
5080
5122
data);
5081
5123
5082
- auto DC = MF.getDeclContext (contextID);
5124
+ DeclContext *DC;
5125
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
5083
5126
5084
5127
auto conformanceIDs = data.slice (0 , numConformances);
5085
5128
data = data.slice (numConformances);
@@ -5166,7 +5209,9 @@ class DeclDeserializer {
5166
5209
isImplicit, isObjC,
5167
5210
genericSigID);
5168
5211
5169
- DeclContext *DC = MF.getDeclContext (contextID);
5212
+ DeclContext *DC;
5213
+ UNWRAP (MF.getDeclContextChecked (contextID), DC);
5214
+
5170
5215
if (declOrOffset.isComplete ())
5171
5216
return declOrOffset;
5172
5217
@@ -5241,7 +5286,9 @@ class DeclDeserializer {
5241
5286
}
5242
5287
}
5243
5288
5244
- auto parent = MF.getDeclContext (contextID);
5289
+ DeclContext *parent;
5290
+ UNWRAP (MF.getDeclContextChecked (contextID), parent);
5291
+
5245
5292
if (declOrOffset.isComplete ())
5246
5293
return declOrOffset;
5247
5294
0 commit comments