about summary refs log tree commit diff
diff options
context:
space:
mode:
authorMaybe Waffle <waffle.lapkin@gmail.com>2022-01-27 23:53:49 +0300
committerMaybe Waffle <waffle.lapkin@gmail.com>2022-01-28 11:31:59 +0300
commit81211f538ccfbcd1cfb83dc0ad29c7577ad74fa1 (patch)
treeb7a5e94570f8747d0e2ebd48e4e291013f3472e5
parentc932ca5f1cf62d041c943e5cfdcc1767c0664692 (diff)
downloadrust-81211f538ccfbcd1cfb83dc0ad29c7577ad74fa1.tar.gz
rust-81211f538ccfbcd1cfb83dc0ad29c7577ad74fa1.zip
Use `crate_limits` query in macro expansion
-rw-r--r--crates/hir_def/src/body.rs19
1 files changed, 12 insertions, 7 deletions
diff --git a/crates/hir_def/src/body.rs b/crates/hir_def/src/body.rs
index 505b07cc8ac..8488b4f0d03 100644
--- a/crates/hir_def/src/body.rs
+++ b/crates/hir_def/src/body.rs
@@ -54,12 +54,6 @@ pub struct Expander {
     recursion_limit: usize,
 }
 
-#[cfg(test)]
-static EXPANSION_RECURSION_LIMIT: Limit = Limit::new(32);
-
-#[cfg(not(test))]
-static EXPANSION_RECURSION_LIMIT: Limit = Limit::new(128);
-
 impl CfgExpander {
     pub(crate) fn new(
         db: &dyn DefDatabase,
@@ -101,7 +95,7 @@ impl Expander {
         db: &dyn DefDatabase,
         macro_call: ast::MacroCall,
     ) -> Result<ExpandResult<Option<(Mark, T)>>, UnresolvedMacro> {
-        if EXPANSION_RECURSION_LIMIT.check(self.recursion_limit + 1).is_err() {
+        if self.recursion_limit(db).check(self.recursion_limit + 1).is_err() {
             cov_mark::hit!(your_stack_belongs_to_me);
             return Ok(ExpandResult::str_err(
                 "reached recursion limit during macro expansion".into(),
@@ -222,6 +216,17 @@ impl Expander {
         let file_local_id = self.ast_id_map.ast_id(item);
         AstId::new(self.current_file_id, file_local_id)
     }
+
+    fn recursion_limit(&self, db: &dyn DefDatabase) -> Limit {
+        let limit = db.crate_limits(self.cfg_expander.krate).recursion_limit as _;
+
+        #[cfg(not(test))]
+        return Limit::new(limit);
+
+        // Without this, `body::tests::your_stack_belongs_to_me` stack-overflows in debug
+        #[cfg(test)]
+        return Limit::new(std::cmp::min(32, limit));
+    }
 }
 
 #[derive(Debug)]