Skip to content

Commit 6489b60

Browse files
committed
Convert DynamicallyReplacedDeclRequest to use split caching
1 parent 010ddfc commit 6489b60

File tree

4 files changed

+38
-3
lines changed

4 files changed

+38
-3
lines changed

include/swift/AST/Decl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2807,6 +2807,10 @@ class ValueDecl : public Decl {
28072807
/// allows the entity to be replaced at runtime.
28082808
unsigned isDynamic : 1;
28092809

2810+
/// Whether the DynamicallyReplacedDeclRequest request was evaluated and
2811+
/// output a null pointer.
2812+
unsigned noDynamicallyReplacedDecl : 1;
2813+
28102814
/// Whether the "isFinal" bit has been computed yet.
28112815
unsigned isFinalComputed : 1;
28122816

@@ -2835,6 +2839,7 @@ class ValueDecl : public Decl {
28352839
friend class InterfaceTypeRequest;
28362840
friend class CheckRedeclarationRequest;
28372841
friend class ActorIsolationRequest;
2842+
friend class DynamicallyReplacedDeclRequest;
28382843
friend class Decl;
28392844
SourceLoc getLocFromSource() const { return NameLoc; }
28402845
protected:

include/swift/AST/TypeCheckRequests.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3270,7 +3270,9 @@ class CallerSideDefaultArgExprRequest
32703270

32713271
class DynamicallyReplacedDeclRequest
32723272
: public SimpleRequest<DynamicallyReplacedDeclRequest,
3273-
ValueDecl *(ValueDecl *), RequestFlags::Cached> {
3273+
ValueDecl *(ValueDecl *),
3274+
RequestFlags::SeparatelyCached |
3275+
RequestFlags::SplitCached> {
32743276
public:
32753277
using SimpleRequest::SimpleRequest;
32763278

@@ -3281,8 +3283,11 @@ class DynamicallyReplacedDeclRequest
32813283
ValueDecl * evaluate(Evaluator &evaluator, ValueDecl *VD) const;
32823284

32833285
public:
3284-
// Caching.
3286+
// Separate caching.
32853287
bool isCached() const { return true; }
3288+
std::optional<ValueDecl *> getCachedResult() const;
3289+
void cacheResult(ValueDecl *result) const;
3290+
32863291
};
32873292

32883293
class SpecializeAttrTargetDeclRequest

include/swift/AST/TypeCheckerTypeIDZone.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ SWIFT_REQUEST(TypeChecker, TypeEraserHasViableInitRequest,
8686
Cached, NoLocationInfo)
8787
SWIFT_REQUEST(TypeChecker, DynamicallyReplacedDeclRequest,
8888
ValueDecl *(ValueDecl *),
89-
Cached, NoLocationInfo)
89+
SeparatelyCached | SplitCached, NoLocationInfo)
9090
SWIFT_REQUEST(TypeChecker, ABIMembersRequest,
9191
ArrayRef<Decl *>(IterableDeclContext *), Cached, NoLocationInfo)
9292
SWIFT_REQUEST(TypeChecker, AllMembersRequest,

lib/AST/TypeCheckRequests.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,31 @@ void IsDynamicRequest::cacheResult(bool value) const {
351351
decl->getAttrs().add(new (decl->getASTContext()) DynamicAttr(/*Implicit=*/true));
352352
}
353353

354+
//----------------------------------------------------------------------------//
355+
// DynamicallyReplacedDeclRequest computation.
356+
//----------------------------------------------------------------------------//
357+
358+
std::optional<ValueDecl *> DynamicallyReplacedDeclRequest::getCachedResult() const {
359+
auto *decl = std::get<0>(getStorage());
360+
361+
if (decl->LazySemanticInfo.noDynamicallyReplacedDecl)
362+
return std::optional(nullptr);
363+
364+
return decl->getASTContext().evaluator.getCachedNonEmptyOutput(*this);
365+
}
366+
367+
368+
void DynamicallyReplacedDeclRequest::cacheResult(ValueDecl *result) const {
369+
auto *decl = std::get<0>(getStorage());
370+
371+
if (!result) {
372+
decl->LazySemanticInfo.noDynamicallyReplacedDecl = 1;
373+
return;
374+
}
375+
376+
decl->getASTContext().evaluator.cacheNonEmptyOutput(*this, std::move(result));
377+
}
378+
354379
//----------------------------------------------------------------------------//
355380
// RequirementSignatureRequest computation.
356381
//----------------------------------------------------------------------------//

0 commit comments

Comments
 (0)