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
)]
use std::{
marker::PhantomData,
mem::MaybeUninit,
ops,
ptr::{self, addr_of_mut},
};
use std::{marker::PhantomData, ops, ptr};
#[repr(C, align(16))]
struct Data([u8; 48]);
struct Data([*mut u8; 6]);
pub struct Dyn<'a, Trait: ?Sized + 'a> {
_phantom1: PhantomData<Trait>,
@ -61,13 +56,15 @@ where
{
fn from(value: Iter) -> Self {
let (_, meta) = (&value as &Self::Target as *const Self::Target).to_raw_parts();
unsafe {
let mut ret = MaybeUninit::<Self>::zeroed();
let pret = ret.as_mut_ptr();
(addr_of_mut!((*pret).data) as *mut Iter).write(value);
addr_of_mut!((*pret).meta).write(meta);
ret.assume_init()
}
let mut ret = Self {
_phantom1: PhantomData,
_phantom2: PhantomData,
meta,
data: Data([std::ptr::null_mut(); _]),
};
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();
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));
}
}