diff options
| author | bors <bors@rust-lang.org> | 2024-10-28 12:53:06 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-10-28 12:53:06 +0000 |
| commit | a529c44ecadfaa6cfb60f1301bbf01e27941048f (patch) | |
| tree | 641c203b5aea3b63e85017b28144ba612f27cff7 | |
| parent | 73bad368f2277511659969f4dc40dff1a6db2df8 (diff) | |
| parent | d0b15f157cc3bd56bcfd93f05ac0cdf2343a6c77 (diff) | |
| download | rust-a529c44ecadfaa6cfb60f1301bbf01e27941048f.tar.gz rust-a529c44ecadfaa6cfb60f1301bbf01e27941048f.zip | |
Auto merge of #13472 - GnomedDev:smaller-msrv, r=Jarcho
Optimise Msrv for common one item case Currently, `Msrv` is cloned around a lot in order to handle the `#[clippy::msrv]` attribute. This attribute, however, means `RustcVersion` will be heap allocated if there is only one source of an msrv (eg: `rust-version` in `Cargo.toml`). This PR optimizes for said case, while keeping the external interface the same by swapping the internal representation to `SmallVec<[RustcVersion; 2]>`. changelog: none
| -rw-r--r-- | clippy_config/src/lib.rs | 1 | ||||
| -rw-r--r-- | clippy_config/src/msrvs.rs | 9 |
2 files changed, 6 insertions, 4 deletions
diff --git a/clippy_config/src/lib.rs b/clippy_config/src/lib.rs index 42651521f8d..1c3f32c2514 100644 --- a/clippy_config/src/lib.rs +++ b/clippy_config/src/lib.rs @@ -20,6 +20,7 @@ extern crate rustc_driver; extern crate rustc_errors; extern crate rustc_session; extern crate rustc_span; +extern crate smallvec; mod conf; mod metadata; diff --git a/clippy_config/src/msrvs.rs b/clippy_config/src/msrvs.rs index 2f4da4cba3d..b809d8d0487 100644 --- a/clippy_config/src/msrvs.rs +++ b/clippy_config/src/msrvs.rs @@ -3,6 +3,7 @@ use rustc_attr::parse_version; use rustc_session::{RustcVersion, Session}; use rustc_span::{Symbol, sym}; use serde::Deserialize; +use smallvec::{SmallVec, smallvec}; use std::fmt; macro_rules! msrv_aliases { @@ -67,7 +68,7 @@ msrv_aliases! { /// Tracks the current MSRV from `clippy.toml`, `Cargo.toml` or set via `#[clippy::msrv]` #[derive(Debug, Clone)] pub struct Msrv { - stack: Vec<RustcVersion>, + stack: SmallVec<[RustcVersion; 2]>, } impl fmt::Display for Msrv { @@ -87,14 +88,14 @@ impl<'de> Deserialize<'de> for Msrv { { let v = String::deserialize(deserializer)?; parse_version(Symbol::intern(&v)) - .map(|v| Msrv { stack: vec![v] }) + .map(|v| Msrv { stack: smallvec![v] }) .ok_or_else(|| serde::de::Error::custom("not a valid Rust version")) } } impl Msrv { pub fn empty() -> Msrv { - Msrv { stack: Vec::new() } + Msrv { stack: SmallVec::new() } } pub fn read_cargo(&mut self, sess: &Session) { @@ -103,7 +104,7 @@ impl Msrv { .and_then(|v| parse_version(Symbol::intern(&v))); match (self.current(), cargo_msrv) { - (None, Some(cargo_msrv)) => self.stack = vec![cargo_msrv], + (None, Some(cargo_msrv)) => self.stack = smallvec![cargo_msrv], (Some(clippy_msrv), Some(cargo_msrv)) => { if clippy_msrv != cargo_msrv { sess.dcx().warn(format!( |
