diff --git a/Cargo.lock b/Cargo.lock index 37533873de4ac..358c50ee31ca7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2964,7 +2964,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.9", + "socket2 0.5.8", "tokio", "tower-service", "tracing", @@ -6612,18 +6612,21 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "shrink-to-fit" -version = "0.2.1" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "040f84743f19cf4a481c2580f4d9d12beab78f401773314ff18835ef78c930ea" +checksum = "939a4c696178684fc5fc1426625b882805418bbb56e056d21f9d4946a9d6ff51" dependencies = [ + "indexmap 2.7.1", + "serde_json", "shrink-to-fit-macro", + "smallvec", ] [[package]] name = "shrink-to-fit-macro" -version = "0.2.1" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e9bca0d4a99ce6c7296fea5972a9327a5e70c062b73f38e11c7894cf7ec72c" +checksum = "16d9bafdb4ba0cafd45a5aea7e8bc35b0f6280a603795c2ba9a823ca6afaba73" dependencies = [ "proc-macro2", "quote", @@ -9119,6 +9122,7 @@ dependencies = [ "criterion", "new_debug_unreachable", "serde", + "shrink-to-fit", "triomphe 0.1.12", "turbo-tasks-hash", ] @@ -9169,6 +9173,7 @@ dependencies = [ "serde", "serde_json", "serde_regex", + "shrink-to-fit", "thiserror", "tokio", "tokio-util", diff --git a/Cargo.toml b/Cargo.toml index 1c020e68fa0b1..77a91f2ba8946 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -202,6 +202,7 @@ smallvec = { version = "1.13.1", features = [ ] } sourcemap = "9.0.0" strsim = "0.11.1" +shrink-to-fit = "0.2.10" swc-rustc-hash = { package = "rustc-hash", version = "1.1.0" } # used with swc syn = "1.0.107" tempfile = "3.3.0" diff --git a/turbopack/crates/turbo-rcstr/Cargo.toml b/turbopack/crates/turbo-rcstr/Cargo.toml index 8c81100410186..ba33c02342a58 100644 --- a/turbopack/crates/turbo-rcstr/Cargo.toml +++ b/turbopack/crates/turbo-rcstr/Cargo.toml @@ -13,6 +13,7 @@ triomphe = { workspace = true } turbo-tasks-hash = { workspace = true } serde = { workspace = true } new_debug_unreachable = "1.0.6" +shrink-to-fit = { workspace = true } [dev-dependencies] criterion = { workspace = true } diff --git a/turbopack/crates/turbo-rcstr/src/lib.rs b/turbopack/crates/turbo-rcstr/src/lib.rs index 641d7a677b4f3..5af5908eed033 100644 --- a/turbopack/crates/turbo-rcstr/src/lib.rs +++ b/turbopack/crates/turbo-rcstr/src/lib.rs @@ -11,6 +11,7 @@ use std::{ use debug_unreachable::debug_unreachable; use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use shrink_to_fit::ShrinkToFit; use triomphe::Arc; use turbo_tasks_hash::{DeterministicHash, DeterministicHasher}; @@ -297,6 +298,12 @@ impl Drop for RcStr { } } +/// noop +impl ShrinkToFit for RcStr { + #[inline(always)] + fn shrink_to_fit(&mut self) {} +} + #[cfg(test)] mod tests { use std::mem::ManuallyDrop; diff --git a/turbopack/crates/turbo-tasks-macros/src/derive/mod.rs b/turbopack/crates/turbo-tasks-macros/src/derive/mod.rs index 5ffba7a515b21..b812fd09bf042 100644 --- a/turbopack/crates/turbo-tasks-macros/src/derive/mod.rs +++ b/turbopack/crates/turbo-tasks-macros/src/derive/mod.rs @@ -2,7 +2,6 @@ mod deterministic_hash_macro; mod key_value_pair_macro; mod non_local_value_macro; mod operation_value_macro; -mod shrink_to_fit_macro; mod task_input_macro; mod trace_raw_vcs_macro; mod value_debug_format_macro; @@ -12,7 +11,6 @@ pub use deterministic_hash_macro::derive_deterministic_hash; pub use key_value_pair_macro::derive_key_value_pair; pub use non_local_value_macro::derive_non_local_value; pub use operation_value_macro::derive_operation_value; -pub use shrink_to_fit_macro::derive_shrink_to_fit; use syn::{spanned::Spanned, Attribute, Meta, MetaList, NestedMeta}; pub use task_input_macro::derive_task_input; pub use trace_raw_vcs_macro::derive_trace_raw_vcs; diff --git a/turbopack/crates/turbo-tasks-macros/src/derive/shrink_to_fit_macro.rs b/turbopack/crates/turbo-tasks-macros/src/derive/shrink_to_fit_macro.rs deleted file mode 100644 index 219b9922a0386..0000000000000 --- a/turbopack/crates/turbo-tasks-macros/src/derive/shrink_to_fit_macro.rs +++ /dev/null @@ -1,53 +0,0 @@ -use proc_macro::TokenStream; -use proc_macro2::TokenStream as TokenStream2; -use quote::quote; -use syn::{parse_macro_input, DeriveInput, FieldsNamed, FieldsUnnamed}; -use turbo_tasks_macros_shared::{generate_exhaustive_destructuring, match_expansion}; - -pub fn derive_shrink_to_fit(input: TokenStream) -> TokenStream { - let derive_input = parse_macro_input!(input as DeriveInput); - let ident = &derive_input.ident; - let (impl_generics, ty_generics, where_clause) = derive_input.generics.split_for_impl(); - - let shrink_items = match_expansion(&derive_input, &shrink_named, &shrink_unnamed, &shrink_unit); - quote! { - impl #impl_generics turbo_tasks::ShrinkToFit for #ident #ty_generics #where_clause { - fn shrink_to_fit(&mut self) { - #shrink_items - } - } - } - .into() -} - -fn shrink_named(_ident: TokenStream2, fields: &FieldsNamed) -> (TokenStream2, TokenStream2) { - let (captures, fields_idents) = generate_exhaustive_destructuring(fields.named.iter()); - ( - captures, - quote! { - {#( - turbo_tasks::macro_helpers::ShrinkToFitDerefSpecialization::new( - #fields_idents, - ).shrink_to_fit(); - )*} - }, - ) -} - -fn shrink_unnamed(_ident: TokenStream2, fields: &FieldsUnnamed) -> (TokenStream2, TokenStream2) { - let (captures, fields_idents) = generate_exhaustive_destructuring(fields.unnamed.iter()); - ( - captures, - quote! { - {#( - turbo_tasks::macro_helpers::ShrinkToFitDerefSpecialization::new( - #fields_idents, - ).shrink_to_fit(); - )*} - }, - ) -} - -fn shrink_unit(_ident: TokenStream2) -> TokenStream2 { - quote! { { } } -} diff --git a/turbopack/crates/turbo-tasks-macros/src/lib.rs b/turbopack/crates/turbo-tasks-macros/src/lib.rs index 2b8002239174a..6468a0e337482 100644 --- a/turbopack/crates/turbo-tasks-macros/src/lib.rs +++ b/turbopack/crates/turbo-tasks-macros/src/lib.rs @@ -23,11 +23,6 @@ pub fn derive_trace_raw_vcs_attr(input: TokenStream) -> TokenStream { derive::derive_trace_raw_vcs(input) } -#[proc_macro_derive(ShrinkToFit, attributes(turbo_tasks))] -pub fn derive_shrink_to_fit(input: TokenStream) -> TokenStream { - derive::derive_shrink_to_fit(input) -} - #[proc_macro_derive(NonLocalValue, attributes(turbo_tasks))] pub fn derive_non_local_value_attr(input: TokenStream) -> TokenStream { derive::derive_non_local_value(input) diff --git a/turbopack/crates/turbo-tasks-macros/src/primitive_macro.rs b/turbopack/crates/turbo-tasks-macros/src/primitive_macro.rs index 53a2b2613e264..c9bea7f085605 100644 --- a/turbopack/crates/turbo-tasks-macros/src/primitive_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/primitive_macro.rs @@ -16,16 +16,6 @@ pub fn primitive(input: TokenStream) -> TokenStream { .into(); }; - let value_shrink_to_fit_impl = if input.manual_shrink_to_fit.is_none() { - Some(quote! { - impl turbo_tasks::ShrinkToFit for #ty { - fn shrink_to_fit(&mut self) {} - } - }) - } else { - None - }; - let value_debug_impl = quote! { #[turbo_tasks::value_impl] impl turbo_tasks::debug::ValueDebug for #ty { @@ -72,7 +62,6 @@ pub fn primitive(input: TokenStream) -> TokenStream { #value_type_and_register #value_debug_impl - #value_shrink_to_fit_impl #value_default_impl } .into() diff --git a/turbopack/crates/turbo-tasks-macros/src/value_macro.rs b/turbopack/crates/turbo-tasks-macros/src/value_macro.rs index 0fdb291ff49b8..aa8d84f28a2ee 100644 --- a/turbopack/crates/turbo-tasks-macros/src/value_macro.rs +++ b/turbopack/crates/turbo-tasks-macros/src/value_macro.rs @@ -343,6 +343,7 @@ pub fn value(args: TokenStream, input: TokenStream) -> TokenStream { turbo_tasks::trace::TraceRawVcs, turbo_tasks::NonLocalValue, )] + #[shrink_to_fit(crate = "turbo_tasks::macro_helpers::shrink_to_fit")] }]; match serialization_mode { SerializationMode::Auto | SerializationMode::AutoForInput => { diff --git a/turbopack/crates/turbo-tasks/Cargo.toml b/turbopack/crates/turbo-tasks/Cargo.toml index 9b9c5471e44b8..4fbffec3c46d4 100644 --- a/turbopack/crates/turbo-tasks/Cargo.toml +++ b/turbopack/crates/turbo-tasks/Cargo.toml @@ -40,6 +40,7 @@ rustc-hash = { workspace = true } serde = { workspace = true, features = ["rc", "derive"] } serde_json = { workspace = true } serde_regex = "1.1.0" +shrink-to-fit = { workspace=true,features = ["indexmap", "serde_json", "smallvec", "nightly"] } thiserror = { workspace = true } tokio = { workspace = true, features = ["full"] } tokio-util = { workspace = true } diff --git a/turbopack/crates/turbo-tasks/src/lib.rs b/turbopack/crates/turbo-tasks/src/lib.rs index 5719ed15ec6b5..b6205d6e05f73 100644 --- a/turbopack/crates/turbo-tasks/src/lib.rs +++ b/turbopack/crates/turbo-tasks/src/lib.rs @@ -69,7 +69,6 @@ mod read_ref; pub mod registry; mod scope; mod serialization_invalidation; -mod shrink_to_fit; pub mod small_duration; mod state; pub mod task; diff --git a/turbopack/crates/turbo-tasks/src/macro_helpers.rs b/turbopack/crates/turbo-tasks/src/macro_helpers.rs index 8fd1759e87046..68d73eafb39ec 100644 --- a/turbopack/crates/turbo-tasks/src/macro_helpers.rs +++ b/turbopack/crates/turbo-tasks/src/macro_helpers.rs @@ -1,14 +1,14 @@ //! Runtime helpers for [turbo-tasks-macro]. -use std::ops::{Deref, DerefMut}; pub use async_trait::async_trait; pub use once_cell::sync::{Lazy, OnceCell}; pub use serde; +pub use shrink_to_fit; pub use tracing; use crate::{ - debug::ValueDebugFormatString, shrink_to_fit::ShrinkToFit, task::TaskOutput, NonLocalValue, - RawVc, TaskInput, TaskPersistence, Vc, + debug::ValueDebugFormatString, task::TaskOutput, NonLocalValue, RawVc, TaskInput, + TaskPersistence, Vc, }; pub use crate::{ magic_any::MagicAny, @@ -61,60 +61,3 @@ macro_rules! stringify_path { stringify!($path) }; } - -/// A wrapper type that uses the [autoderef specialization hack][autoderef] to call -/// [`ShrinkToFit::shrink_to_fit`] on types that implement [`ShrinkToFit`]. -/// -/// This uses a a no-op method [`ShrinkToFitFallbackNoop::shrink_to_fit`] on types that do not -/// implement [`ShrinkToFit`]. -/// -/// This is used by the derive macro for [`ShrinkToFit`], which is called by the -/// [turbo_tasks::value][macro@crate::value] macro. -/// -/// [autoderef]: http://lukaskalbertodt.github.io/2019/12/05/generalized-autoref-based-specialization.html -pub struct ShrinkToFitDerefSpecialization<'a, T> { - inner: ShrinkToFitFallbackNoop<'a, T>, -} - -impl<'a, T> ShrinkToFitDerefSpecialization<'a, T> { - pub fn new(real: &'a mut T) -> Self { - Self { - inner: ShrinkToFitFallbackNoop { real }, - } - } -} - -impl ShrinkToFitDerefSpecialization<'_, T> -where - T: ShrinkToFit, -{ - pub fn shrink_to_fit(&mut self) { - // call the real `ShrinkToFit::shrink_to_fit` method - self.inner.real.shrink_to_fit() - } -} - -impl<'a, T> Deref for ShrinkToFitDerefSpecialization<'a, T> { - type Target = ShrinkToFitFallbackNoop<'a, T>; - - fn deref(&self) -> &Self::Target { - &self.inner - } -} - -impl DerefMut for ShrinkToFitDerefSpecialization<'_, T> { - fn deref_mut(&mut self) -> &mut Self::Target { - &mut self.inner - } -} - -// Implements `ShrinkToFit` using a no-op `ShrinkToFit::shrink_to_fit` method. -pub struct ShrinkToFitFallbackNoop<'a, T> { - real: &'a mut T, -} - -impl ShrinkToFitFallbackNoop<'_, T> { - /// A no-op function called as part of [`ShrinkToFitDerefSpecialization`] when `T` does not - /// implement [`ShrinkToFit`]. - pub fn shrink_to_fit(&mut self) {} -} diff --git a/turbopack/crates/turbo-tasks/src/shrink_to_fit.rs b/turbopack/crates/turbo-tasks/src/shrink_to_fit.rs deleted file mode 100644 index 4dc29de21f35f..0000000000000 --- a/turbopack/crates/turbo-tasks/src/shrink_to_fit.rs +++ /dev/null @@ -1,79 +0,0 @@ -use std::{ - collections::{BinaryHeap, HashMap, VecDeque}, - ffi::OsString, - hash::{BuildHasher, Hash}, - path::PathBuf, -}; - -use indexmap::{IndexMap, IndexSet}; -pub use turbo_tasks_macros::ShrinkToFit; - -/// A type that might have memory capacity that can be shrunk. See [`Vec::shrink_to_fit`] as an -/// example. -/// -/// This method may be a no-op. Due to limitaitons of Rust's macro system, it is derived for every -/// [`VcValueType`][crate::VcValueType], even if that type contains no shrinkable collections. -pub trait ShrinkToFit { - fn shrink_to_fit(&mut self); -} - -impl ShrinkToFit for String { - fn shrink_to_fit(&mut self) { - String::shrink_to_fit(self); - } -} - -impl ShrinkToFit for OsString { - fn shrink_to_fit(&mut self) { - OsString::shrink_to_fit(self); - } -} - -impl ShrinkToFit for PathBuf { - fn shrink_to_fit(&mut self) { - PathBuf::shrink_to_fit(self); - } -} - -impl ShrinkToFit for Vec { - // NOTE: without real specialization (not the autoderef specialization hack that works in - // macros, but not generics) or negative impls, we cannot call `shrink_to_fit` on nested - // collections inside `T`, so we have to settle with just shrinking the outermost collection. - fn shrink_to_fit(&mut self) { - Vec::shrink_to_fit(self); - } -} - -impl ShrinkToFit for VecDeque { - fn shrink_to_fit(&mut self) { - VecDeque::shrink_to_fit(self); - } -} - -impl ShrinkToFit for HashMap -where - K: Hash + Eq, - S: BuildHasher, -{ - fn shrink_to_fit(&mut self) { - HashMap::shrink_to_fit(self); - } -} - -impl ShrinkToFit for BinaryHeap { - fn shrink_to_fit(&mut self) { - BinaryHeap::shrink_to_fit(self); - } -} - -impl ShrinkToFit for IndexMap { - fn shrink_to_fit(&mut self) { - IndexMap::shrink_to_fit(self); - } -} - -impl ShrinkToFit for IndexSet { - fn shrink_to_fit(&mut self) { - IndexSet::shrink_to_fit(self); - } -} diff --git a/turbopack/crates/turbo-tasks/src/vc/mod.rs b/turbopack/crates/turbo-tasks/src/vc/mod.rs index 92f8082a7fa24..751f380439dfa 100644 --- a/turbopack/crates/turbo-tasks/src/vc/mod.rs +++ b/turbopack/crates/turbo-tasks/src/vc/mod.rs @@ -18,6 +18,7 @@ use std::{ use anyhow::Result; use serde::{Deserialize, Serialize}; +use shrink_to_fit::ShrinkToFit; pub use self::{ cast::{VcCast, VcValueTraitCast, VcValueTypeCast}, @@ -33,7 +34,7 @@ use crate::{ debug::{ValueDebug, ValueDebugFormat, ValueDebugFormatString}, registry, trace::{TraceRawVcs, TraceRawVcsContext}, - CellId, RawVc, ResolveTypeError, ShrinkToFit, + CellId, RawVc, ResolveTypeError, }; /// A "Value Cell" (`Vc` for short) is a reference to a memoized computation result stored on the