@@ -1192,10 +1192,6 @@ void LazyConformanceLoader::anchor() {}
11921192// / Lookup table used to store members of a nominal type (and its extensions)
11931193// / for fast retrieval.
11941194class swift ::MemberLookupTable : public ASTAllocated<swift::MemberLookupTable> {
1195- // / The last extension that was included within the member lookup table's
1196- // / results.
1197- ExtensionDecl *LastExtensionIncluded = nullptr ;
1198-
11991195 // / The type of the internal lookup table.
12001196 typedef llvm::DenseMap<DeclName, llvm::TinyPtrVector<ValueDecl *>>
12011197 LookupTable;
@@ -1212,9 +1208,6 @@ class swift::MemberLookupTable : public ASTAllocated<swift::MemberLookupTable> {
12121208 // / Create a new member lookup table.
12131209 explicit MemberLookupTable (ASTContext &ctx);
12141210
1215- // / Update a lookup table with members from newly-added extensions.
1216- void updateLookupTable (NominalTypeDecl *nominal);
1217-
12181211 // / Add the given member to the lookup table.
12191212 void addMember (Decl *members);
12201213
@@ -1250,12 +1243,6 @@ class swift::MemberLookupTable : public ASTAllocated<swift::MemberLookupTable> {
12501243 }
12511244
12521245 void dump (llvm::raw_ostream &os) const {
1253- os << " LastExtensionIncluded:\n " ;
1254- if (LastExtensionIncluded)
1255- LastExtensionIncluded->printContext (os, 2 );
1256- else
1257- os << " nullptr\n " ;
1258-
12591246 os << " Lookup:\n " ;
12601247 for (auto &pair : Lookup) {
12611248 pair.getFirst ().print (os);
@@ -1357,42 +1344,32 @@ void MemberLookupTable::addMembers(DeclRange members) {
13571344 }
13581345}
13591346
1360- void MemberLookupTable::updateLookupTable (NominalTypeDecl *nominal) {
1361- // If the last extension we included is the same as the last known extension,
1362- // we're already up-to-date.
1363- if (LastExtensionIncluded == nominal->LastExtension )
1347+ void NominalTypeDecl::addedExtension (ExtensionDecl *ext) {
1348+ if (!LookupTable.getInt ())
13641349 return ;
13651350
1366- // Add members from each of the extensions that we have not yet visited.
1367- for (auto next = LastExtensionIncluded
1368- ? LastExtensionIncluded->NextExtension .getPointer ()
1369- : nominal->FirstExtension ;
1370- next;
1371- (LastExtensionIncluded = next,next = next->NextExtension .getPointer ())) {
1372- addMembers (next->getMembers ());
1373- }
1374- }
1375-
1376- void NominalTypeDecl::addedExtension (ExtensionDecl *ext) {
1377- if (!LookupTable) return ;
1351+ auto *table = LookupTable.getPointer ();
1352+ assert (table);
13781353
13791354 if (ext->hasLazyMembers ()) {
1380- LookupTable ->addMembers (ext->getCurrentMembersWithoutLoading ());
1381- LookupTable ->clearLazilyCompleteCache ();
1355+ table ->addMembers (ext->getCurrentMembersWithoutLoading ());
1356+ table ->clearLazilyCompleteCache ();
13821357 } else {
1383- LookupTable ->addMembers (ext->getMembers ());
1358+ table ->addMembers (ext->getMembers ());
13841359 }
13851360}
13861361
13871362void NominalTypeDecl::addedMember (Decl *member) {
13881363 // If we have a lookup table, add the new member to it. If not, we'll pick up
13891364 // this member when we first create the table.
13901365 auto *vd = dyn_cast<ValueDecl>(member);
1391- auto *lookup = LookupTable;
1392- if (!vd || !lookup)
1366+ if (!vd || !LookupTable.getInt ())
13931367 return ;
13941368
1395- lookup->addMember (vd);
1369+ auto *table = LookupTable.getPointer ();
1370+ assert (table);
1371+
1372+ table->addMember (vd);
13961373}
13971374
13981375void ExtensionDecl::addedMember (Decl *member) {
@@ -1406,9 +1383,7 @@ void ExtensionDecl::addedMember(Decl *member) {
14061383}
14071384
14081385void NominalTypeDecl::addMemberToLookupTable (Decl *member) {
1409- prepareLookupTable ();
1410-
1411- LookupTable->addMember (member);
1386+ getLookupTable ()->addMember (member);
14121387}
14131388
14141389// For lack of anywhere more sensible to put it, here's a diagram of the pieces
@@ -1506,37 +1481,52 @@ populateLookupTableEntryFromExtensions(ASTContext &ctx,
15061481 }
15071482}
15081483
1484+ MemberLookupTable *NominalTypeDecl::getLookupTable () {
1485+ if (!LookupTable.getPointer ()) {
1486+ auto &ctx = getASTContext ();
1487+ LookupTable.setPointer (new (ctx) MemberLookupTable (ctx));
1488+ }
1489+
1490+ return LookupTable.getPointer ();
1491+ }
1492+
15091493void NominalTypeDecl::prepareLookupTable () {
1510- // If we have already allocated the lookup table, then there's nothing further
1494+ // If we have already prepared the lookup table, then there's nothing further
15111495 // to do.
1512- if (LookupTable) {
1496+ if (LookupTable. getInt ())
15131497 return ;
1514- }
15151498
1516- // Otherwise start the first fill.
1517- auto &ctx = getASTContext ();
1518- LookupTable = new (ctx) MemberLookupTable (ctx);
1499+ auto *table = getLookupTable ();
15191500
1501+ // Otherwise start the first fill.
15201502 if (hasLazyMembers ()) {
15211503 assert (!hasUnparsedMembers ());
1522- LookupTable ->addMembers (getCurrentMembersWithoutLoading ());
1504+ table ->addMembers (getCurrentMembersWithoutLoading ());
15231505 } else {
1524- LookupTable ->addMembers (getMembers ());
1506+ table ->addMembers (getMembers ());
15251507 }
1526- }
15271508
1528- void NominalTypeDecl::addLoadedExtensions () {
1509+ // Note: this calls prepareExtensions()
15291510 for (auto e : getExtensions ()) {
15301511 // If we can lazy-load this extension, only take the members we've loaded
15311512 // so far.
1513+ //
1514+ // FIXME: This should be 'e->hasLazyMembers()' but that crashes` because
1515+ // some imported extensions don't have a Clang node, and only support
1516+ // LazyMemberLoader::loadAllMembers() and not
1517+ // LazyMemberLoader::loadNamedMembers().
15321518 if (e->wasDeserialized () || e->hasClangNode ()) {
1533- LookupTable ->addMembers (e->getCurrentMembersWithoutLoading ());
1519+ table ->addMembers (e->getCurrentMembersWithoutLoading ());
15341520 continue ;
15351521 }
15361522
15371523 // Else, load all the members into the table.
1538- LookupTable ->addMembers (e->getMembers ());
1524+ table ->addMembers (e->getMembers ());
15391525 }
1526+
1527+ // Any extensions added after this point will add their members to the
1528+ // lookup table.
1529+ LookupTable.setInt (true );
15401530}
15411531
15421532static TinyPtrVector<ValueDecl *>
@@ -1592,12 +1582,12 @@ DirectLookupRequest::evaluate(Evaluator &evaluator,
15921582
15931583 decl->prepareLookupTable ();
15941584
1595- // If we're allowed to load extensions, call addLoadedExtensions to ensure we
1596- // properly invalidate the lazily-complete cache for any extensions brought in
1597- // by modules loaded after-the-fact. This can happen with the LLDB REPL.
1598- decl->addLoadedExtensions ();
1585+ // Call prepareExtensions() to ensure we properly invalidate the
1586+ // lazily-complete cache for any extensions brought in by modules
1587+ // loaded after-the-fact. This can happen with the LLDB REPL.
1588+ decl->prepareExtensions ();
15991589
1600- auto &Table = *decl->LookupTable ;
1590+ auto &Table = *decl->getLookupTable () ;
16011591 if (!useNamedLazyMemberLoading) {
16021592 // Make sure we have the complete list of members (in this nominal and in
16031593 // all extensions).
@@ -1606,7 +1596,6 @@ DirectLookupRequest::evaluate(Evaluator &evaluator,
16061596 for (auto E : decl->getExtensions ())
16071597 (void )E->getMembers ();
16081598
1609- Table.updateLookupTable (decl);
16101599 } else if (!Table.isLazilyComplete (name.getBaseName ())) {
16111600 DeclBaseName baseName (name.getBaseName ());
16121601
0 commit comments