From 431b0724b595a620bd0a0cc9150b054ad25e6a42 Mon Sep 17 00:00:00 2001 From: Peter Byfield Date: Wed, 1 Jan 2025 21:26:09 +0100 Subject: [PATCH] Use Rc for imports_info.package_info to avoid expensive cloning --- src/imports_info/mod.rs | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/imports_info/mod.rs b/src/imports_info/mod.rs index f6ba1003..043f45b7 100644 --- a/src/imports_info/mod.rs +++ b/src/imports_info/mod.rs @@ -1,17 +1,17 @@ mod parse; mod queries; -use anyhow::Result; -use rayon::iter::ParallelBridge; -use rayon::prelude::*; -use std::collections::{HashMap, HashSet}; - pub use crate::imports_info::queries::external_imports::ExternalImportsQueries; pub use crate::imports_info::queries::internal_imports::InternalImportsQueries; use crate::{ package_info::{PackageInfo, PackageItemToken}, Error, PackageItemIterator, Pypath, }; +use anyhow::Result; +use rayon::iter::ParallelBridge; +use rayon::prelude::*; +use std::collections::{HashMap, HashSet}; +use std::rc::Rc; /// An explicit import statement. #[derive(Debug, Clone, PartialEq, Eq)] @@ -88,7 +88,8 @@ impl From for PackageItemTokenSet { /// ``` #[derive(Debug, Clone)] pub struct ImportsInfo { - package_info: PackageInfo, + // Use `Rc` to avoid cloning `package_info` on `import_info.clone()`. + package_info: Rc, // internal_imports: HashMap>, reverse_internal_imports: HashMap>, @@ -144,10 +145,12 @@ impl ImportsInfo { package_info: PackageInfo, options: ImportsInfoBuildOptions, ) -> Result { + let package_info = Rc::new(package_info); + let all_raw_imports = get_all_raw_imports(&package_info)?; let mut imports_info = ImportsInfo { - package_info: package_info.clone(), + package_info: Rc::clone(&package_info), internal_imports: HashMap::new(), reverse_internal_imports: HashMap::new(), internal_imports_metadata: HashMap::new(),