Skip to content

Commit f3b7a40

Browse files
committed
[nfc][cxx-interop] Mark lazy member loading complete only after members are loaded.
1 parent 17f1cf9 commit f3b7a40

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
@@ -9773,18 +9773,19 @@ ClangImporter::Implementation::loadAllMembers(Decl *D, uint64_t extra) {
97739773
}
97749774

97759775
if (isa_and_nonnull<clang::RecordDecl>(D->getClangDecl())) {
9776-
// TODO: this is a hack to set member loading as lazy again. It got set to
9777-
// non-lazy when getMembers was called.
9778-
cast<StructDecl>(D)->setMemberLoader(this, 0);
9776+
// We haven't loaded any members yet, so tell our context that it still has
9777+
// lazy members. Otherwise, we won't be able to look up any individual
9778+
// members (lazily) in "loadAllMembersOfRecordDecl".
9779+
cast<StructDecl>(D)->setHasLazyMembers(true);
97799780
loadAllMembersOfRecordDecl(cast<StructDecl>(D));
9781+
// Now that all members are loaded, mark the context as lazily complete.
9782+
cast<StructDecl>(D)->setHasLazyMembers(false);
97809783
return;
97819784
}
97829785

9783-
// Namespace members will only be loaded lazily.
97849786
if (isa_and_nonnull<clang::NamespaceDecl>(D->getClangDecl())) {
9785-
// TODO: this is a hack to set member loading as lazy again. It got set to
9786-
// non-lazy when getMembers was called.
9787-
cast<EnumDecl>(D)->setMemberLoader(this, 0);
9787+
// Namespace members will only be loaded lazily.
9788+
cast<EnumDecl>(D)->setHasLazyMembers(true);
97889789
return;
97899790
}
97909791

0 commit comments

Comments
 (0)