From 2cf6818d8f98621ee97e28b03a2624819641874e Mon Sep 17 00:00:00 2001 From: Gary Guo Date: Mon, 11 May 2026 17:03:50 +0100 Subject: [PATCH 1/2] move `InitClosure` out from `__internal` The `__internal` module is for exposing internal items publicly to procedural macros (pin-init-internal). Types that are crate-local only can just have proper visibility and does not need to be in `__internal`. The type name of `InitClosure` can often shows up in symbol names, this reduces the length slightly. Signed-off-by: Gary Guo --- src/__internal.rs | 30 ------------------------------ src/lib.rs | 34 ++++++++++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/__internal.rs b/src/__internal.rs index e54d90a4..7d8ab219 100644 --- a/src/__internal.rs +++ b/src/__internal.rs @@ -58,36 +58,6 @@ impl PhantomInvariantLifetime<'_> { } } -/// Module-internal type implementing `PinInit` and `Init`. -/// -/// It is unsafe to create this type, since the closure needs to fulfill the same safety -/// requirement as the `__pinned_init`/`__init` functions. -pub(crate) struct InitClosure(pub(crate) F, pub(crate) PhantomInvariant<(E, T)>); - -// SAFETY: While constructing the `InitClosure`, the user promised that it upholds the -// `__init` invariants. -unsafe impl Init for InitClosure -where - F: FnOnce(*mut T) -> Result<(), E>, -{ - #[inline] - unsafe fn __init(self, slot: *mut T) -> Result<(), E> { - (self.0)(slot) - } -} - -// SAFETY: While constructing the `InitClosure`, the user promised that it upholds the -// `__pinned_init` invariants. -unsafe impl PinInit for InitClosure -where - F: FnOnce(*mut T) -> Result<(), E>, -{ - #[inline] - unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), E> { - (self.0)(slot) - } -} - /// Token type to signify successful initialization. /// /// Can only be constructed via the unsafe [`Self::new`] function. The initializer macros use this diff --git a/src/lib.rs b/src/lib.rs index 4098c65d..74eddcfe 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1092,6 +1092,36 @@ where } } +/// Implement `PinInit` and `Init` for closures. +/// +/// It is unsafe to create this type, since the closure needs to fulfill the same safety +/// requirement as the `__pinned_init`/`__init` functions. +struct InitClosure(F, __internal::PhantomInvariant<(E, T)>); + +// SAFETY: While constructing the `InitClosure`, the user promised that it upholds the +// `__init` invariants. +unsafe impl Init for InitClosure +where + F: FnOnce(*mut T) -> Result<(), E>, +{ + #[inline] + unsafe fn __init(self, slot: *mut T) -> Result<(), E> { + (self.0)(slot) + } +} + +// SAFETY: While constructing the `InitClosure`, the user promised that it upholds the +// `__pinned_init` invariants. +unsafe impl PinInit for InitClosure +where + F: FnOnce(*mut T) -> Result<(), E>, +{ + #[inline] + unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), E> { + (self.0)(slot) + } +} + /// Creates a new [`PinInit`] from the given closure. /// /// # Safety @@ -1108,7 +1138,7 @@ where pub const unsafe fn pin_init_from_closure( f: impl FnOnce(*mut T) -> Result<(), E>, ) -> impl PinInit { - __internal::InitClosure(f, __internal::PhantomInvariant::new()) + InitClosure(f, __internal::PhantomInvariant::new()) } /// Creates a new [`Init`] from the given closure. @@ -1127,7 +1157,7 @@ pub const unsafe fn pin_init_from_closure( pub const unsafe fn init_from_closure( f: impl FnOnce(*mut T) -> Result<(), E>, ) -> impl Init { - __internal::InitClosure(f, __internal::PhantomInvariant::new()) + InitClosure(f, __internal::PhantomInvariant::new()) } /// Changes the to be initialized type. From c3a3f1e447eb69e5dde4d34d2ef5940256bb76d2 Mon Sep 17 00:00:00 2001 From: Gary Guo Date: Mon, 11 May 2026 17:09:20 +0100 Subject: [PATCH 2/2] remove `E` from `InitClosure` Move `E` from type to trait impl block. This greatly shortens the monomorphized type names. The `__pinned_init` function name is only slightly shortened as it still encodes the `E` as part of `PinInit` in the symbol. `T` cannot be moved to trait impl block otherwise it will start to conflict with the `impl Init for T` as Rust cannot deduce that there're no types that fulfill `T: FnOnce(*mut T)`. Signed-off-by: Gary Guo --- src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 74eddcfe..4061cbca 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1096,11 +1096,11 @@ where /// /// It is unsafe to create this type, since the closure needs to fulfill the same safety /// requirement as the `__pinned_init`/`__init` functions. -struct InitClosure(F, __internal::PhantomInvariant<(E, T)>); +struct InitClosure(F, __internal::PhantomInvariant); // SAFETY: While constructing the `InitClosure`, the user promised that it upholds the // `__init` invariants. -unsafe impl Init for InitClosure +unsafe impl Init for InitClosure where F: FnOnce(*mut T) -> Result<(), E>, { @@ -1112,7 +1112,7 @@ where // SAFETY: While constructing the `InitClosure`, the user promised that it upholds the // `__pinned_init` invariants. -unsafe impl PinInit for InitClosure +unsafe impl PinInit for InitClosure where F: FnOnce(*mut T) -> Result<(), E>, {