Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -160,7 +160,6 @@ actually does the initialization in the correct way. Here are the things to look
```rust
use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
use core::{
ptr::addr_of_mut,
marker::PhantomPinned,
cell::UnsafeCell,
pin::Pin,
Expand DownExpand Up@@ -199,7 +198,7 @@ impl RawFoo {
unsafe {
pin_init_from_closure(move |slot: *mut Self| {
// `slot` contains uninit memory, avoid creating a reference.
let foo = addr_of_mut!((*slot).foo);
let foo = &raw mut (*slot).foo;
let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();

// Initialize the `foo`
Expand Down
4 changes: 4 additions & 0 deletions build.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@ use rustc_version::{version, Version};
fn main() {
println!("cargo::rustc-check-cfg=cfg(RUSTC_LINT_REASONS_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_NEW_UNINIT_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_RAW_REF_OP_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(CONFIG_RUSTC_HAS_UNSAFE_PINNED)");
if version().unwrap() >= Version::parse("1.81.0").unwrap()
|| version().unwrap() >= Version::parse("1.81.0-nightly").unwrap()
Expand All@@ -15,4 +16,7 @@ fn main() {
if version().unwrap() >= Version::parse("1.89.0-nightly").unwrap() {
println!("cargo:rustc-cfg=CONFIG_RUSTC_HAS_UNSAFE_PINNED");
}
if version().unwrap() >= Version::parse("1.82.0").unwrap() {
println!("cargo:rustc-cfg=RUSTC_RAW_REF_OP_IS_STABLE");
}
}
2 changes: 2 additions & 0 deletions examples/big_struct_in_place.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT

#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

// Struct with size over 1GiB
Expand Down
1 change: 1 addition & 0 deletions examples/linked_list.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{
cell::Cell,
Expand Down
1 change: 1 addition & 0 deletions examples/mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(clippy::missing_safety_doc)]

use core::{
Expand Down
1 change: 1 addition & 0 deletions examples/pthread_mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

#[cfg(not(windows))]
mod pthread_mtx {
Expand Down
1 change: 1 addition & 0 deletions examples/static_init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(unused_imports)]

use core::{
Expand Down
8 changes: 4 additions & 4 deletions internal/src/init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -284,7 +284,7 @@ fn init_fields(
{
#value_prep
// SAFETY: TODO
unsafe { #write(::core::ptr::addr_of_mut!((*#slot).#ident), #value_ident) };
unsafe { #write(&raw mut (*#slot).#ident, #value_ident) };
}
#accessor
}
Expand All@@ -301,7 +301,7 @@ fn init_fields(
// return when an error/panic occurs.
// - We also use `#data` to require the correct trait (`Init` or `PinInit`)
// for `#ident`.
unsafe { #data.#ident(::core::ptr::addr_of_mut!((*#slot).#ident), #init)? };
unsafe { #data.#ident(&raw mut (*#slot).#ident, #init)? };
},
quote! {
// SAFETY: TODO
Expand All@@ -316,7 +316,7 @@ fn init_fields(
unsafe {
::pin_init::Init::__init(
#init,
::core::ptr::addr_of_mut!((*#slot).#ident),
&raw mut (*#slot).#ident,
)?
};
},
Expand DownExpand Up@@ -361,7 +361,7 @@ fn init_fields(
// SAFETY: We forget the guard later when initialization has succeeded.
let #guard = unsafe {
::pin_init::__internal::DropGuard::new(
::core::ptr::addr_of_mut!((*slot).#ident)
&raw mut (*slot).#ident
)
};
});
Expand Down
8 changes: 4 additions & 4 deletions src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -172,7 +172,6 @@
//! # #![feature(extern_types)]
//! use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
//! use core::{
//! ptr::addr_of_mut,
//! marker::PhantomPinned,
//! cell::UnsafeCell,
//! pin::Pin,
Expand DownExpand Up@@ -211,7 +210,7 @@
//! unsafe {
//! pin_init_from_closure(move |slot: *mut Self| {
//! // `slot` contains uninit memory, avoid creating a reference.
//! let foo = addr_of_mut!((*slot).foo);
//! let foo = &raw mut (*slot).foo;
//! let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();
//!
//! // Initialize the `foo`
Expand DownExpand Up@@ -265,6 +264,7 @@
//! [Rust-for-Linux]: https://rust-for-linux.com/

#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(
all(
any(feature = "alloc", feature = "std"),
Expand DownExpand Up@@ -755,7 +755,7 @@ macro_rules! stack_try_pin_init {
///
/// ```rust
/// # use pin_init::*;
/// # use core::{ptr::addr_of_mut, marker::PhantomPinned};
/// # use core::marker::PhantomPinned;
/// #[pin_data]
/// #[derive(Zeroable)]
/// struct Buf {
Expand All@@ -769,7 +769,7 @@ macro_rules! stack_try_pin_init {
/// let init = pin_init!(&this in Buf {
/// buf: [0; 64],
/// // SAFETY: TODO.
/// ptr: unsafe { addr_of_mut!((*this.as_ptr()).buf).cast() },
/// ptr: unsafe { (&raw mut (*this.as_ptr()).buf).cast() },
/// pin: PhantomPinned,
/// });
/// let init = pin_init!(Buf {
Expand Down
1 change: 1 addition & 0 deletions tests/cfgs.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{pin_data, pin_init, PinInit};

Expand Down
1 change: 1 addition & 0 deletions tests/const-generic-default.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
1 change: 1 addition & 0 deletions tests/init-scope.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
#![allow(dead_code)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
15 changes: 5 additions & 10 deletions tests/ring_buf.rs
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(feature = "alloc", feature(allocator_api))]

#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::sync::Arc;
use core::{
convert::Infallible,
marker::PhantomPinned,
mem::MaybeUninit,
pin::Pin,
ptr::{self, addr_of_mut},
};
use core::{convert::Infallible, marker::PhantomPinned, mem::MaybeUninit, pin::Pin, ptr};
use pin_init::*;
#[cfg(feature = "std")]
use std::sync::Arc;
Expand DownExpand Up@@ -50,8 +45,8 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
// SAFETY: The elements of the array can be uninitialized.
buffer <- unsafe { init_from_closure(|_| Ok::<_, Infallible>(())) },
// SAFETY: `this` is a valid pointer.
head: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
head: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
_pin: PhantomPinned,
})
}
Expand DownExpand Up@@ -112,7 +107,7 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
unsafe fn advance(&mut self, ptr: *mut T) -> *mut T {
// SAFETY: ptr's offset from buffer is < SIZE
let ptr = unsafe { ptr.add(1) };
let origin: *mut _ = addr_of_mut!(self.buffer);
let origin: *mut _ = &raw mut (self.buffer);
let origin = origin.cast::<T>();
let offset = unsafe { ptr.offset_from(origin) };
if offset >= SIZE as isize {
Expand Down
2 changes: 2 additions & 0 deletions tests/underscore.rs
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{init, Init};

pub struct Foo {
Expand Down
5 changes: 3 additions & 2 deletions tests/zeroing.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{marker::PhantomPinned, ptr::addr_of_mut};
use std::marker::PhantomPinned;

use pin_init::*;

Expand All@@ -22,7 +23,7 @@ impl Foo {
marks: {
let ptr = this.as_ptr();
// SAFETY: project from the NonNull<Foo> to the buf field
let ptr = unsafe { addr_of_mut!((*ptr).buf) }.cast::<u8>();
let ptr = unsafe { &raw mut (*ptr).buf }.cast::<u8>();
[ptr; MARKS]},
..Zeroable::init_zeroed()
})
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -160,7 +160,6 @@ actually does the initialization in the correct way. Here are the things to look
```rust
use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
use core::{
ptr::addr_of_mut,
marker::PhantomPinned,
cell::UnsafeCell,
pin::Pin,
Expand DownExpand Up@@ -199,7 +198,7 @@ impl RawFoo {
unsafe {
pin_init_from_closure(move |slot: *mut Self| {
// `slot` contains uninit memory, avoid creating a reference.
let foo = addr_of_mut!((*slot).foo);
let foo = &raw mut (*slot).foo;
let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();

// Initialize the `foo`
Expand Down
4 changes: 4 additions & 0 deletions build.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@ use rustc_version::{version, Version};
fn main() {
println!("cargo::rustc-check-cfg=cfg(RUSTC_LINT_REASONS_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_NEW_UNINIT_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_RAW_REF_OP_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(CONFIG_RUSTC_HAS_UNSAFE_PINNED)");
if version().unwrap() >= Version::parse("1.81.0").unwrap()
|| version().unwrap() >= Version::parse("1.81.0-nightly").unwrap()
Expand All@@ -15,4 +16,7 @@ fn main() {
if version().unwrap() >= Version::parse("1.89.0-nightly").unwrap() {
println!("cargo:rustc-cfg=CONFIG_RUSTC_HAS_UNSAFE_PINNED");
}
if version().unwrap() >= Version::parse("1.82.0").unwrap() {
println!("cargo:rustc-cfg=RUSTC_RAW_REF_OP_IS_STABLE");
}
}
2 changes: 2 additions & 0 deletions examples/big_struct_in_place.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT

#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

// Struct with size over 1GiB
Expand Down
1 change: 1 addition & 0 deletions examples/linked_list.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{
cell::Cell,
Expand Down
1 change: 1 addition & 0 deletions examples/mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(clippy::missing_safety_doc)]

use core::{
Expand Down
1 change: 1 addition & 0 deletions examples/pthread_mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

#[cfg(not(windows))]
mod pthread_mtx {
Expand Down
1 change: 1 addition & 0 deletions examples/static_init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(unused_imports)]

use core::{
Expand Down
8 changes: 4 additions & 4 deletions internal/src/init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -284,7 +284,7 @@ fn init_fields(
{
#value_prep
// SAFETY: TODO
unsafe { #write(::core::ptr::addr_of_mut!((*#slot).#ident), #value_ident) };
unsafe { #write(&raw mut (*#slot).#ident, #value_ident) };
}
#accessor
}
Expand All@@ -301,7 +301,7 @@ fn init_fields(
// return when an error/panic occurs.
// - We also use `#data` to require the correct trait (`Init` or `PinInit`)
// for `#ident`.
unsafe { #data.#ident(::core::ptr::addr_of_mut!((*#slot).#ident), #init)? };
unsafe { #data.#ident(&raw mut (*#slot).#ident, #init)? };
},
quote! {
// SAFETY: TODO
Expand All@@ -316,7 +316,7 @@ fn init_fields(
unsafe {
::pin_init::Init::__init(
#init,
::core::ptr::addr_of_mut!((*#slot).#ident),
&raw mut (*#slot).#ident,
)?
};
},
Expand DownExpand Up@@ -361,7 +361,7 @@ fn init_fields(
// SAFETY: We forget the guard later when initialization has succeeded.
let #guard = unsafe {
::pin_init::__internal::DropGuard::new(
::core::ptr::addr_of_mut!((*slot).#ident)
&raw mut (*slot).#ident
)
};
});
Expand Down
8 changes: 4 additions & 4 deletions src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -172,7 +172,6 @@
//! # #![feature(extern_types)]
//! use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
//! use core::{
//! ptr::addr_of_mut,
//! marker::PhantomPinned,
//! cell::UnsafeCell,
//! pin::Pin,
Expand DownExpand Up@@ -211,7 +210,7 @@
//! unsafe {
//! pin_init_from_closure(move |slot: *mut Self| {
//! // `slot` contains uninit memory, avoid creating a reference.
//! let foo = addr_of_mut!((*slot).foo);
//! let foo = &raw mut (*slot).foo;
//! let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();
//!
//! // Initialize the `foo`
Expand DownExpand Up@@ -265,6 +264,7 @@
//! [Rust-for-Linux]: https://rust-for-linux.com/

#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(
all(
any(feature = "alloc", feature = "std"),
Expand DownExpand Up@@ -755,7 +755,7 @@ macro_rules! stack_try_pin_init {
///
/// ```rust
/// # use pin_init::*;
/// # use core::{ptr::addr_of_mut, marker::PhantomPinned};
/// # use core::marker::PhantomPinned;
/// #[pin_data]
/// #[derive(Zeroable)]
/// struct Buf {
Expand All@@ -769,7 +769,7 @@ macro_rules! stack_try_pin_init {
/// let init = pin_init!(&this in Buf {
/// buf: [0; 64],
/// // SAFETY: TODO.
/// ptr: unsafe { addr_of_mut!((*this.as_ptr()).buf).cast() },
/// ptr: unsafe { (&raw mut (*this.as_ptr()).buf).cast() },
/// pin: PhantomPinned,
/// });
/// let init = pin_init!(Buf {
Expand Down
1 change: 1 addition & 0 deletions tests/cfgs.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{pin_data, pin_init, PinInit};

Expand Down
1 change: 1 addition & 0 deletions tests/const-generic-default.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
1 change: 1 addition & 0 deletions tests/init-scope.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
#![allow(dead_code)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
15 changes: 5 additions & 10 deletions tests/ring_buf.rs
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(feature = "alloc", feature(allocator_api))]

#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::sync::Arc;
use core::{
convert::Infallible,
marker::PhantomPinned,
mem::MaybeUninit,
pin::Pin,
ptr::{self, addr_of_mut},
};
use core::{convert::Infallible, marker::PhantomPinned, mem::MaybeUninit, pin::Pin, ptr};
use pin_init::*;
#[cfg(feature = "std")]
use std::sync::Arc;
Expand DownExpand Up@@ -50,8 +45,8 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
// SAFETY: The elements of the array can be uninitialized.
buffer <- unsafe { init_from_closure(|_| Ok::<_, Infallible>(())) },
// SAFETY: `this` is a valid pointer.
head: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
head: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
_pin: PhantomPinned,
})
}
Expand DownExpand Up@@ -112,7 +107,7 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
unsafe fn advance(&mut self, ptr: *mut T) -> *mut T {
// SAFETY: ptr's offset from buffer is < SIZE
let ptr = unsafe { ptr.add(1) };
let origin: *mut _ = addr_of_mut!(self.buffer);
let origin: *mut _ = &raw mut (self.buffer);
let origin = origin.cast::<T>();
let offset = unsafe { ptr.offset_from(origin) };
if offset >= SIZE as isize {
Expand Down
2 changes: 2 additions & 0 deletions tests/underscore.rs
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{init, Init};

pub struct Foo {
Expand Down
5 changes: 3 additions & 2 deletions tests/zeroing.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{marker::PhantomPinned, ptr::addr_of_mut};
use std::marker::PhantomPinned;

use pin_init::*;

Expand All@@ -22,7 +23,7 @@ impl Foo {
marks: {
let ptr = this.as_ptr();
// SAFETY: project from the NonNull<Foo> to the buf field
let ptr = unsafe { addr_of_mut!((*ptr).buf) }.cast::<u8>();
let ptr = unsafe { &raw mut (*ptr).buf }.cast::<u8>();
[ptr; MARKS]},
..Zeroable::init_zeroed()
})
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -160,7 +160,6 @@ actually does the initialization in the correct way. Here are the things to look
```rust
use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
use core::{
ptr::addr_of_mut,
marker::PhantomPinned,
cell::UnsafeCell,
pin::Pin,
Expand DownExpand Up@@ -199,7 +198,7 @@ impl RawFoo {
unsafe {
pin_init_from_closure(move |slot: *mut Self| {
// `slot` contains uninit memory, avoid creating a reference.
let foo = addr_of_mut!((*slot).foo);
let foo = &raw mut (*slot).foo;
let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();

// Initialize the `foo`
Expand Down
4 changes: 4 additions & 0 deletions build.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@ use rustc_version::{version, Version};
fn main() {
println!("cargo::rustc-check-cfg=cfg(RUSTC_LINT_REASONS_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_NEW_UNINIT_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_RAW_REF_OP_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(CONFIG_RUSTC_HAS_UNSAFE_PINNED)");
if version().unwrap() >= Version::parse("1.81.0").unwrap()
|| version().unwrap() >= Version::parse("1.81.0-nightly").unwrap()
Expand All@@ -15,4 +16,7 @@ fn main() {
if version().unwrap() >= Version::parse("1.89.0-nightly").unwrap() {
println!("cargo:rustc-cfg=CONFIG_RUSTC_HAS_UNSAFE_PINNED");
}
if version().unwrap() >= Version::parse("1.82.0").unwrap() {
println!("cargo:rustc-cfg=RUSTC_RAW_REF_OP_IS_STABLE");
}
}
2 changes: 2 additions & 0 deletions examples/big_struct_in_place.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT

#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

// Struct with size over 1GiB
Expand Down
1 change: 1 addition & 0 deletions examples/linked_list.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{
cell::Cell,
Expand Down
1 change: 1 addition & 0 deletions examples/mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(clippy::missing_safety_doc)]

use core::{
Expand Down
1 change: 1 addition & 0 deletions examples/pthread_mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

#[cfg(not(windows))]
mod pthread_mtx {
Expand Down
1 change: 1 addition & 0 deletions examples/static_init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(unused_imports)]

use core::{
Expand Down
8 changes: 4 additions & 4 deletions internal/src/init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -284,7 +284,7 @@ fn init_fields(
{
#value_prep
// SAFETY: TODO
unsafe { #write(::core::ptr::addr_of_mut!((*#slot).#ident), #value_ident) };
unsafe { #write(&raw mut (*#slot).#ident, #value_ident) };
}
#accessor
}
Expand All@@ -301,7 +301,7 @@ fn init_fields(
// return when an error/panic occurs.
// - We also use `#data` to require the correct trait (`Init` or `PinInit`)
// for `#ident`.
unsafe { #data.#ident(::core::ptr::addr_of_mut!((*#slot).#ident), #init)? };
unsafe { #data.#ident(&raw mut (*#slot).#ident, #init)? };
},
quote! {
// SAFETY: TODO
Expand All@@ -316,7 +316,7 @@ fn init_fields(
unsafe {
::pin_init::Init::__init(
#init,
::core::ptr::addr_of_mut!((*#slot).#ident),
&raw mut (*#slot).#ident,
)?
};
},
Expand DownExpand Up@@ -361,7 +361,7 @@ fn init_fields(
// SAFETY: We forget the guard later when initialization has succeeded.
let #guard = unsafe {
::pin_init::__internal::DropGuard::new(
::core::ptr::addr_of_mut!((*slot).#ident)
&raw mut (*slot).#ident
)
};
});
Expand Down
8 changes: 4 additions & 4 deletions src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -172,7 +172,6 @@
//! # #![feature(extern_types)]
//! use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
//! use core::{
//! ptr::addr_of_mut,
//! marker::PhantomPinned,
//! cell::UnsafeCell,
//! pin::Pin,
Expand DownExpand Up@@ -211,7 +210,7 @@
//! unsafe {
//! pin_init_from_closure(move |slot: *mut Self| {
//! // `slot` contains uninit memory, avoid creating a reference.
//! let foo = addr_of_mut!((*slot).foo);
//! let foo = &raw mut (*slot).foo;
//! let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();
//!
//! // Initialize the `foo`
Expand DownExpand Up@@ -265,6 +264,7 @@
//! [Rust-for-Linux]: https://rust-for-linux.com/

#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(
all(
any(feature = "alloc", feature = "std"),
Expand DownExpand Up@@ -755,7 +755,7 @@ macro_rules! stack_try_pin_init {
///
/// ```rust
/// # use pin_init::*;
/// # use core::{ptr::addr_of_mut, marker::PhantomPinned};
/// # use core::marker::PhantomPinned;
/// #[pin_data]
/// #[derive(Zeroable)]
/// struct Buf {
Expand All@@ -769,7 +769,7 @@ macro_rules! stack_try_pin_init {
/// let init = pin_init!(&this in Buf {
/// buf: [0; 64],
/// // SAFETY: TODO.
/// ptr: unsafe { addr_of_mut!((*this.as_ptr()).buf).cast() },
/// ptr: unsafe { (&raw mut (*this.as_ptr()).buf).cast() },
/// pin: PhantomPinned,
/// });
/// let init = pin_init!(Buf {
Expand Down
1 change: 1 addition & 0 deletions tests/cfgs.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{pin_data, pin_init, PinInit};

Expand Down
1 change: 1 addition & 0 deletions tests/const-generic-default.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
1 change: 1 addition & 0 deletions tests/init-scope.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
#![allow(dead_code)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
15 changes: 5 additions & 10 deletions tests/ring_buf.rs
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(feature = "alloc", feature(allocator_api))]

#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::sync::Arc;
use core::{
convert::Infallible,
marker::PhantomPinned,
mem::MaybeUninit,
pin::Pin,
ptr::{self, addr_of_mut},
};
use core::{convert::Infallible, marker::PhantomPinned, mem::MaybeUninit, pin::Pin, ptr};
use pin_init::*;
#[cfg(feature = "std")]
use std::sync::Arc;
Expand DownExpand Up@@ -50,8 +45,8 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
// SAFETY: The elements of the array can be uninitialized.
buffer <- unsafe { init_from_closure(|_| Ok::<_, Infallible>(())) },
// SAFETY: `this` is a valid pointer.
head: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
head: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
_pin: PhantomPinned,
})
}
Expand DownExpand Up@@ -112,7 +107,7 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
unsafe fn advance(&mut self, ptr: *mut T) -> *mut T {
// SAFETY: ptr's offset from buffer is < SIZE
let ptr = unsafe { ptr.add(1) };
let origin: *mut _ = addr_of_mut!(self.buffer);
let origin: *mut _ = &raw mut (self.buffer);
let origin = origin.cast::<T>();
let offset = unsafe { ptr.offset_from(origin) };
if offset >= SIZE as isize {
Expand Down
2 changes: 2 additions & 0 deletions tests/underscore.rs
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{init, Init};

pub struct Foo {
Expand Down
5 changes: 3 additions & 2 deletions tests/zeroing.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{marker::PhantomPinned, ptr::addr_of_mut};
use std::marker::PhantomPinned;

use pin_init::*;

Expand All@@ -22,7 +23,7 @@ impl Foo {
marks: {
let ptr = this.as_ptr();
// SAFETY: project from the NonNull<Foo> to the buf field
let ptr = unsafe { addr_of_mut!((*ptr).buf) }.cast::<u8>();
let ptr = unsafe { &raw mut (*ptr).buf }.cast::<u8>();
[ptr; MARKS]},
..Zeroable::init_zeroed()
})
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -160,7 +160,6 @@ actually does the initialization in the correct way. Here are the things to look
```rust
use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
use core::{
ptr::addr_of_mut,
marker::PhantomPinned,
cell::UnsafeCell,
pin::Pin,
Expand DownExpand Up@@ -199,7 +198,7 @@ impl RawFoo {
unsafe {
pin_init_from_closure(move |slot: *mut Self| {
// `slot` contains uninit memory, avoid creating a reference.
let foo = addr_of_mut!((*slot).foo);
let foo = &raw mut (*slot).foo;
let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();

// Initialize the `foo`
Expand Down
4 changes: 4 additions & 0 deletions build.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@ use rustc_version::{version, Version};
fn main() {
println!("cargo::rustc-check-cfg=cfg(RUSTC_LINT_REASONS_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_NEW_UNINIT_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_RAW_REF_OP_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(CONFIG_RUSTC_HAS_UNSAFE_PINNED)");
if version().unwrap() >= Version::parse("1.81.0").unwrap()
|| version().unwrap() >= Version::parse("1.81.0-nightly").unwrap()
Expand All@@ -15,4 +16,7 @@ fn main() {
if version().unwrap() >= Version::parse("1.89.0-nightly").unwrap() {
println!("cargo:rustc-cfg=CONFIG_RUSTC_HAS_UNSAFE_PINNED");
}
if version().unwrap() >= Version::parse("1.82.0").unwrap() {
println!("cargo:rustc-cfg=RUSTC_RAW_REF_OP_IS_STABLE");
}
}
2 changes: 2 additions & 0 deletions examples/big_struct_in_place.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT

#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

// Struct with size over 1GiB
Expand Down
1 change: 1 addition & 0 deletions examples/linked_list.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{
cell::Cell,
Expand Down
1 change: 1 addition & 0 deletions examples/mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(clippy::missing_safety_doc)]

use core::{
Expand Down
1 change: 1 addition & 0 deletions examples/pthread_mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

#[cfg(not(windows))]
mod pthread_mtx {
Expand Down
1 change: 1 addition & 0 deletions examples/static_init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(unused_imports)]

use core::{
Expand Down
8 changes: 4 additions & 4 deletions internal/src/init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -284,7 +284,7 @@ fn init_fields(
{
#value_prep
// SAFETY: TODO
unsafe { #write(::core::ptr::addr_of_mut!((*#slot).#ident), #value_ident) };
unsafe { #write(&raw mut (*#slot).#ident, #value_ident) };
}
#accessor
}
Expand All@@ -301,7 +301,7 @@ fn init_fields(
// return when an error/panic occurs.
// - We also use `#data` to require the correct trait (`Init` or `PinInit`)
// for `#ident`.
unsafe { #data.#ident(::core::ptr::addr_of_mut!((*#slot).#ident), #init)? };
unsafe { #data.#ident(&raw mut (*#slot).#ident, #init)? };
},
quote! {
// SAFETY: TODO
Expand All@@ -316,7 +316,7 @@ fn init_fields(
unsafe {
::pin_init::Init::__init(
#init,
::core::ptr::addr_of_mut!((*#slot).#ident),
&raw mut (*#slot).#ident,
)?
};
},
Expand DownExpand Up@@ -361,7 +361,7 @@ fn init_fields(
// SAFETY: We forget the guard later when initialization has succeeded.
let #guard = unsafe {
::pin_init::__internal::DropGuard::new(
::core::ptr::addr_of_mut!((*slot).#ident)
&raw mut (*slot).#ident
)
};
});
Expand Down
8 changes: 4 additions & 4 deletions src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -172,7 +172,6 @@
//! # #![feature(extern_types)]
//! use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
//! use core::{
//! ptr::addr_of_mut,
//! marker::PhantomPinned,
//! cell::UnsafeCell,
//! pin::Pin,
Expand DownExpand Up@@ -211,7 +210,7 @@
//! unsafe {
//! pin_init_from_closure(move |slot: *mut Self| {
//! // `slot` contains uninit memory, avoid creating a reference.
//! let foo = addr_of_mut!((*slot).foo);
//! let foo = &raw mut (*slot).foo;
//! let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();
//!
//! // Initialize the `foo`
Expand DownExpand Up@@ -265,6 +264,7 @@
//! [Rust-for-Linux]: https://rust-for-linux.com/

#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(
all(
any(feature = "alloc", feature = "std"),
Expand DownExpand Up@@ -755,7 +755,7 @@ macro_rules! stack_try_pin_init {
///
/// ```rust
/// # use pin_init::*;
/// # use core::{ptr::addr_of_mut, marker::PhantomPinned};
/// # use core::marker::PhantomPinned;
/// #[pin_data]
/// #[derive(Zeroable)]
/// struct Buf {
Expand All@@ -769,7 +769,7 @@ macro_rules! stack_try_pin_init {
/// let init = pin_init!(&this in Buf {
/// buf: [0; 64],
/// // SAFETY: TODO.
/// ptr: unsafe { addr_of_mut!((*this.as_ptr()).buf).cast() },
/// ptr: unsafe { (&raw mut (*this.as_ptr()).buf).cast() },
/// pin: PhantomPinned,
/// });
/// let init = pin_init!(Buf {
Expand Down
1 change: 1 addition & 0 deletions tests/cfgs.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{pin_data, pin_init, PinInit};

Expand Down
1 change: 1 addition & 0 deletions tests/const-generic-default.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
1 change: 1 addition & 0 deletions tests/init-scope.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
#![allow(dead_code)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
15 changes: 5 additions & 10 deletions tests/ring_buf.rs
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(feature = "alloc", feature(allocator_api))]

#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::sync::Arc;
use core::{
convert::Infallible,
marker::PhantomPinned,
mem::MaybeUninit,
pin::Pin,
ptr::{self, addr_of_mut},
};
use core::{convert::Infallible, marker::PhantomPinned, mem::MaybeUninit, pin::Pin, ptr};
use pin_init::*;
#[cfg(feature = "std")]
use std::sync::Arc;
Expand DownExpand Up@@ -50,8 +45,8 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
// SAFETY: The elements of the array can be uninitialized.
buffer <- unsafe { init_from_closure(|_| Ok::<_, Infallible>(())) },
// SAFETY: `this` is a valid pointer.
head: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
head: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
_pin: PhantomPinned,
})
}
Expand DownExpand Up@@ -112,7 +107,7 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
unsafe fn advance(&mut self, ptr: *mut T) -> *mut T {
// SAFETY: ptr's offset from buffer is < SIZE
let ptr = unsafe { ptr.add(1) };
let origin: *mut _ = addr_of_mut!(self.buffer);
let origin: *mut _ = &raw mut (self.buffer);
let origin = origin.cast::<T>();
let offset = unsafe { ptr.offset_from(origin) };
if offset >= SIZE as isize {
Expand Down
2 changes: 2 additions & 0 deletions tests/underscore.rs
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{init, Init};

pub struct Foo {
Expand Down
5 changes: 3 additions & 2 deletions tests/zeroing.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{marker::PhantomPinned, ptr::addr_of_mut};
use std::marker::PhantomPinned;

use pin_init::*;

Expand All@@ -22,7 +23,7 @@ impl Foo {
marks: {
let ptr = this.as_ptr();
// SAFETY: project from the NonNull<Foo> to the buf field
let ptr = unsafe { addr_of_mut!((*ptr).buf) }.cast::<u8>();
let ptr = unsafe { &raw mut (*ptr).buf }.cast::<u8>();
[ptr; MARKS]},
..Zeroable::init_zeroed()
})
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -160,7 +160,6 @@ actually does the initialization in the correct way. Here are the things to look
```rust
use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
use core::{
ptr::addr_of_mut,
marker::PhantomPinned,
cell::UnsafeCell,
pin::Pin,
Expand DownExpand Up@@ -199,7 +198,7 @@ impl RawFoo {
unsafe {
pin_init_from_closure(move |slot: *mut Self| {
// `slot` contains uninit memory, avoid creating a reference.
let foo = addr_of_mut!((*slot).foo);
let foo = &raw mut (*slot).foo;
let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();

// Initialize the `foo`
Expand Down
4 changes: 4 additions & 0 deletions build.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@ use rustc_version::{version, Version};
fn main() {
println!("cargo::rustc-check-cfg=cfg(RUSTC_LINT_REASONS_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_NEW_UNINIT_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_RAW_REF_OP_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(CONFIG_RUSTC_HAS_UNSAFE_PINNED)");
if version().unwrap() >= Version::parse("1.81.0").unwrap()
|| version().unwrap() >= Version::parse("1.81.0-nightly").unwrap()
Expand All@@ -15,4 +16,7 @@ fn main() {
if version().unwrap() >= Version::parse("1.89.0-nightly").unwrap() {
println!("cargo:rustc-cfg=CONFIG_RUSTC_HAS_UNSAFE_PINNED");
}
if version().unwrap() >= Version::parse("1.82.0").unwrap() {
println!("cargo:rustc-cfg=RUSTC_RAW_REF_OP_IS_STABLE");
}
}
2 changes: 2 additions & 0 deletions examples/big_struct_in_place.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT

#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

// Struct with size over 1GiB
Expand Down
1 change: 1 addition & 0 deletions examples/linked_list.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{
cell::Cell,
Expand Down
1 change: 1 addition & 0 deletions examples/mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(clippy::missing_safety_doc)]

use core::{
Expand Down
1 change: 1 addition & 0 deletions examples/pthread_mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

#[cfg(not(windows))]
mod pthread_mtx {
Expand Down
1 change: 1 addition & 0 deletions examples/static_init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(unused_imports)]

use core::{
Expand Down
8 changes: 4 additions & 4 deletions internal/src/init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -284,7 +284,7 @@ fn init_fields(
{
#value_prep
// SAFETY: TODO
unsafe { #write(::core::ptr::addr_of_mut!((*#slot).#ident), #value_ident) };
unsafe { #write(&raw mut (*#slot).#ident, #value_ident) };
}
#accessor
}
Expand All@@ -301,7 +301,7 @@ fn init_fields(
// return when an error/panic occurs.
// - We also use `#data` to require the correct trait (`Init` or `PinInit`)
// for `#ident`.
unsafe { #data.#ident(::core::ptr::addr_of_mut!((*#slot).#ident), #init)? };
unsafe { #data.#ident(&raw mut (*#slot).#ident, #init)? };
},
quote! {
// SAFETY: TODO
Expand All@@ -316,7 +316,7 @@ fn init_fields(
unsafe {
::pin_init::Init::__init(
#init,
::core::ptr::addr_of_mut!((*#slot).#ident),
&raw mut (*#slot).#ident,
)?
};
},
Expand DownExpand Up@@ -361,7 +361,7 @@ fn init_fields(
// SAFETY: We forget the guard later when initialization has succeeded.
let #guard = unsafe {
::pin_init::__internal::DropGuard::new(
::core::ptr::addr_of_mut!((*slot).#ident)
&raw mut (*slot).#ident
)
};
});
Expand Down
8 changes: 4 additions & 4 deletions src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -172,7 +172,6 @@
//! # #![feature(extern_types)]
//! use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
//! use core::{
//! ptr::addr_of_mut,
//! marker::PhantomPinned,
//! cell::UnsafeCell,
//! pin::Pin,
Expand DownExpand Up@@ -211,7 +210,7 @@
//! unsafe {
//! pin_init_from_closure(move |slot: *mut Self| {
//! // `slot` contains uninit memory, avoid creating a reference.
//! let foo = addr_of_mut!((*slot).foo);
//! let foo = &raw mut (*slot).foo;
//! let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();
//!
//! // Initialize the `foo`
Expand DownExpand Up@@ -265,6 +264,7 @@
//! [Rust-for-Linux]: https://rust-for-linux.com/

#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(
all(
any(feature = "alloc", feature = "std"),
Expand DownExpand Up@@ -755,7 +755,7 @@ macro_rules! stack_try_pin_init {
///
/// ```rust
/// # use pin_init::*;
/// # use core::{ptr::addr_of_mut, marker::PhantomPinned};
/// # use core::marker::PhantomPinned;
/// #[pin_data]
/// #[derive(Zeroable)]
/// struct Buf {
Expand All@@ -769,7 +769,7 @@ macro_rules! stack_try_pin_init {
/// let init = pin_init!(&this in Buf {
/// buf: [0; 64],
/// // SAFETY: TODO.
/// ptr: unsafe { addr_of_mut!((*this.as_ptr()).buf).cast() },
/// ptr: unsafe { (&raw mut (*this.as_ptr()).buf).cast() },
/// pin: PhantomPinned,
/// });
/// let init = pin_init!(Buf {
Expand Down
1 change: 1 addition & 0 deletions tests/cfgs.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{pin_data, pin_init, PinInit};

Expand Down
1 change: 1 addition & 0 deletions tests/const-generic-default.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
1 change: 1 addition & 0 deletions tests/init-scope.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
#![allow(dead_code)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
15 changes: 5 additions & 10 deletions tests/ring_buf.rs
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(feature = "alloc", feature(allocator_api))]

#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::sync::Arc;
use core::{
convert::Infallible,
marker::PhantomPinned,
mem::MaybeUninit,
pin::Pin,
ptr::{self, addr_of_mut},
};
use core::{convert::Infallible, marker::PhantomPinned, mem::MaybeUninit, pin::Pin, ptr};
use pin_init::*;
#[cfg(feature = "std")]
use std::sync::Arc;
Expand DownExpand Up@@ -50,8 +45,8 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
// SAFETY: The elements of the array can be uninitialized.
buffer <- unsafe { init_from_closure(|_| Ok::<_, Infallible>(())) },
// SAFETY: `this` is a valid pointer.
head: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
head: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
_pin: PhantomPinned,
})
}
Expand DownExpand Up@@ -112,7 +107,7 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
unsafe fn advance(&mut self, ptr: *mut T) -> *mut T {
// SAFETY: ptr's offset from buffer is < SIZE
let ptr = unsafe { ptr.add(1) };
let origin: *mut _ = addr_of_mut!(self.buffer);
let origin: *mut _ = &raw mut (self.buffer);
let origin = origin.cast::<T>();
let offset = unsafe { ptr.offset_from(origin) };
if offset >= SIZE as isize {
Expand Down
2 changes: 2 additions & 0 deletions tests/underscore.rs
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{init, Init};

pub struct Foo {
Expand Down
5 changes: 3 additions & 2 deletions tests/zeroing.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{marker::PhantomPinned, ptr::addr_of_mut};
use std::marker::PhantomPinned;

use pin_init::*;

Expand All@@ -22,7 +23,7 @@ impl Foo {
marks: {
let ptr = this.as_ptr();
// SAFETY: project from the NonNull<Foo> to the buf field
let ptr = unsafe { addr_of_mut!((*ptr).buf) }.cast::<u8>();
let ptr = unsafe { &raw mut (*ptr).buf }.cast::<u8>();
[ptr; MARKS]},
..Zeroable::init_zeroed()
})
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -160,7 +160,6 @@ actually does the initialization in the correct way. Here are the things to look
```rust
use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
use core::{
ptr::addr_of_mut,
marker::PhantomPinned,
cell::UnsafeCell,
pin::Pin,
Expand DownExpand Up@@ -199,7 +198,7 @@ impl RawFoo {
unsafe {
pin_init_from_closure(move |slot: *mut Self| {
// `slot` contains uninit memory, avoid creating a reference.
let foo = addr_of_mut!((*slot).foo);
let foo = &raw mut (*slot).foo;
let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();

// Initialize the `foo`
Expand Down
4 changes: 4 additions & 0 deletions build.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@ use rustc_version::{version, Version};
fn main() {
println!("cargo::rustc-check-cfg=cfg(RUSTC_LINT_REASONS_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_NEW_UNINIT_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_RAW_REF_OP_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(CONFIG_RUSTC_HAS_UNSAFE_PINNED)");
if version().unwrap() >= Version::parse("1.81.0").unwrap()
|| version().unwrap() >= Version::parse("1.81.0-nightly").unwrap()
Expand All@@ -15,4 +16,7 @@ fn main() {
if version().unwrap() >= Version::parse("1.89.0-nightly").unwrap() {
println!("cargo:rustc-cfg=CONFIG_RUSTC_HAS_UNSAFE_PINNED");
}
if version().unwrap() >= Version::parse("1.82.0").unwrap() {
println!("cargo:rustc-cfg=RUSTC_RAW_REF_OP_IS_STABLE");
}
}
2 changes: 2 additions & 0 deletions examples/big_struct_in_place.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT

#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

// Struct with size over 1GiB
Expand Down
1 change: 1 addition & 0 deletions examples/linked_list.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{
cell::Cell,
Expand Down
1 change: 1 addition & 0 deletions examples/mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(clippy::missing_safety_doc)]

use core::{
Expand Down
1 change: 1 addition & 0 deletions examples/pthread_mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

#[cfg(not(windows))]
mod pthread_mtx {
Expand Down
1 change: 1 addition & 0 deletions examples/static_init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(unused_imports)]

use core::{
Expand Down
8 changes: 4 additions & 4 deletions internal/src/init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -284,7 +284,7 @@ fn init_fields(
{
#value_prep
// SAFETY: TODO
unsafe { #write(::core::ptr::addr_of_mut!((*#slot).#ident), #value_ident) };
unsafe { #write(&raw mut (*#slot).#ident, #value_ident) };
}
#accessor
}
Expand All@@ -301,7 +301,7 @@ fn init_fields(
// return when an error/panic occurs.
// - We also use `#data` to require the correct trait (`Init` or `PinInit`)
// for `#ident`.
unsafe { #data.#ident(::core::ptr::addr_of_mut!((*#slot).#ident), #init)? };
unsafe { #data.#ident(&raw mut (*#slot).#ident, #init)? };
},
quote! {
// SAFETY: TODO
Expand All@@ -316,7 +316,7 @@ fn init_fields(
unsafe {
::pin_init::Init::__init(
#init,
::core::ptr::addr_of_mut!((*#slot).#ident),
&raw mut (*#slot).#ident,
)?
};
},
Expand DownExpand Up@@ -361,7 +361,7 @@ fn init_fields(
// SAFETY: We forget the guard later when initialization has succeeded.
let #guard = unsafe {
::pin_init::__internal::DropGuard::new(
::core::ptr::addr_of_mut!((*slot).#ident)
&raw mut (*slot).#ident
)
};
});
Expand Down
8 changes: 4 additions & 4 deletions src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -172,7 +172,6 @@
//! # #![feature(extern_types)]
//! use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
//! use core::{
//! ptr::addr_of_mut,
//! marker::PhantomPinned,
//! cell::UnsafeCell,
//! pin::Pin,
Expand DownExpand Up@@ -211,7 +210,7 @@
//! unsafe {
//! pin_init_from_closure(move |slot: *mut Self| {
//! // `slot` contains uninit memory, avoid creating a reference.
//! let foo = addr_of_mut!((*slot).foo);
//! let foo = &raw mut (*slot).foo;
//! let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();
//!
//! // Initialize the `foo`
Expand DownExpand Up@@ -265,6 +264,7 @@
//! [Rust-for-Linux]: https://rust-for-linux.com/

#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(
all(
any(feature = "alloc", feature = "std"),
Expand DownExpand Up@@ -755,7 +755,7 @@ macro_rules! stack_try_pin_init {
///
/// ```rust
/// # use pin_init::*;
/// # use core::{ptr::addr_of_mut, marker::PhantomPinned};
/// # use core::marker::PhantomPinned;
/// #[pin_data]
/// #[derive(Zeroable)]
/// struct Buf {
Expand All@@ -769,7 +769,7 @@ macro_rules! stack_try_pin_init {
/// let init = pin_init!(&this in Buf {
/// buf: [0; 64],
/// // SAFETY: TODO.
/// ptr: unsafe { addr_of_mut!((*this.as_ptr()).buf).cast() },
/// ptr: unsafe { (&raw mut (*this.as_ptr()).buf).cast() },
/// pin: PhantomPinned,
/// });
/// let init = pin_init!(Buf {
Expand Down
1 change: 1 addition & 0 deletions tests/cfgs.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{pin_data, pin_init, PinInit};

Expand Down
1 change: 1 addition & 0 deletions tests/const-generic-default.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
1 change: 1 addition & 0 deletions tests/init-scope.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
#![allow(dead_code)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
15 changes: 5 additions & 10 deletions tests/ring_buf.rs
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(feature = "alloc", feature(allocator_api))]

#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::sync::Arc;
use core::{
convert::Infallible,
marker::PhantomPinned,
mem::MaybeUninit,
pin::Pin,
ptr::{self, addr_of_mut},
};
use core::{convert::Infallible, marker::PhantomPinned, mem::MaybeUninit, pin::Pin, ptr};
use pin_init::*;
#[cfg(feature = "std")]
use std::sync::Arc;
Expand DownExpand Up@@ -50,8 +45,8 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
// SAFETY: The elements of the array can be uninitialized.
buffer <- unsafe { init_from_closure(|_| Ok::<_, Infallible>(())) },
// SAFETY: `this` is a valid pointer.
head: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
head: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
_pin: PhantomPinned,
})
}
Expand DownExpand Up@@ -112,7 +107,7 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
unsafe fn advance(&mut self, ptr: *mut T) -> *mut T {
// SAFETY: ptr's offset from buffer is < SIZE
let ptr = unsafe { ptr.add(1) };
let origin: *mut _ = addr_of_mut!(self.buffer);
let origin: *mut _ = &raw mut (self.buffer);
let origin = origin.cast::<T>();
let offset = unsafe { ptr.offset_from(origin) };
if offset >= SIZE as isize {
Expand Down
2 changes: 2 additions & 0 deletions tests/underscore.rs
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{init, Init};

pub struct Foo {
Expand Down
5 changes: 3 additions & 2 deletions tests/zeroing.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{marker::PhantomPinned, ptr::addr_of_mut};
use std::marker::PhantomPinned;

use pin_init::*;

Expand All@@ -22,7 +23,7 @@ impl Foo {
marks: {
let ptr = this.as_ptr();
// SAFETY: project from the NonNull<Foo> to the buf field
let ptr = unsafe { addr_of_mut!((*ptr).buf) }.cast::<u8>();
let ptr = unsafe { &raw mut (*ptr).buf }.cast::<u8>();
[ptr; MARKS]},
..Zeroable::init_zeroed()
})
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -160,7 +160,6 @@ actually does the initialization in the correct way. Here are the things to look
```rust
use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
use core::{
ptr::addr_of_mut,
marker::PhantomPinned,
cell::UnsafeCell,
pin::Pin,
Expand DownExpand Up@@ -199,7 +198,7 @@ impl RawFoo {
unsafe {
pin_init_from_closure(move |slot: *mut Self| {
// `slot` contains uninit memory, avoid creating a reference.
let foo = addr_of_mut!((*slot).foo);
let foo = &raw mut (*slot).foo;
let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();

// Initialize the `foo`
Expand Down
4 changes: 4 additions & 0 deletions build.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@ use rustc_version::{version, Version};
fn main() {
println!("cargo::rustc-check-cfg=cfg(RUSTC_LINT_REASONS_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_NEW_UNINIT_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_RAW_REF_OP_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(CONFIG_RUSTC_HAS_UNSAFE_PINNED)");
if version().unwrap() >= Version::parse("1.81.0").unwrap()
|| version().unwrap() >= Version::parse("1.81.0-nightly").unwrap()
Expand All@@ -15,4 +16,7 @@ fn main() {
if version().unwrap() >= Version::parse("1.89.0-nightly").unwrap() {
println!("cargo:rustc-cfg=CONFIG_RUSTC_HAS_UNSAFE_PINNED");
}
if version().unwrap() >= Version::parse("1.82.0").unwrap() {
println!("cargo:rustc-cfg=RUSTC_RAW_REF_OP_IS_STABLE");
}
}
2 changes: 2 additions & 0 deletions examples/big_struct_in_place.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT

#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

// Struct with size over 1GiB
Expand Down
1 change: 1 addition & 0 deletions examples/linked_list.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{
cell::Cell,
Expand Down
1 change: 1 addition & 0 deletions examples/mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(clippy::missing_safety_doc)]

use core::{
Expand Down
1 change: 1 addition & 0 deletions examples/pthread_mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

#[cfg(not(windows))]
mod pthread_mtx {
Expand Down
1 change: 1 addition & 0 deletions examples/static_init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(unused_imports)]

use core::{
Expand Down
8 changes: 4 additions & 4 deletions internal/src/init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -284,7 +284,7 @@ fn init_fields(
{
#value_prep
// SAFETY: TODO
unsafe { #write(::core::ptr::addr_of_mut!((*#slot).#ident), #value_ident) };
unsafe { #write(&raw mut (*#slot).#ident, #value_ident) };
}
#accessor
}
Expand All@@ -301,7 +301,7 @@ fn init_fields(
// return when an error/panic occurs.
// - We also use `#data` to require the correct trait (`Init` or `PinInit`)
// for `#ident`.
unsafe { #data.#ident(::core::ptr::addr_of_mut!((*#slot).#ident), #init)? };
unsafe { #data.#ident(&raw mut (*#slot).#ident, #init)? };
},
quote! {
// SAFETY: TODO
Expand All@@ -316,7 +316,7 @@ fn init_fields(
unsafe {
::pin_init::Init::__init(
#init,
::core::ptr::addr_of_mut!((*#slot).#ident),
&raw mut (*#slot).#ident,
)?
};
},
Expand DownExpand Up@@ -361,7 +361,7 @@ fn init_fields(
// SAFETY: We forget the guard later when initialization has succeeded.
let #guard = unsafe {
::pin_init::__internal::DropGuard::new(
::core::ptr::addr_of_mut!((*slot).#ident)
&raw mut (*slot).#ident
)
};
});
Expand Down
8 changes: 4 additions & 4 deletions src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -172,7 +172,6 @@
//! # #![feature(extern_types)]
//! use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
//! use core::{
//! ptr::addr_of_mut,
//! marker::PhantomPinned,
//! cell::UnsafeCell,
//! pin::Pin,
Expand DownExpand Up@@ -211,7 +210,7 @@
//! unsafe {
//! pin_init_from_closure(move |slot: *mut Self| {
//! // `slot` contains uninit memory, avoid creating a reference.
//! let foo = addr_of_mut!((*slot).foo);
//! let foo = &raw mut (*slot).foo;
//! let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();
//!
//! // Initialize the `foo`
Expand DownExpand Up@@ -265,6 +264,7 @@
//! [Rust-for-Linux]: https://rust-for-linux.com/

#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(
all(
any(feature = "alloc", feature = "std"),
Expand DownExpand Up@@ -755,7 +755,7 @@ macro_rules! stack_try_pin_init {
///
/// ```rust
/// # use pin_init::*;
/// # use core::{ptr::addr_of_mut, marker::PhantomPinned};
/// # use core::marker::PhantomPinned;
/// #[pin_data]
/// #[derive(Zeroable)]
/// struct Buf {
Expand All@@ -769,7 +769,7 @@ macro_rules! stack_try_pin_init {
/// let init = pin_init!(&this in Buf {
/// buf: [0; 64],
/// // SAFETY: TODO.
/// ptr: unsafe { addr_of_mut!((*this.as_ptr()).buf).cast() },
/// ptr: unsafe { (&raw mut (*this.as_ptr()).buf).cast() },
/// pin: PhantomPinned,
/// });
/// let init = pin_init!(Buf {
Expand Down
1 change: 1 addition & 0 deletions tests/cfgs.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{pin_data, pin_init, PinInit};

Expand Down
1 change: 1 addition & 0 deletions tests/const-generic-default.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
1 change: 1 addition & 0 deletions tests/init-scope.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
#![allow(dead_code)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
15 changes: 5 additions & 10 deletions tests/ring_buf.rs
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(feature = "alloc", feature(allocator_api))]

#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::sync::Arc;
use core::{
convert::Infallible,
marker::PhantomPinned,
mem::MaybeUninit,
pin::Pin,
ptr::{self, addr_of_mut},
};
use core::{convert::Infallible, marker::PhantomPinned, mem::MaybeUninit, pin::Pin, ptr};
use pin_init::*;
#[cfg(feature = "std")]
use std::sync::Arc;
Expand DownExpand Up@@ -50,8 +45,8 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
// SAFETY: The elements of the array can be uninitialized.
buffer <- unsafe { init_from_closure(|_| Ok::<_, Infallible>(())) },
// SAFETY: `this` is a valid pointer.
head: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
head: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
_pin: PhantomPinned,
})
}
Expand DownExpand Up@@ -112,7 +107,7 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
unsafe fn advance(&mut self, ptr: *mut T) -> *mut T {
// SAFETY: ptr's offset from buffer is < SIZE
let ptr = unsafe { ptr.add(1) };
let origin: *mut _ = addr_of_mut!(self.buffer);
let origin: *mut _ = &raw mut (self.buffer);
let origin = origin.cast::<T>();
let offset = unsafe { ptr.offset_from(origin) };
if offset >= SIZE as isize {
Expand Down
2 changes: 2 additions & 0 deletions tests/underscore.rs
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{init, Init};

pub struct Foo {
Expand Down
5 changes: 3 additions & 2 deletions tests/zeroing.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{marker::PhantomPinned, ptr::addr_of_mut};
use std::marker::PhantomPinned;

use pin_init::*;

Expand All@@ -22,7 +23,7 @@ impl Foo {
marks: {
let ptr = this.as_ptr();
// SAFETY: project from the NonNull<Foo> to the buf field
let ptr = unsafe { addr_of_mut!((*ptr).buf) }.cast::<u8>();
let ptr = unsafe { &raw mut (*ptr).buf }.cast::<u8>();
[ptr; MARKS]},
..Zeroable::init_zeroed()
})
Expand Down
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions README.md
Original file line numberDiff line numberDiff line change
Expand Up@@ -160,7 +160,6 @@ actually does the initialization in the correct way. Here are the things to look
```rust
use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
use core::{
ptr::addr_of_mut,
marker::PhantomPinned,
cell::UnsafeCell,
pin::Pin,
Expand DownExpand Up@@ -199,7 +198,7 @@ impl RawFoo {
unsafe {
pin_init_from_closure(move |slot: *mut Self| {
// `slot` contains uninit memory, avoid creating a reference.
let foo = addr_of_mut!((*slot).foo);
let foo = &raw mut (*slot).foo;
let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();

// Initialize the `foo`
Expand Down
4 changes: 4 additions & 0 deletions build.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@ use rustc_version::{version, Version};
fn main() {
println!("cargo::rustc-check-cfg=cfg(RUSTC_LINT_REASONS_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_NEW_UNINIT_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(RUSTC_RAW_REF_OP_IS_STABLE)");
println!("cargo::rustc-check-cfg=cfg(CONFIG_RUSTC_HAS_UNSAFE_PINNED)");
if version().unwrap() >= Version::parse("1.81.0").unwrap()
|| version().unwrap() >= Version::parse("1.81.0-nightly").unwrap()
Expand All@@ -15,4 +16,7 @@ fn main() {
if version().unwrap() >= Version::parse("1.89.0-nightly").unwrap() {
println!("cargo:rustc-cfg=CONFIG_RUSTC_HAS_UNSAFE_PINNED");
}
if version().unwrap() >= Version::parse("1.82.0").unwrap() {
println!("cargo:rustc-cfg=RUSTC_RAW_REF_OP_IS_STABLE");
}
}
2 changes: 2 additions & 0 deletions examples/big_struct_in_place.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
// SPDX-License-Identifier: Apache-2.0 OR MIT

#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

// Struct with size over 1GiB
Expand Down
1 change: 1 addition & 0 deletions examples/linked_list.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{
cell::Cell,
Expand Down
1 change: 1 addition & 0 deletions examples/mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(clippy::missing_safety_doc)]

use core::{
Expand Down
1 change: 1 addition & 0 deletions examples/pthread_mutex.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -4,6 +4,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

#[cfg(not(windows))]
mod pthread_mtx {
Expand Down
1 change: 1 addition & 0 deletions examples/static_init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -3,6 +3,7 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(feature = "alloc", feature(allocator_api))]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![allow(unused_imports)]

use core::{
Expand Down
8 changes: 4 additions & 4 deletions internal/src/init.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -284,7 +284,7 @@ fn init_fields(
{
#value_prep
// SAFETY: TODO
unsafe { #write(::core::ptr::addr_of_mut!((*#slot).#ident), #value_ident) };
unsafe { #write(&raw mut (*#slot).#ident, #value_ident) };
}
#accessor
}
Expand All@@ -301,7 +301,7 @@ fn init_fields(
// return when an error/panic occurs.
// - We also use `#data` to require the correct trait (`Init` or `PinInit`)
// for `#ident`.
unsafe { #data.#ident(::core::ptr::addr_of_mut!((*#slot).#ident), #init)? };
unsafe { #data.#ident(&raw mut (*#slot).#ident, #init)? };
},
quote! {
// SAFETY: TODO
Expand All@@ -316,7 +316,7 @@ fn init_fields(
unsafe {
::pin_init::Init::__init(
#init,
::core::ptr::addr_of_mut!((*#slot).#ident),
&raw mut (*#slot).#ident,
)?
};
},
Expand DownExpand Up@@ -361,7 +361,7 @@ fn init_fields(
// SAFETY: We forget the guard later when initialization has succeeded.
let #guard = unsafe {
::pin_init::__internal::DropGuard::new(
::core::ptr::addr_of_mut!((*slot).#ident)
&raw mut (*slot).#ident
)
};
});
Expand Down
8 changes: 4 additions & 4 deletions src/lib.rs
Original file line numberDiff line numberDiff line change
Expand Up@@ -172,7 +172,6 @@
//! # #![feature(extern_types)]
//! use pin_init::{pin_data, pinned_drop, PinInit, PinnedDrop, pin_init_from_closure};
//! use core::{
//! ptr::addr_of_mut,
//! marker::PhantomPinned,
//! cell::UnsafeCell,
//! pin::Pin,
Expand DownExpand Up@@ -211,7 +210,7 @@
//! unsafe {
//! pin_init_from_closure(move |slot: *mut Self| {
//! // `slot` contains uninit memory, avoid creating a reference.
//! let foo = addr_of_mut!((*slot).foo);
//! let foo = &raw mut (*slot).foo;
//! let foo = UnsafeCell::raw_get(foo).cast::<bindings::foo>();
//!
//! // Initialize the `foo`
Expand DownExpand Up@@ -265,6 +264,7 @@
//! [Rust-for-Linux]: https://rust-for-linux.com/

#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(
all(
any(feature = "alloc", feature = "std"),
Expand DownExpand Up@@ -755,7 +755,7 @@ macro_rules! stack_try_pin_init {
///
/// ```rust
/// # use pin_init::*;
/// # use core::{ptr::addr_of_mut, marker::PhantomPinned};
/// # use core::marker::PhantomPinned;
/// #[pin_data]
/// #[derive(Zeroable)]
/// struct Buf {
Expand All@@ -769,7 +769,7 @@ macro_rules! stack_try_pin_init {
/// let init = pin_init!(&this in Buf {
/// buf: [0; 64],
/// // SAFETY: TODO.
/// ptr: unsafe { addr_of_mut!((*this.as_ptr()).buf).cast() },
/// ptr: unsafe { (&raw mut (*this.as_ptr()).buf).cast() },
/// pin: PhantomPinned,
/// });
/// let init = pin_init!(Buf {
Expand Down
1 change: 1 addition & 0 deletions tests/cfgs.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{pin_data, pin_init, PinInit};

Expand Down
1 change: 1 addition & 0 deletions tests/const-generic-default.rs
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
1 change: 1 addition & 0 deletions tests/init-scope.rs
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
#![allow(dead_code)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::*;

Expand Down
15 changes: 5 additions & 10 deletions tests/ring_buf.rs
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
#![allow(clippy::undocumented_unsafe_blocks)]
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]
#![cfg_attr(feature = "alloc", feature(allocator_api))]

#[cfg(all(not(feature = "std"), feature = "alloc"))]
use alloc::sync::Arc;
use core::{
convert::Infallible,
marker::PhantomPinned,
mem::MaybeUninit,
pin::Pin,
ptr::{self, addr_of_mut},
};
use core::{convert::Infallible, marker::PhantomPinned, mem::MaybeUninit, pin::Pin, ptr};
use pin_init::*;
#[cfg(feature = "std")]
use std::sync::Arc;
Expand DownExpand Up@@ -50,8 +45,8 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
// SAFETY: The elements of the array can be uninitialized.
buffer <- unsafe { init_from_closure(|_| Ok::<_, Infallible>(())) },
// SAFETY: `this` is a valid pointer.
head: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { addr_of_mut!((*this.as_ptr()).buffer).cast::<T>() },
head: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
tail: unsafe { (&raw mut (*this.as_ptr()).buffer).cast::<T>() },
_pin: PhantomPinned,
})
}
Expand DownExpand Up@@ -112,7 +107,7 @@ impl<T, const SIZE: usize> RingBuffer<T, SIZE> {
unsafe fn advance(&mut self, ptr: *mut T) -> *mut T {
// SAFETY: ptr's offset from buffer is < SIZE
let ptr = unsafe { ptr.add(1) };
let origin: *mut _ = addr_of_mut!(self.buffer);
let origin: *mut _ = &raw mut (self.buffer);
let origin = origin.cast::<T>();
let offset = unsafe { ptr.offset_from(origin) };
if offset >= SIZE as isize {
Expand Down
2 changes: 2 additions & 0 deletions tests/underscore.rs
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use pin_init::{init, Init};

pub struct Foo {
Expand Down
5 changes: 3 additions & 2 deletions tests/zeroing.rs
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
#![cfg_attr(not(RUSTC_LINT_REASONS_IS_STABLE), feature(lint_reasons))]
#![cfg_attr(not(RUSTC_RAW_REF_OP_IS_STABLE), feature(raw_ref_op))]

use core::{marker::PhantomPinned, ptr::addr_of_mut};
use std::marker::PhantomPinned;

use pin_init::*;

Expand All@@ -22,7 +23,7 @@ impl Foo {
marks: {
let ptr = this.as_ptr();
// SAFETY: project from the NonNull<Foo> to the buf field
let ptr = unsafe { addr_of_mut!((*ptr).buf) }.cast::<u8>();
let ptr = unsafe { &raw mut (*ptr).buf }.cast::<u8>();
[ptr; MARKS]},
..Zeroable::init_zeroed()
})
Expand Down
Loading