add depth_limit
in QueryVTable
This commit is contained in:
parent
87991d5f5d
commit
cbc6bd2019
8 changed files with 82 additions and 53 deletions
|
@ -91,6 +91,7 @@ impl QueryContext for QueryCtxt<'_> {
|
|||
fn start_query<R>(
|
||||
&self,
|
||||
token: QueryJobId,
|
||||
depth_limit: bool,
|
||||
diagnostics: Option<&Lock<ThinVec<Diagnostic>>>,
|
||||
compute: impl FnOnce() -> R,
|
||||
) -> R {
|
||||
|
@ -98,12 +99,16 @@ impl QueryContext for QueryCtxt<'_> {
|
|||
// as `self`, so we use `with_related_context` to relate the 'tcx lifetimes
|
||||
// when accessing the `ImplicitCtxt`.
|
||||
tls::with_related_context(**self, move |current_icx| {
|
||||
if depth_limit && !self.recursion_limit().value_within_limit(current_icx.query_depth) {
|
||||
self.depth_limit_error();
|
||||
}
|
||||
|
||||
// Update the `ImplicitCtxt` to point to our new query job.
|
||||
let new_icx = ImplicitCtxt {
|
||||
tcx: **self,
|
||||
query: Some(token),
|
||||
diagnostics,
|
||||
layout_depth: current_icx.layout_depth,
|
||||
query_depth: current_icx.query_depth + depth_limit as usize,
|
||||
task_deps: current_icx.task_deps,
|
||||
};
|
||||
|
||||
|
@ -205,6 +210,18 @@ macro_rules! is_eval_always {
|
|||
};
|
||||
}
|
||||
|
||||
macro_rules! depth_limit {
|
||||
([]) => {{
|
||||
false
|
||||
}};
|
||||
([(depth_limit) $($rest:tt)*]) => {{
|
||||
true
|
||||
}};
|
||||
([$other:tt $($modifiers:tt)*]) => {
|
||||
depth_limit!([$($modifiers)*])
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! hash_result {
|
||||
([]) => {{
|
||||
Some(dep_graph::hash_result)
|
||||
|
@ -335,6 +352,7 @@ macro_rules! define_queries {
|
|||
QueryVTable {
|
||||
anon: is_anon!([$($modifiers)*]),
|
||||
eval_always: is_eval_always!([$($modifiers)*]),
|
||||
depth_limit: depth_limit!([$($modifiers)*]),
|
||||
dep_kind: dep_graph::DepKind::$name,
|
||||
hash_result: hash_result!([$($modifiers)*]),
|
||||
handle_cycle_error: |tcx, mut error| handle_cycle_error!([$($modifiers)*][tcx, error]),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue