From cd7c3fce2472656b2a1247429751e43350976677 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Wed, 19 Aug 2026 23:45:38 +0900 Subject: perf(package): hand out link maps behind Rc PackageInterface::getRequires() and friends return the array of Link objects; in PHP that is a copy-on-write array of object references, so a caller pays nothing to look at it. The port returned IndexMap by value, so every call deep-cloned the whole map, keys and constraints included. Pool building calls these accessors once per package per candidate, which put IndexMap::clone at 13.5% of `require laravel/laravel`. Store the maps as Rc> and return a handle. Callers that mutate the map clone it explicitly at the point of mutation, matching where PHP would separate the array. Co-Authored-By: Claude Opus 5 (1M context) --- crates/shirabe/src/installer.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'crates/shirabe/src/installer.rs') diff --git a/crates/shirabe/src/installer.rs b/crates/shirabe/src/installer.rs index ee60f59f..d1e38542 100644 --- a/crates/shirabe/src/installer.rs +++ b/crates/shirabe/src/installer.rs @@ -1082,13 +1082,13 @@ impl Installer { request.fix_locked_package(package.clone()); } - let mut root_requires = self.package.get_requires(); + let mut root_requires = (*self.package.get_requires()).clone(); if self.dev_mode { - for (k, v) in self.package.get_dev_requires() { - root_requires.insert(k, v); + for (k, v) in self.package.get_dev_requires().iter() { + root_requires.insert(k.clone(), v.clone()); } } - for (_key, link) in &root_requires { + for (_key, link) in root_requires.iter() { if PlatformRepository::is_platform_package(link.get_target()) { request.require_name(link.get_target(), Some(link.get_constraint().clone()))?; } @@ -1331,11 +1331,11 @@ impl Installer { // Convert Link map merge into ConstraintInterface map for use later let mut req_links: IndexMap = IndexMap::new(); - for (k, v) in self.package.get_requires() { - req_links.insert(k, v); + for (k, v) in self.package.get_requires().iter() { + req_links.insert(k.clone(), v.clone()); } - for (k, v) in self.package.get_dev_requires() { - req_links.insert(k, v); + for (k, v) in self.package.get_dev_requires().iter() { + req_links.insert(k.clone(), v.clone()); } // Translate to constraint map for downstream uniform handling. let mut tmp: IndexMap = IndexMap::new(); @@ -1579,13 +1579,13 @@ impl Installer { } } } else { - let mut links = self.package.get_requires(); + let mut links = (*self.package.get_requires()).clone(); if include_dev_requires { - for (k, v) in self.package.get_dev_requires() { - links.insert(k, v); + for (k, v) in self.package.get_dev_requires().iter() { + links.insert(k.clone(), v.clone()); } } - for (_key, link) in &links { + for (_key, link) in links.iter() { request.require_name(link.get_target(), Some(link.get_constraint().clone()))?; } } -- cgit v1.3.1-4-g156e