mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
rust: pin-init: 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. Link: https://patch.msgid.link/20260527-pin-init-sync-v1-5-e20335ed2501@garyguo.net Signed-off-by: Gary Guo <gary@garyguo.net>
This commit is contained in:
parent
2a02b4f96f
commit
79bc923ae2
|
|
@ -58,36 +58,6 @@ pub const fn new() -> Self {
|
|||
}
|
||||
}
|
||||
|
||||
/// 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<F, T: ?Sized, E>(pub(crate) F, pub(crate) PhantomInvariant<(E, T)>);
|
||||
|
||||
// SAFETY: While constructing the `InitClosure`, the user promised that it upholds the
|
||||
// `__init` invariants.
|
||||
unsafe impl<T: ?Sized, F, E> Init<T, E> for InitClosure<F, T, E>
|
||||
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<T: ?Sized, F, E> PinInit<T, E> for InitClosure<F, T, E>
|
||||
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
|
||||
|
|
|
|||
|
|
@ -1092,6 +1092,36 @@ unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), E> {
|
|||
}
|
||||
}
|
||||
|
||||
/// 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, T: ?Sized, E>(F, __internal::PhantomInvariant<(E, T)>);
|
||||
|
||||
// SAFETY: While constructing the `InitClosure`, the user promised that it upholds the
|
||||
// `__init` invariants.
|
||||
unsafe impl<T: ?Sized, F, E> Init<T, E> for InitClosure<F, T, E>
|
||||
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<T: ?Sized, F, E> PinInit<T, E> for InitClosure<F, T, E>
|
||||
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<T, E>`] from the given closure.
|
||||
///
|
||||
/// # Safety
|
||||
|
|
@ -1108,7 +1138,7 @@ unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), E> {
|
|||
pub const unsafe fn pin_init_from_closure<T: ?Sized, E>(
|
||||
f: impl FnOnce(*mut T) -> Result<(), E>,
|
||||
) -> impl PinInit<T, E> {
|
||||
__internal::InitClosure(f, __internal::PhantomInvariant::new())
|
||||
InitClosure(f, __internal::PhantomInvariant::new())
|
||||
}
|
||||
|
||||
/// Creates a new [`Init<T, E>`] from the given closure.
|
||||
|
|
@ -1127,7 +1157,7 @@ unsafe fn __pinned_init(self, slot: *mut T) -> Result<(), E> {
|
|||
pub const unsafe fn init_from_closure<T: ?Sized, E>(
|
||||
f: impl FnOnce(*mut T) -> Result<(), E>,
|
||||
) -> impl Init<T, E> {
|
||||
__internal::InitClosure(f, __internal::PhantomInvariant::new())
|
||||
InitClosure(f, __internal::PhantomInvariant::new())
|
||||
}
|
||||
|
||||
/// Changes the to be initialized type.
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user