@@ -1374,25 +1374,27 @@ void MemberLookupTable::updateLookupTable(NominalTypeDecl *nominal) {
1374
1374
}
1375
1375
1376
1376
void NominalTypeDecl::addedExtension (ExtensionDecl *ext) {
1377
- if (!LookupTable) return ;
1377
+ auto *table = LookupTable.getPointer ();
1378
+
1379
+ if (!table) return ;
1378
1380
1379
1381
if (ext->hasLazyMembers ()) {
1380
- LookupTable ->addMembers (ext->getCurrentMembersWithoutLoading ());
1381
- LookupTable ->clearLazilyCompleteCache ();
1382
+ table ->addMembers (ext->getCurrentMembersWithoutLoading ());
1383
+ table ->clearLazilyCompleteCache ();
1382
1384
} else {
1383
- LookupTable ->addMembers (ext->getMembers ());
1385
+ table ->addMembers (ext->getMembers ());
1384
1386
}
1385
1387
}
1386
1388
1387
1389
void NominalTypeDecl::addedMember (Decl *member) {
1388
1390
// If we have a lookup table, add the new member to it. If not, we'll pick up
1389
1391
// this member when we first create the table.
1390
1392
auto *vd = dyn_cast<ValueDecl>(member);
1391
- auto *lookup = LookupTable;
1392
- if (!vd || !lookup )
1393
+ auto *table = LookupTable. getPointer () ;
1394
+ if (!vd || !table )
1393
1395
return ;
1394
1396
1395
- lookup ->addMember (vd);
1397
+ table ->addMember (vd);
1396
1398
}
1397
1399
1398
1400
void ExtensionDecl::addedMember (Decl *member) {
@@ -1406,9 +1408,7 @@ void ExtensionDecl::addedMember(Decl *member) {
1406
1408
}
1407
1409
1408
1410
void NominalTypeDecl::addMemberToLookupTable (Decl *member) {
1409
- prepareLookupTable ();
1410
-
1411
- LookupTable->addMember (member);
1411
+ getLookupTable ()->addMember (member);
1412
1412
}
1413
1413
1414
1414
// For lack of anywhere more sensible to put it, here's a diagram of the pieces
@@ -1506,36 +1506,49 @@ populateLookupTableEntryFromExtensions(ASTContext &ctx,
1506
1506
}
1507
1507
}
1508
1508
1509
+ MemberLookupTable *NominalTypeDecl::getLookupTable () {
1510
+ if (!LookupTable.getPointer ()) {
1511
+ auto &ctx = getASTContext ();
1512
+ LookupTable.setPointer (new (ctx) MemberLookupTable (ctx));
1513
+ }
1514
+
1515
+ return LookupTable.getPointer ();
1516
+ }
1517
+
1509
1518
void NominalTypeDecl::prepareLookupTable () {
1510
- // If we have already allocated the lookup table, then there's nothing further
1519
+ // If we have already prepared the lookup table, then there's nothing further
1511
1520
// to do.
1512
- if (LookupTable) {
1521
+ if (LookupTable. getInt ())
1513
1522
return ;
1514
- }
1515
1523
1516
- // Otherwise start the first fill.
1517
- auto &ctx = getASTContext ();
1518
- LookupTable = new (ctx) MemberLookupTable (ctx);
1524
+ LookupTable.setInt (true );
1519
1525
1526
+ auto *table = getLookupTable ();
1527
+
1528
+ // Otherwise start the first fill.
1520
1529
if (hasLazyMembers ()) {
1521
1530
assert (!hasUnparsedMembers ());
1522
- LookupTable ->addMembers (getCurrentMembersWithoutLoading ());
1531
+ table ->addMembers (getCurrentMembersWithoutLoading ());
1523
1532
} else {
1524
- LookupTable ->addMembers (getMembers ());
1533
+ table ->addMembers (getMembers ());
1525
1534
}
1526
- }
1527
1535
1528
- void NominalTypeDecl::addLoadedExtensions () {
1536
+ // Note: this calls prepareExtensions()
1529
1537
for (auto e : getExtensions ()) {
1530
1538
// If we can lazy-load this extension, only take the members we've loaded
1531
1539
// so far.
1540
+ //
1541
+ // FIXME: This should be 'e->hasLazyMembers()' but that crashes` because
1542
+ // some imported extensions don't have a Clang node, and only support
1543
+ // LazyMemberLoader::loadAllMembers() and not
1544
+ // LazyMemberLoader::loadNamedMembers().
1532
1545
if (e->wasDeserialized () || e->hasClangNode ()) {
1533
- LookupTable ->addMembers (e->getCurrentMembersWithoutLoading ());
1546
+ table ->addMembers (e->getCurrentMembersWithoutLoading ());
1534
1547
continue ;
1535
1548
}
1536
1549
1537
1550
// Else, load all the members into the table.
1538
- LookupTable ->addMembers (e->getMembers ());
1551
+ table ->addMembers (e->getMembers ());
1539
1552
}
1540
1553
}
1541
1554
@@ -1592,12 +1605,12 @@ DirectLookupRequest::evaluate(Evaluator &evaluator,
1592
1605
1593
1606
decl->prepareLookupTable ();
1594
1607
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 ();
1608
+ // Call prepareExtensions() to ensure we properly invalidate the
1609
+ // lazily-complete cache for any extensions brought in by modules
1610
+ // loaded after-the-fact. This can happen with the LLDB REPL.
1611
+ decl->prepareExtensions ();
1599
1612
1600
- auto &Table = *decl->LookupTable ;
1613
+ auto &Table = *decl->getLookupTable () ;
1601
1614
if (!useNamedLazyMemberLoading) {
1602
1615
// Make sure we have the complete list of members (in this nominal and in
1603
1616
// all extensions).
0 commit comments