mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[AST] Use cached deserialized decl in getOpaqueResultTypeDecl
Mangling and looking up the opaque result type decl
for serialized decls is a fairly expensive
operation. Instead, fallthrough to the request
which will have a cached value set by deserialization.
This shaves ~30ms off the cached completion for:
```swift
import SwiftUI
struct V: View {
var body: some View {
Table(#^CC^#
}
}
```
This commit is contained in:
@@ -2758,6 +2758,10 @@ private:
|
||||
/// output a null pointer.
|
||||
unsigned noDynamicallyReplacedDecl : 1;
|
||||
|
||||
/// Whether the OpaqueResultTypeRequest request was evaluated and produced
|
||||
/// a null pointer.
|
||||
unsigned noOpaqueResultType : 1;
|
||||
|
||||
/// Whether the "isFinal" bit has been computed yet.
|
||||
unsigned isFinalComputed : 1;
|
||||
|
||||
@@ -2785,7 +2789,7 @@ private:
|
||||
friend class InterfaceTypeRequest;
|
||||
friend class CheckRedeclarationRequest;
|
||||
friend class ActorIsolationRequest;
|
||||
friend class DynamicallyReplacedDeclRequest;
|
||||
friend class OpaqueResultTypeRequest;
|
||||
friend class ApplyAccessNoteRequest;
|
||||
|
||||
friend class Decl;
|
||||
|
||||
@@ -2295,21 +2295,22 @@ public:
|
||||
|
||||
/// Builds an opaque result type for a declaration.
|
||||
class OpaqueResultTypeRequest
|
||||
: public SimpleRequest<OpaqueResultTypeRequest,
|
||||
OpaqueTypeDecl *(ValueDecl *),
|
||||
RequestFlags::Cached> {
|
||||
: public SimpleRequest<
|
||||
OpaqueResultTypeRequest, OpaqueTypeDecl *(ValueDecl *),
|
||||
RequestFlags::SeparatelyCached | RequestFlags::SplitCached> {
|
||||
public:
|
||||
using SimpleRequest::SimpleRequest;
|
||||
|
||||
private:
|
||||
friend SimpleRequest;
|
||||
|
||||
OpaqueTypeDecl *
|
||||
evaluate(Evaluator &evaluator, ValueDecl *VD) const;
|
||||
OpaqueTypeDecl *evaluate(Evaluator &evaluator, ValueDecl *VD) const;
|
||||
|
||||
public:
|
||||
// Caching.
|
||||
// Split caching.
|
||||
bool isCached() const { return true; }
|
||||
std::optional<OpaqueTypeDecl *> getCachedResult() const;
|
||||
void cacheResult(OpaqueTypeDecl *result) const;
|
||||
};
|
||||
|
||||
/// Determines if a function declaration is 'static'.
|
||||
|
||||
@@ -262,7 +262,7 @@ SWIFT_REQUEST(TypeChecker, OpaqueReadOwnershipRequest,
|
||||
NoLocationInfo)
|
||||
SWIFT_REQUEST(TypeChecker, OpaqueResultTypeRequest,
|
||||
OpaqueTypeDecl *(ValueDecl *),
|
||||
Cached, NoLocationInfo)
|
||||
SeparatelyCached | SplitCached, NoLocationInfo)
|
||||
SWIFT_REQUEST(TypeChecker, OperatorPrecedenceGroupRequest,
|
||||
PrecedenceGroupDecl *(PrecedenceGroupDecl *),
|
||||
Cached, NoLocationInfo)
|
||||
|
||||
Reference in New Issue
Block a user