mirror of
https://github.com/denoland/rusty_v8.git
synced 2025-03-10 05:56:52 -04:00
43 lines
1.1 KiB
Rust
43 lines
1.1 KiB
Rust
![]() |
use std::marker::PhantomData;
|
||
|
use std::mem::size_of;
|
||
|
|
||
|
pub type Opaque = [usize; 0];
|
||
|
|
||
|
#[derive(Copy, Clone, Debug)]
|
||
|
pub struct RustVTable<DynT>(pub *const Opaque, pub PhantomData<DynT>);
|
||
|
|
||
|
#[derive(Debug)]
|
||
|
pub struct FieldOffset<F>(usize, PhantomData<F>);
|
||
|
|
||
|
unsafe impl<F> Send for FieldOffset<F> where F: Send {}
|
||
|
unsafe impl<F> Sync for FieldOffset<F> where F: Sync {}
|
||
|
impl<F> Copy for FieldOffset<F> {}
|
||
|
|
||
|
impl<F> Clone for FieldOffset<F> {
|
||
|
fn clone(&self) -> Self {
|
||
|
Self(self.0, self.1)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl<F> FieldOffset<F> {
|
||
|
pub fn from_ptrs<E>(embedder_ptr: *const E, field_ptr: *const F) -> Self {
|
||
|
let embedder_addr = embedder_ptr as usize;
|
||
|
let field_addr = field_ptr as usize;
|
||
|
assert!(field_addr >= embedder_addr);
|
||
|
assert!((field_addr + size_of::<F>()) <= (embedder_addr + size_of::<E>()));
|
||
|
Self(embedder_addr - field_addr, PhantomData)
|
||
|
}
|
||
|
|
||
|
pub unsafe fn to_embedder<E>(self, field: &F) -> &E {
|
||
|
(((field as *const _ as usize) - self.0) as *const E)
|
||
|
.as_ref()
|
||
|
.unwrap()
|
||
|
}
|
||
|
|
||
|
pub unsafe fn to_embedder_mut<E>(self, field: &mut F) -> &mut E {
|
||
|
(((field as *mut _ as usize) - self.0) as *mut E)
|
||
|
.as_mut()
|
||
|
.unwrap()
|
||
|
}
|
||
|
}
|