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
|
||||
)]
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user