mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 17:47:41 +02:00
rust: pin-init: internal: make make_closure inherent methods
The `InitData` and `PinData` traits do not need to exist, the inference helpers could be inherent methods instead. There is no risk for calling the wrong methods even when user defines it, as inherent methods take priority over trait methods. With this change, it unlocks the possibility of attaching additional bounds to the method per type, which is not possible for trait methods. Signed-off-by: Gary Guo <gary@garyguo.net>
This commit is contained in:
parent
27693a56e8
commit
57b0a0d7e5
|
|
@ -103,17 +103,15 @@ pub(crate) fn expand(
|
|||
|(_, err)| Box::new(err),
|
||||
);
|
||||
let slot = format_ident!("slot");
|
||||
let (has_data_trait, data_trait, get_data, init_from_closure) = if pinned {
|
||||
let (has_data_trait, get_data, init_from_closure) = if pinned {
|
||||
(
|
||||
format_ident!("HasPinData"),
|
||||
format_ident!("PinData"),
|
||||
format_ident!("__pin_data"),
|
||||
format_ident!("pin_init_from_closure"),
|
||||
)
|
||||
} else {
|
||||
(
|
||||
format_ident!("HasInitData"),
|
||||
format_ident!("InitData"),
|
||||
format_ident!("__init_data"),
|
||||
format_ident!("init_from_closure"),
|
||||
)
|
||||
|
|
@ -157,8 +155,7 @@ fn assert_zeroable<T: ?::core::marker::Sized>(_: *mut T)
|
|||
#path::#get_data()
|
||||
};
|
||||
// Ensure that `#data` really is of type `#data` and help with type inference:
|
||||
let init = ::pin_init::__internal::#data_trait::make_closure::<_, #error>(
|
||||
#data,
|
||||
let init = #data.__make_closure::<_, #error>(
|
||||
move |slot| {
|
||||
#zeroable_check
|
||||
#this
|
||||
|
|
|
|||
|
|
@ -447,6 +447,16 @@ impl #impl_generics ::core::marker::Copy for __ThePinData #ty_generics
|
|||
impl #impl_generics __ThePinData #ty_generics
|
||||
#whr
|
||||
{
|
||||
/// Type inference helper function.
|
||||
#[inline(always)]
|
||||
#vis fn __make_closure<__F, __E>(self, f: __F) -> __F
|
||||
where
|
||||
__F: FnOnce(*mut #struct_name #ty_generics) ->
|
||||
::core::result::Result<::pin_init::__internal::InitOk, __E>,
|
||||
{
|
||||
f
|
||||
}
|
||||
|
||||
#field_accessors
|
||||
}
|
||||
|
||||
|
|
@ -461,13 +471,6 @@ unsafe fn __pin_data() -> Self::PinData {
|
|||
__ThePinData { __phantom: ::pin_init::__internal::PhantomInvariant::new() }
|
||||
}
|
||||
}
|
||||
|
||||
// SAFETY: TODO
|
||||
unsafe impl #impl_generics ::pin_init::__internal::PinData for __ThePinData #ty_generics
|
||||
#whr
|
||||
{
|
||||
type Datee = #struct_name #ty_generics;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -113,30 +113,12 @@ pub unsafe fn new() -> Self {
|
|||
///
|
||||
/// Only the `init` module is allowed to use this trait.
|
||||
pub unsafe trait HasPinData {
|
||||
type PinData: PinData;
|
||||
type PinData;
|
||||
|
||||
#[expect(clippy::missing_safety_doc)]
|
||||
unsafe fn __pin_data() -> Self::PinData;
|
||||
}
|
||||
|
||||
/// Marker trait for pinning data of structs.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// Only the `init` module is allowed to use this trait.
|
||||
pub unsafe trait PinData: Copy {
|
||||
type Datee: ?Sized + HasPinData;
|
||||
|
||||
/// Type inference helper function.
|
||||
#[inline(always)]
|
||||
fn make_closure<F, E>(self, f: F) -> F
|
||||
where
|
||||
F: FnOnce(*mut Self::Datee) -> Result<InitOk, E>,
|
||||
{
|
||||
f
|
||||
}
|
||||
}
|
||||
|
||||
/// This trait is automatically implemented for every type. It aims to provide the same type
|
||||
/// inference help as `HasPinData`.
|
||||
///
|
||||
|
|
@ -144,30 +126,12 @@ fn make_closure<F, E>(self, f: F) -> F
|
|||
///
|
||||
/// Only the `init` module is allowed to use this trait.
|
||||
pub unsafe trait HasInitData {
|
||||
type InitData: InitData;
|
||||
type InitData;
|
||||
|
||||
#[expect(clippy::missing_safety_doc)]
|
||||
unsafe fn __init_data() -> Self::InitData;
|
||||
}
|
||||
|
||||
/// Same function as `PinData`, but for arbitrary data.
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// Only the `init` module is allowed to use this trait.
|
||||
pub unsafe trait InitData: Copy {
|
||||
type Datee: ?Sized + HasInitData;
|
||||
|
||||
/// Type inference helper function.
|
||||
#[inline(always)]
|
||||
fn make_closure<F, E>(self, f: F) -> F
|
||||
where
|
||||
F: FnOnce(*mut Self::Datee) -> Result<InitOk, E>,
|
||||
{
|
||||
f
|
||||
}
|
||||
}
|
||||
|
||||
pub struct AllData<T: ?Sized>(PhantomInvariant<T>);
|
||||
|
||||
impl<T: ?Sized> Clone for AllData<T> {
|
||||
|
|
@ -178,9 +142,15 @@ fn clone(&self) -> Self {
|
|||
|
||||
impl<T: ?Sized> Copy for AllData<T> {}
|
||||
|
||||
// SAFETY: TODO.
|
||||
unsafe impl<T: ?Sized> InitData for AllData<T> {
|
||||
type Datee = T;
|
||||
impl<T: ?Sized> AllData<T> {
|
||||
/// Type inference helper function.
|
||||
#[inline(always)]
|
||||
pub fn __make_closure<F, E>(self, f: F) -> F
|
||||
where
|
||||
F: FnOnce(*mut T) -> Result<InitOk, E>,
|
||||
{
|
||||
f
|
||||
}
|
||||
}
|
||||
|
||||
// SAFETY: TODO.
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user