Skip to content

Commit 9258826

Browse files
committed
AST: Convert some methods on DependencyRecorder to templates
... instead of passing around an ActiveRequest.
1 parent 597c97d commit 9258826

File tree

3 files changed

+80
-74
lines changed

3 files changed

+80
-74
lines changed

include/swift/AST/Evaluator.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -373,21 +373,21 @@ class Evaluator {
373373
FrontendStatsTracer statsTracer = make_tracer(stats, request);
374374
if (stats) reportEvaluatedRequest(*stats, request);
375375

376-
recorder.beginRequest(activeReq);
376+
recorder.beginRequest<Request>();
377377

378-
auto &&r = getRequestFunction<Request>()(request, *this);
378+
auto &&result = getRequestFunction<Request>()(request, *this);
379379

380-
recorder.endRequest(activeReq);
380+
recorder.endRequest<Request>(request);
381381

382382
handleDependencySourceRequest<Request>(request);
383-
handleDependencySinkRequest<Request>(request, r);
383+
handleDependencySinkRequest<Request>(request, result);
384384

385385
// Make sure we remove this from the set of active requests once we're
386386
// done.
387387
assert(activeRequests.back() == activeReq);
388388
activeRequests.pop_back();
389389

390-
return std::move(r);
390+
return std::move(result);
391391
}
392392

