fix pointer handling

pointers have to remain pointers, to carry provenance
This commit is contained in:
numzero 2026-09-23 20:50:31 +03:00
parent 830adfbc10
commit 98eca207b1

View File

@ -5,15 +5,10 @@
inherent_associated_types inherent_associated_types
)] )]
use std::{ use std::{marker::PhantomData, ops, ptr};
marker::PhantomData,
mem::MaybeUninit,
ops,
ptr::{self, addr_of_mut},
};
#[repr(C, align(16))] #[repr(C, align(16))]
struct Data([u8; 48]); struct Data([*mut u8; 6]);
pub struct Dyn<'a, Trait: ?Sized + 'a> { pub struct Dyn<'a, Trait: ?Sized + 'a> {
_phantom1: PhantomData<Trait>, _phantom1: PhantomData<Trait>,
@ -61,13 +56,15 @@ where
{ {
fn from(value: Iter) -> Self { fn from(value: Iter) -> Self {
let (_, meta) = (&value as &Self::Target as *const Self::Target).to_raw_parts(); let (_, meta) = (&value as &Self::Target as *const Self::Target).to_raw_parts();
unsafe { let mut ret = Self {
let mut ret = MaybeUninit::<Self>::zeroed(); _phantom1: PhantomData,
let pret = ret.as_mut_ptr(); _phantom2: PhantomData,
(addr_of_mut!((*pret).data) as *mut Iter).write(value); meta,
addr_of_mut!((*pret).meta).write(meta); data: Data([std::ptr::null_mut(); _]),
ret.assume_init() };
} let pdata = ret.data.0.as_mut_ptr();
unsafe { (pdata as *mut Iter).write(value) };
ret
} }
} }
@ -94,4 +91,10 @@ mod tests {
let mut it: Dyn<dyn Iterator<Item = u8>> = Small([42; 48]).into(); let mut it: Dyn<dyn Iterator<Item = u8>> = Small([42; 48]).into();
assert_eq!(it.next(), Some(42)); assert_eq!(it.next(), Some(42));
} }
#[test]
fn vec() {
let mut it: Dyn<dyn Iterator<Item = u8>> = vec![42; 48].into_iter().into();
assert_eq!(it.next(), Some(42));
}
} }