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+
5666STATISTIC (NumDeclsLoaded, " # of decls deserialized" );
5767STATISTIC (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