Skip to content

Commit d08ecf3

Browse files
authored
Merge pull request #40336 from zoecarver/set-lazy-complete-after-load
[nfc][cxx-interop] Mark lazy member loading complete only after members are loaded.
2 parents 691b62f + f3b7a40 commit d08ecf3

File tree

3 files changed

+16
-8
lines changed

3 files changed

+16
-8
lines changed

include/swift/AST/DeclContext.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,9 @@ class IterableDeclContext {
825825
/// Setup the loader for lazily-loaded members.
826826
void setMemberLoader(LazyMemberLoader *loader, uint64_t contextData);
827827

828+
/// Externally tell this context that it has no more lazy members, i.e. all lazy member loading is complete.
829+
void setHasLazyMembers(bool hasLazyMembers) const;
830+
828831
/// Load all of the members of this context.
829832
void loadAllMembers() const;
830833

lib/AST/DeclContext.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -966,6 +966,10 @@ bool IterableDeclContext::hasUnparsedMembers() const {
966966
return true;
967967
}
968968

969+
void IterableDeclContext::setHasLazyMembers(bool hasLazyMembers) const {
970+
FirstDeclAndLazyMembers.setInt(hasLazyMembers);
971+
}
972+
969973
void IterableDeclContext::loadAllMembers() const {
970974
ASTContext &ctx = getASTContext();
971975

@@ -990,7 +994,7 @@ void IterableDeclContext::loadAllMembers() const {
990994
return;
991995

992996
// Don't try to load all members re-entrant-ly.
993-
FirstDeclAndLazyMembers.setInt(false);
997+
setHasLazyMembers(false);
994998

995999
const Decl *container = getDecl();
9961000
auto contextInfo = ctx.getOrCreateLazyIterableContextData(this,

lib/ClangImporter/ImportDecl.cpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9818,18 +9818,19 @@ ClangImporter::Implementation::loadAllMembers(Decl *D, uint64_t extra) {
98189818
}
98199819

98209820
if (isa_and_nonnull<clang::RecordDecl>(D->getClangDecl())) {
9821-
// TODO: this is a hack to set member loading as lazy again. It got set to
9822-
// non-lazy when getMembers was called.
9823-
cast<StructDecl>(D)->setMemberLoader(this, 0);
9821+
// We haven't loaded any members yet, so tell our context that it still has
9822+
// lazy members. Otherwise, we won't be able to look up any individual
9823+
// members (lazily) in "loadAllMembersOfRecordDecl".
9824+
cast<StructDecl>(D)->setHasLazyMembers(true);
98249825
loadAllMembersOfRecordDecl(cast<StructDecl>(D));
9826+
// Now that all members are loaded, mark the context as lazily complete.
9827+
cast<StructDecl>(D)->setHasLazyMembers(false);
98259828
return;
98269829
}
98279830

9828-
// Namespace members will only be loaded lazily.
98299831
if (isa_and_nonnull<clang::NamespaceDecl>(D->getClangDecl())) {
9830-
// TODO: this is a hack to set member loading as lazy again. It got set to
9831-
// non-lazy when getMembers was called.
9832-
cast<EnumDecl>(D)->setMemberLoader(this, 0);
9832+
// Namespace members will only be loaded lazily.
9833+
cast<EnumDecl>(D)->setHasLazyMembers(true);
98339834
return;
98349835
}
98359836

0 commit comments

Comments
 (0)