@@ -187,6 +187,9 @@ class Evaluator {
187187 // / Whether to dump detailed debug info for cycles.
188188 bool debugDumpCycles;
189189
190+ // / Whether we're building a request dependency graph.
191+ bool buildDependencyGraph;
192+
190193 // / Used to report statistics about which requests were evaluated, if
191194 // / non-null.
192195 UnifiedStatsReporter *stats = nullptr ;
@@ -237,7 +240,9 @@ class Evaluator {
237240public:
238241 // / Construct a new evaluator that can emit cyclic-dependency
239242 // / diagnostics through the given diagnostics engine.
240- Evaluator (DiagnosticEngine &diags, bool debugDumpCycles=false );
243+ Evaluator (DiagnosticEngine &diags,
244+ bool debugDumpCycles,
245+ bool buildDependencyGraph);
241246
242247 // / Emit GraphViz output visualizing the request graph.
243248 void emitRequestEvaluatorGraphViz (llvm::StringRef graphVizPath);
@@ -253,26 +258,28 @@ class Evaluator {
253258 void registerRequestFunctions (Zone zone,
254259 ArrayRef<AbstractRequestFunction *> functions);
255260
256- // / Evaluate the given request and produce its result,
257- // / consulting/populating the cache as required.
258- template <typename Request>
261+ // / Retrieve the result produced by evaluating a request that can
262+ // / be cached.
263+ template <typename Request,
264+ typename std::enable_if<Request::isEverCached>::type * = nullptr >
259265 llvm::Expected<typename Request::OutputType>
260266 operator ()(const Request &request) {
261- // Check for a cycle.
262- if ( checkDependency ( getCanonicalRequest (request))) {
263- return llvm::Error (
264- llvm::make_unique<CyclicalRequestError<Request>> (request, * this ));
265- }
267+ // The request can be cached, but check a predicate to determine
268+ // whether this particular instance is cached. This allows more
269+ // fine-grained control over which instances get cache.
270+ if (request. isCached ())
271+ return getResultCached (request);
266272
267- // Make sure we remove this from the set of active requests once we're
268- // done.
269- SWIFT_DEFER {
270- assert (activeRequests.back ().castTo <Request>() == request);
271- activeRequests.pop_back ();
272- };
273+ return getResultUncached (request);
274+ }
273275
274- // Get the result.
275- return getResult (request);
276+ // / Retrieve the result produced by evaluating a request that
277+ // / will never be cached.
278+ template <typename Request,
279+ typename std::enable_if<!Request::isEverCached>::type * = nullptr >
280+ llvm::Expected<typename Request::OutputType>
281+ operator ()(const Request &request) {
282+ return getResultUncached (request);
276283 }
277284
278285 // / Evaluate a set of requests and return their results as a tuple.
@@ -340,37 +347,27 @@ class Evaluator {
340347 // / request to the \c activeRequests stack.
341348 bool checkDependency (const AnyRequest &request);
342349
343- // / Retrieve the result produced by evaluating a request that can
344- // / be cached.
345- template <typename Request,
346- typename std::enable_if<Request::isEverCached>::type * = nullptr >
347- llvm::Expected<typename Request::OutputType>
348- getResult (const Request &request) {
349- // The request can be cached, but check a predicate to determine
350- // whether this particular instance is cached. This allows more
351- // fine-grained control over which instances get cache.
352- if (request.isCached ())
353- return getResultCached (request);
354-
355- return getResultUncached (request);
356- }
357-
358- // / Retrieve the result produced by evaluating a request that
359- // / will never be cached.
360- template <typename Request,
361- typename std::enable_if<!Request::isEverCached>::type * = nullptr >
362- llvm::Expected<typename Request::OutputType>
363- getResult (const Request &request) {
364- return getResultUncached (request);
365- }
366-
367350 // / Produce the result of the request without caching.
368351 template <typename Request>
369352 llvm::Expected<typename Request::OutputType>
370353 getResultUncached (const Request &request) {
354+ // Check for a cycle.
355+ if (checkDependency (getCanonicalRequest (request))) {
356+ return llvm::Error (
357+ llvm::make_unique<CyclicalRequestError<Request>>(request, *this ));
358+ }
359+
360+ // Make sure we remove this from the set of active requests once we're
361+ // done.
362+ SWIFT_DEFER {
363+ assert (activeRequests.back ().castTo <Request>() == request);
364+ activeRequests.pop_back ();
365+ };
366+
371367 // Clear out the dependencies on this request; we're going to recompute
372368 // them now anyway.
373- dependencies.find_as (request)->second .clear ();
369+ if (buildDependencyGraph)
370+ dependencies.find_as (request)->second .clear ();
374371
375372 PrettyStackTraceRequest<Request> prettyStackTrace (request);
376373
0 commit comments