Skip to content

Commit c1b0c93

Browse files
committed
Sema: Use request evaluator caching for EmittedMembersRequest
1 parent f8720d5 commit c1b0c93

File tree

6 files changed

+20
-45
lines changed

6 files changed

+20
-45
lines changed

include/swift/AST/Decl.h

+2-13
Original file line numberDiff line numberDiff line change
@@ -535,17 +535,14 @@ class alignas(1 << DeclAlignInBits) Decl {
535535
NumRequirementsInSignature : 16
536536
);
537537

538-
SWIFT_INLINE_BITFIELD(ClassDecl, NominalTypeDecl, 1+1+2+1+1+1+1+1+1,
538+
SWIFT_INLINE_BITFIELD(ClassDecl, NominalTypeDecl, 1+1+2+1+1+1+1+1,
539539
/// Whether this class inherits its superclass's convenience initializers.
540540
InheritsSuperclassInits : 1,
541541
ComputedInheritsSuperclassInits : 1,
542542

543543
/// \see ClassDecl::ForeignKind
544544
RawForeignKind : 2,
545545

546-
/// \see ClassDecl::getEmittedMembers()
547-
HasForcedEmittedMembers : 1,
548-
549546
HasMissingDesignatedInitializers : 1,
550547
ComputedHasMissingDesignatedInitializers : 1,
551548

@@ -3856,14 +3853,6 @@ class ClassDecl final : public NominalTypeDecl {
38563853
llvm::PointerIntPair<Type, 1, bool> SuperclassType;
38573854
} LazySemanticInfo;
38583855

3859-
bool hasForcedEmittedMembers() const {
3860-
return Bits.ClassDecl.HasForcedEmittedMembers;
3861-
}
3862-
3863-
void setHasForcedEmittedMembers() {
3864-
Bits.ClassDecl.HasForcedEmittedMembers = true;
3865-
}
3866-
38673856
Optional<bool> getCachedInheritsSuperclassInitializers() const {
38683857
if (Bits.ClassDecl.ComputedInheritsSuperclassInits)
38693858
return Bits.ClassDecl.InheritsSuperclassInits;
@@ -4089,7 +4078,7 @@ class ClassDecl final : public NominalTypeDecl {
40894078

40904079
/// Get all the members of this class, synthesizing any implicit members
40914080
/// that appear in the vtable if needed.
4092-
DeclRange getEmittedMembers() const;
4081+
ArrayRef<Decl *> getEmittedMembers() const;
40934082

40944083
// Implement isa/cast/dyncast/etc.
40954084
static bool classof(const Decl *D) {

include/swift/AST/TypeCheckRequests.h

+3-6
Original file line numberDiff line numberDiff line change
@@ -1064,23 +1064,20 @@ class SynthesizeAccessorRequest :
10641064

10651065
class EmittedMembersRequest :
10661066
public SimpleRequest<EmittedMembersRequest,
1067-
DeclRange(ClassDecl *),
1068-
RequestFlags::SeparatelyCached> {
1067+
ArrayRef<Decl *>(ClassDecl *),
1068+
RequestFlags::Cached> {
10691069
public:
10701070
using SimpleRequest::SimpleRequest;
10711071

10721072
private:
10731073
friend SimpleRequest;
10741074

10751075
// Evaluation.
1076-
DeclRange
1076+
ArrayRef<Decl *>
10771077
evaluate(Evaluator &evaluator, ClassDecl *classDecl) const;
10781078

10791079
public:
1080-
// Separate caching.
10811080
bool isCached() const { return true; }
1082-
Optional<DeclRange> getCachedResult() const;
1083-
void cacheResult(DeclRange value) const;
10841081
};
10851082

10861083
class IsImplicitlyUnwrappedOptionalRequest :

include/swift/AST/TypeCheckerTypeIDZone.def

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ SWIFT_REQUEST(TypeChecker, TypeEraserHasViableInitRequest,
6565
SWIFT_REQUEST(TypeChecker, DynamicallyReplacedDeclRequest,
6666
ValueDecl *(ValueDecl *),
6767
Cached, NoLocationInfo)
68-
SWIFT_REQUEST(TypeChecker, EmittedMembersRequest, DeclRange(ClassDecl *),
69-
SeparatelyCached, NoLocationInfo)
68+
SWIFT_REQUEST(TypeChecker, EmittedMembersRequest, ArrayRef<Decl *>(ClassDecl *),
69+
Cached, NoLocationInfo)
7070
SWIFT_REQUEST(TypeChecker, EnumRawValuesRequest,
7171
evaluator::SideEffect (EnumDecl *, TypeResolutionStage),
7272
SeparatelyCached, NoLocationInfo)

lib/AST/Decl.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -4285,11 +4285,11 @@ DestructorDecl *ClassDecl::getDestructor() const {
42854285
nullptr);
42864286
}
42874287

4288-
DeclRange ClassDecl::getEmittedMembers() const {
4288+
ArrayRef<Decl *> ClassDecl::getEmittedMembers() const {
42894289
ASTContext &ctx = getASTContext();
42904290
return evaluateOrDefault(ctx.evaluator,
42914291
EmittedMembersRequest{const_cast<ClassDecl *>(this)},
4292-
getMembers());
4292+
ArrayRef<Decl *>());
42934293
}
42944294

42954295
/// Synthesizer callback for an empty implicit function body.

lib/AST/TypeCheckRequests.cpp

-17
Original file line numberDiff line numberDiff line change
@@ -783,23 +783,6 @@ void SynthesizeAccessorRequest::cacheResult(AccessorDecl *accessor) const {
783783
storage->setSynthesizedAccessor(kind, accessor);
784784
}
785785

786-
//----------------------------------------------------------------------------//
787-
// EmittedMembersRequest computation.
788-
//----------------------------------------------------------------------------//
789-
790-
Optional<DeclRange>
791-
EmittedMembersRequest::getCachedResult() const {
792-
auto *classDecl = std::get<0>(getStorage());
793-
if (classDecl->hasForcedEmittedMembers())
794-
return classDecl->getMembers();
795-
return None;
796-
}
797-
798-
void EmittedMembersRequest::cacheResult(DeclRange result) const {
799-
auto *classDecl = std::get<0>(getStorage());
800-
classDecl->setHasForcedEmittedMembers();
801-
}
802-
803786
//----------------------------------------------------------------------------//
804787
// IsImplicitlyUnwrappedOptionalRequest computation.
805788
//----------------------------------------------------------------------------//

lib/Sema/TypeCheckDecl.cpp

+11-5
Original file line numberDiff line numberDiff line change
@@ -2417,13 +2417,17 @@ NamingPatternRequest::evaluate(Evaluator &evaluator, VarDecl *VD) const {
24172417
return namingPattern;
24182418
}
24192419

2420-
DeclRange
2420+
ArrayRef<Decl *>
24212421
EmittedMembersRequest::evaluate(Evaluator &evaluator,
24222422
ClassDecl *CD) const {
2423-
if (!CD->getParentSourceFile())
2424-
return CD->getMembers();
2425-
24262423
auto &Context = CD->getASTContext();
2424+
SmallVector<Decl *, 8> result;
2425+
2426+
if (!CD->getParentSourceFile()) {
2427+
auto members = CD->getMembers();
2428+
result.append(members.begin(), members.end());
2429+
return Context.AllocateCopy(result);
2430+
}
24272431

24282432
// We need to add implicit initializers because they
24292433
// affect vtable layout.
@@ -2461,7 +2465,9 @@ EmittedMembersRequest::evaluate(Evaluator &evaluator,
24612465
(void) var->getPropertyWrapperBackingProperty();
24622466
}
24632467

2464-
return CD->getMembers();
2468+
auto members = CD->getMembers();
2469+
result.append(members.begin(), members.end());
2470+
return Context.AllocateCopy(result);
24652471
}
24662472

24672473
bool TypeChecker::isPassThroughTypealias(TypeAliasDecl *typealias,

0 commit comments

Comments
 (0)