Skip to content

Commit c194303

Browse files
committed
[WIP] Experimenting with invariant conversion
1 parent b6e9e46 commit c194303

File tree

2 files changed

+39
-9
lines changed

2 files changed

+39
-9
lines changed

src/macro_util.rs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,10 @@ pub unsafe fn transmute_mut<'dst, 'src: 'dst, Src: 'src, Dst: 'dst>(
436436
#[inline]
437437
fn try_transmute_ptr<Src, Dst, I, R>(
438438
mut src: Ptr<'_, Src, I>,
439-
) -> Result<Ptr<'_, Dst, (I::Aliasing, invariant::Any, invariant::Valid)>, Ptr<'_, Src, I>>
439+
) -> Result<
440+
Ptr<'_, Dst, (I::Aliasing, invariant::Any, invariant::Valid)>,
441+
ValidityError<Ptr<'_, Src, I>, Dst>,
442+
>
440443
where
441444
Src: IntoBytes,
442445
Dst: TryFromBytes + AliasingSafe<Src, I::Aliasing, R>,
@@ -463,14 +466,28 @@ where
463466
// initialized bytes.
464467
let mut c_ptr = unsafe { c_ptr.assume_initialized() };
465468

466-
if Dst::is_bit_valid(c_ptr) {
467-
// SAFETY: TODO
468-
let ptr = unsafe { c_ptr.assume_valid() };
469+
c_ptr.try_into_valid().map_err(|err| {
470+
err.map_src(|src| {
471+
// SAFETY: TODO
472+
let src = unsafe { src.cast_unsized(|p| p as *mut Src) };
473+
// SAFETY: `src` is the same pointer that was passed to this method,
474+
// which had validity `invariant::Valid`. `try_into_valid` promises not
475+
// to modify its receiver's referent, so `src`'s referent is still a
476+
// valid `Src`.
477+
let src = unsafe { src.assume_valid() };
478+
479+
src.foobar()
480+
})
481+
})
469482

470-
Ok(ptr)
471-
} else {
472-
Err(src)
473-
}
483+
// if Dst::is_bit_valid(c_ptr.reborrow()) {
484+
// // SAFETY: TODO
485+
// let ptr = unsafe { c_ptr.assume_valid() };
486+
487+
// Ok(ptr)
488+
// } else {
489+
// Err(src)
490+
// }
474491
}
475492

476493
/// Attempts to transmute `Src` into `Dst`.

src/pointer/ptr.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ macro_rules! define_system {
159159
)]
160160
/// This trait is implemented for such tuples, and can be used to
161161
/// project out the components of these tuples via its associated types.
162-
pub trait $system: sealed::Sealed {
162+
pub trait $system: sealed::Sealed + From<($(Self::$set),*)> {
163163
$(
164164
$(#[$set_attr])*
165165
type $set: $set;
@@ -637,6 +637,19 @@ mod _transitions {
637637
T: 'a + ?Sized,
638638
I: Invariants,
639639
{
640+
pub(crate) fn foobar<II>(self) -> Ptr<'a, T, II>
641+
where
642+
II: Invariants<
643+
Aliasing = I::Aliasing,
644+
Alignment = I::Alignment,
645+
Validity = I::Validity,
646+
>,
647+
{
648+
// SAFETY: All of the invariants in `II` are the same as those in
649+
// `I`.
650+
unsafe { self.assume_invariants() }
651+
}
652+
640653
/// Returns a `Ptr` with [`Exclusive`] aliasing if `self` already has
641654
/// `Exclusive` aliasing.
642655
///

0 commit comments

Comments
 (0)