Skip to content

Commit 6d7726e

Browse files
authored
Merge pull request swiftlang#28750 from CodaFi/inherited-wealth
Don't re-force member loading in already-forced class hierarchies
2 parents 0b0dfe8 + dc6858b commit 6d7726e

File tree

3 files changed

+16
-18
lines changed

3 files changed

+16
-18
lines changed

lib/ClangImporter/ClangImporter.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3714,22 +3714,19 @@ void ClangImporter::Implementation::lookupAllObjCMembers(
37143714
}
37153715
}
37163716

3717-
// Force the named member of the entire inheritance hierarchy to be loaded and
3717+
// Force the members of the entire inheritance hierarchy to be loaded and
37183718
// deserialized before loading the named member of this class. This allows the
37193719
// decl members table to be warmed up and enables the correct identification of
37203720
// overrides.
3721-
static void loadNamedMemberOfSuperclassesIfNeeded(const ClassDecl *CD,
3722-
DeclBaseName name) {
3721+
static void ensureSuperclassMembersAreLoaded(const ClassDecl *CD) {
37233722
if (!CD)
37243723
return;
37253724

3726-
while ((CD = CD->getSuperclassDecl())) {
3727-
if (CD->hasClangNode()) {
3728-
auto ci = CD->getASTContext().getOrCreateLazyIterableContextData(
3729-
CD, /*lazyLoader=*/nullptr);
3730-
ci->loader->loadNamedMembers(CD, name, ci->memberData);
3731-
}
3732-
}
3725+
CD = CD->getSuperclassDecl();
3726+
if (!CD || !CD->hasClangNode())
3727+
return;
3728+
3729+
CD->loadAllMembers();
37333730
}
37343731

37353732
Optional<TinyPtrVector<ValueDecl *>>
@@ -3793,7 +3790,7 @@ ClangImporter::Implementation::loadNamedMembers(
37933790

37943791
assert(isa<clang::ObjCContainerDecl>(CD) || isa<clang::NamespaceDecl>(CD));
37953792

3796-
loadNamedMemberOfSuperclassesIfNeeded(dyn_cast<ClassDecl>(D), N);
3793+
ensureSuperclassMembersAreLoaded(dyn_cast<ClassDecl>(D));
37973794

37983795
TinyPtrVector<ValueDecl *> Members;
37993796
for (auto entry : table->lookup(SerializedSwiftName(N),

lib/ClangImporter/ImportDecl.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8427,14 +8427,15 @@ createUnavailableDecl(Identifier name, DeclContext *dc, Type type,
84278427
// deserialized before loading the members of this class. This allows the
84288428
// decl members table to be warmed up and enables the correct identification of
84298429
// overrides.
8430-
static void loadAllMembersOfSuperclassesIfNeeded(const ClassDecl *CD) {
8430+
static void loadAllMembersOfSuperclassIfNeeded(const ClassDecl *CD) {
84318431
if (!CD)
84328432
return;
84338433

8434-
while ((CD = CD->getSuperclassDecl())) {
8435-
if (CD->hasClangNode())
8436-
CD->loadAllMembers();
8437-
}
8434+
CD = CD->getSuperclassDecl();
8435+
if (!CD || !CD->hasClangNode())
8436+
return;
8437+
8438+
CD->loadAllMembers();
84388439
}
84398440

84408441
void
@@ -8449,7 +8450,7 @@ ClangImporter::Implementation::loadAllMembers(Decl *D, uint64_t extra) {
84498450

84508451
// If not, we're importing globals-as-members into an extension.
84518452
if (objcContainer) {
8452-
loadAllMembersOfSuperclassesIfNeeded(dyn_cast<ClassDecl>(D));
8453+
loadAllMembersOfSuperclassIfNeeded(dyn_cast<ClassDecl>(D));
84538454
loadAllMembersOfObjcContainer(D, objcContainer);
84548455
return;
84558456
}

test/NameBinding/named_lazy_member_loading_objc_interface.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
// Check that named-lazy-member-loading reduces the number of Decls deserialized
99
// RUN: %target-swift-frontend -typecheck -I %S/Inputs/NamedLazyMembers -disable-named-lazy-member-loading -stats-output-dir %t/stats-pre -primary-file %s %S/Inputs/NamedLazyMembers/NamedLazyMembersExt.swift
1010
// RUN: %target-swift-frontend -typecheck -I %S/Inputs/NamedLazyMembers -stats-output-dir %t/stats-post -primary-file %s %S/Inputs/NamedLazyMembers/NamedLazyMembersExt.swift
11-
// RUN: %{python} %utils/process-stats-dir.py --evaluate-delta 'NumTotalClangImportedEntities < -10' %t/stats-pre %t/stats-post
11+
// RUN: %{python} %utils/process-stats-dir.py --evaluate-delta 'NumTotalClangImportedEntities <= -1' %t/stats-pre %t/stats-post
1212

1313
import NamedLazyMembers
1414

0 commit comments

Comments
 (0)