fix pointer handling
pointers have to remain pointers, to carry provenance
This commit is contained in:
parent
830adfbc10
commit
98eca207b1
31
src/lib.rs
31
src/lib.rs
|
|
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user