393393
/// Get the result of a request, consulting an external cache
@@ -399,7 +399,7 @@ class Evaluator {
399399
getResultCached(const Request &request) {
400400
// If there is a cached result, return it.
401401
if (auto cached = request.getCachedResult()) {
402-
recorder.replayCachedRequest(ActiveRequest(request));
402+
recorder.replayCachedRequest(request);
403403
handleDependencySinkRequest<Request>(request, *cached);
404404
return *cached;
405405
}
@@ -428,7 +428,7 @@ class Evaluator {
428428
auto known = cache.find_as<Request>(request);
429429
if (known != cache.end<Request>()) {
430430
auto result = known->second;
431-
recorder.replayCachedRequest(ActiveRequest(request));
431+
recorder.replayCachedRequest(request);
432432
handleDependencySinkRequest<Request>(request, result);
433433
return result;
434434
}
@@ -466,7 +466,7 @@ class Evaluator {
466466
void handleDependencySourceRequest(const Request &r) {
467467
auto source = r.readDependencySource(recorder);
468468
if (!source.isNull() && source.get()->isPrimary()) {
469-
recorder.handleDependencySourceRequest(ActiveRequest(r), source.get());
469+
recorder.handleDependencySourceRequest(r, source.get());
470470
}
471471
}
472472

include/swift/AST/EvaluatorDependencies.h

Lines changed: 72 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -83,20 +83,24 @@ struct DependencyRecorder {
8383

8484
public:
8585
/// Push a new empty set onto the activeRequestReferences stack.
86-
void beginRequest(const swift::ActiveRequest &req);
86+
template<typename Request>
87+
void beginRequest();
8788

8889
/// Pop the activeRequestReferences stack, and insert recorded references
8990
/// into the requestReferences map, as well as the next innermost entry in
9091
/// activeRequestReferences.
91-
void endRequest(const swift::ActiveRequest &req);
92+
template<typename Request>
93+
void endRequest(const Request &req);
9294

9395
/// When replaying a request whose value has already been cached, we need
9496
/// to update the innermost set in the activeRequestReferences stack.
95-
void replayCachedRequest(const swift::ActiveRequest &req);
97+
template<typename Request>
98+
void replayCachedRequest(const Request &req);
9699

97100
/// Upon completion of a dependency source request, we update the
98101
/// fileReferences map.
99-
void handleDependencySourceRequest(const swift::ActiveRequest &req,
102+
template<typename Request>
103+
void handleDependencySourceRequest(const Request &req,
100104
SourceFile *source);
101105

102106
private:
@@ -120,6 +124,70 @@ struct DependencyRecorder {
120124
void enumerateReferencesInFile(const SourceFile *SF,
121125
ReferenceEnumerator f) const ;
122126
};
127+
128+
template<typename Request>
129+
void evaluator::DependencyRecorder::beginRequest() {
130+
if (!Request::isEverCached && !Request::isDependencySource)
131+
return;
132+
133+
activeRequestReferences.push_back({});
134+
}
135+
136+
template<typename Request>
137+
void evaluator::DependencyRecorder::endRequest(const Request &req) {
138+
if (!Request::isEverCached && !Request::isDependencySource)
139+
return;
140+
141+
// Grab all the dependencies we've recorded so far, and pop
142+
// the stack.
143+
auto recorded = std::move(activeRequestReferences.back());
144+
activeRequestReferences.pop_back();
145+
146+
// If we didn't record anything, there is nothing to do.
147+
if (recorded.empty())
148+
return;
149+
150+
// Convert the set of dependencies into a vector.
151+
std::vector<DependencyCollector::Reference>
152+
vec(recorded.begin(), recorded.end());
153+
154+
// The recorded dependencies bubble up to the parent request.
155+
if (!activeRequestReferences.empty()) {
156+
activeRequestReferences.back().insert(vec.begin(),
157+
vec.end());
158+
}
159+
160+
// Finally, record the dependencies so we can replay them
161+
// later when the request is re-evaluated.
162+
requestReferences.insert({AnyRequest(req), std::move(vec)});
163+
}
164+
165+
template<typename Request>
166+
void evaluator::DependencyRecorder::replayCachedRequest(const Request &req) {
167+
assert(req.isCached());
168+
169+
if (activeRequestReferences.empty())
170+
return;
171+
172+
auto found = requestReferences.find_as(req);
173+
if (found == requestReferences.end())
174+
return;
175+
176+
activeRequestReferences.back().insert(found->second.begin(),
177+
found->second.end());
178+
}
179+
180+
template<typename Request>
181+
void evaluator::DependencyRecorder::handleDependencySourceRequest(
182+
const Request &req,
183+
SourceFile *source) {
184+
auto found = requestReferences.find_as(req);
185+
if (found != requestReferences.end()) {
186+
fileReferences[source].insert(found->second.begin(),
187+
found->second.end());
188+
}
189+
}
190+
123191
} // end namespace evaluator
124192

125193
} // end namespace swift

lib/AST/Evaluator.cpp

Lines changed: 0 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -358,68 +358,6 @@ void Evaluator::dumpDependenciesGraphviz() const {
358358
printDependenciesGraphviz(llvm::dbgs());
359359
}
360360

361-
void evaluator::DependencyRecorder::beginRequest(
362-
const swift::ActiveRequest &req) {
363-
if (!req.isCached() && !req.isDependencySource())
364-
return;
365-
366-
activeRequestReferences.push_back({});
367-
}
368-
369-
void evaluator::DependencyRecorder::endRequest(
370-
const swift::ActiveRequest &req) {
371-
if (!req.isCached() && !req.isDependencySource())
372-
return;
373-
374-
// Grab all the dependencies we've recorded so far, and pop
375-
// the stack.
376-
auto recorded = std::move(activeRequestReferences.back());
377-
activeRequestReferences.pop_back();
378-
379-
// If we didn't record anything, there is nothing to do.
380-
if (recorded.empty())
381-
return;
382-
383-
// Convert the set of dependencies into a vector.
384-
std::vector<DependencyCollector::Reference>
385-
vec(recorded.begin(), recorded.end());
386-
387-
// The recorded dependencies bubble up to the parent request.
388-
if (!activeRequestReferences.empty()) {
389-
activeRequestReferences.back().insert(vec.begin(),
390-
vec.end());
391-
}
392-
393-
// Finally, record the dependencies so we can replay them
394-
// later when the request is re-evaluated.
395-
requestReferences.insert({AnyRequest(req), vec});
396-
}
397-
398-
void evaluator::DependencyRecorder::replayCachedRequest(
399-
const swift::ActiveRequest &req) {
400-
assert(req.isCached());
401-
402-
if (activeRequestReferences.empty())
403-
return;
404-
405-
auto found = requestReferences.find_as(req);
406-
if (found == requestReferences.end())
407-
return;
408-
409-
activeRequestReferences.back().insert(found->second.begin(),
410-
found->second.end());
411-
}
412-
413-
void evaluator::DependencyRecorder::handleDependencySourceRequest(
414-
const swift::ActiveRequest &req,
415-
SourceFile *source) {
416-
auto found = requestReferences.find_as(req);
417-
if (found != requestReferences.end()) {
418-
fileReferences[source].insert(found->second.begin(),
419-
found->second.end());
420-
}
421-
}
422-
423361
void evaluator::DependencyRecorder::recordDependency(
424362
const DependencyCollector::Reference &ref) {
425363
if (activeRequestReferences.empty())

0 commit comments

Comments
 (0)