Skip to content

Commit 539b87a

Browse files
committed
feat: migrating to a new pattern to improve compiler performance and user dx
1 parent 238a792 commit 539b87a

File tree

18 files changed

+374
-462
lines changed

18 files changed

+374
-462
lines changed

examples/dyn_memory/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use raw_struct::{
99
Copy,
1010
CopyMemory,
1111
FromMemoryView,
12-
SizedViewable,
12+
ViewableSized,
1313
};
1414

1515
fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
@@ -18,7 +18,7 @@ fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
1818

1919
println!(
2020
"Memory size: 0x{:X}",
21-
<Container::<u64> as SizedViewable>::memory_size()
21+
<Container::<u64> as ViewableSized>::memory_size()
2222
);
2323
println!("Vat a = 0x{:X}", object.var_a()?);
2424
println!("Inner = 0x{:X}", object.inner()?);

examples/minimal/src/main.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use raw_struct::{
99
Copy,
1010
FromMemoryView,
1111
Reference,
12-
SizedViewable,
12+
ViewableSized,
1313
};
1414

1515
fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
@@ -21,7 +21,7 @@ fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
2121

2222
println!(
2323
"MyStruct size = 0x{:X}",
24-
<MyStruct as SizedViewable>::memory_size()
24+
<MyStruct as ViewableSized>::memory_size()
2525
);
2626

2727
{

raw_struct/src/builtins/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
mod array;
2-
pub use array::{
3-
Array,
4-
SizedArray,
5-
};
1+
// mod array;
2+
// pub use array::{
3+
// Array,
4+
// SizedArray,
5+
// };
66

7-
mod ptr;
8-
pub use ptr::Ptr64;
7+
// mod ptr;
8+
// pub use ptr::Ptr64;

raw_struct/src/copy.rs

Lines changed: 57 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,19 @@ use core::{
44
self,
55
MaybeUninit,
66
},
7-
ops::Deref,
7+
ops::{
8+
Deref,
9+
DerefMut,
10+
},
811
slice,
912
};
1013

1114
use crate::{
12-
CopyConstructable,
15+
memory::FromMemoryView,
1316
MemoryView,
1417
OutOfBoundsViolation,
1518
Reference,
16-
SizedViewable,
17-
ViewableImplementation,
19+
ViewableSized,
1820
};
1921

2022
#[derive(Clone, Copy)]
@@ -32,15 +34,15 @@ impl<M: marker::Copy> MemoryView for CopyMemory<M> {
3234
}
3335

3436
/// A Copy represents an owned copy of the struct binary contents
35-
#[repr(transparent)]
36-
pub struct Copy<T: SizedViewable> {
37-
inner: T::Implementation<CopyMemory<T::Memory>>,
37+
#[derive(Clone)]
38+
pub struct Copy<V: ViewableSized> {
39+
inner: Reference<V, CopyMemory<V::Memory>>,
3840
}
3941

40-
impl<T: SizedViewable> Copy<T> {
41-
pub fn new(inner: T::Memory) -> Self {
42+
impl<V: ViewableSized> Copy<V> {
43+
pub fn new(inner: V::Memory) -> Self {
4244
Self {
43-
inner: T::from_memory(CopyMemory(inner)),
45+
inner: Reference::new(CopyMemory(inner), 0x00),
4446
}
4547
}
4648

@@ -55,52 +57,56 @@ impl<T: SizedViewable> Copy<T> {
5557
memory: &M,
5658
offset: u64,
5759
) -> Result<Self, M::AccessError> {
58-
let mut copy_memory = MaybeUninit::<T::Memory>::uninit();
59-
memory.read_memory(offset, unsafe {
60-
slice::from_raw_parts_mut(
61-
copy_memory.as_mut_ptr() as *mut u8,
62-
mem::size_of::<T::Memory>(),
63-
)
64-
})?;
65-
66-
Ok(Self::new(unsafe { copy_memory.assume_init() }))
67-
}
68-
69-
pub fn as_reference(&self) -> Reference<T, &CopyMemory<T::Memory>> {
70-
Reference::new(self.inner.memory_view(), 0x00)
71-
}
72-
}
73-
74-
impl<T> Clone for Copy<T>
75-
where
76-
T: SizedViewable,
77-
T::Implementation<CopyMemory<T::Memory>>: Clone,
78-
{
79-
fn clone(&self) -> Self {
80-
Self {
81-
inner: self.inner.clone(),
82-
}
60+
Ok(Self::new(
61+
V::Memory::read_object(memory, offset).map_err(|err| err.into_access_error())?,
62+
))
8363
}
8464
}
8565

86-
impl<T> marker::Copy for Copy<T>
87-
where
88-
T: SizedViewable,
89-
T::Implementation<CopyMemory<T::Memory>>: marker::Copy,
90-
{
91-
}
92-
93-
impl<T> CopyConstructable for Copy<T>
94-
where
95-
T: SizedViewable,
96-
T::Implementation<CopyMemory<T::Memory>>: marker::Copy,
97-
{
98-
}
99-
100-
impl<T: SizedViewable> Deref for Copy<T> {
101-
type Target = T::Implementation<CopyMemory<T::Memory>>;
66+
impl<V: ViewableSized> Deref for Copy<V> {
67+
type Target = Reference<V, CopyMemory<V::Memory>>;
10268

10369
fn deref(&self) -> &Self::Target {
10470
&self.inner
10571
}
10672
}
73+
74+
impl<V: ViewableSized> DerefMut for Copy<V> {
75+
fn deref_mut(&mut self) -> &mut Self::Target {
76+
&mut self.inner
77+
}
78+
}
79+
80+
// impl<T> Clone for Copy<T>
81+
// where
82+
// T: SizedViewable,
83+
// T::Implementation<CopyMemory<T::Memory>>: Clone,
84+
// {
85+
// fn clone(&self) -> Self {
86+
// Self {
87+
// inner: self.inner.clone(),
88+
// }
89+
// }
90+
// }
91+
92+
// impl<T> marker::Copy for Copy<T>
93+
// where
94+
// T: SizedViewable,
95+
// T::Implementation<CopyMemory<T::Memory>>: marker::Copy,
96+
// {
97+
// }
98+
99+
// impl<T> CopyConstructable for Copy<T>
100+
// where
101+
// T: SizedViewable,
102+
// T::Implementation<CopyMemory<T::Memory>>: marker::Copy,
103+
// {
104+
// }
105+
106+
// impl<T: SizedViewable> Deref for Copy<T> {
107+
// type Target = T::Implementation<CopyMemory<T::Memory>>;
108+
109+
// fn deref(&self) -> &Self::Target {
110+
// &self.inner
111+
// }
112+
// }

raw_struct/src/error.rs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
use core::fmt::{
2-
self,
3-
Debug,
4-
Display,
1+
use core::{
2+
convert::Infallible,
3+
fmt::{
4+
self,
5+
Debug,
6+
Display,
7+
},
58
};
69

710
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
@@ -30,6 +33,24 @@ pub enum MemoryDecodeError<A, V> {
3033
ValueDecode(V),
3134
}
3235

36+
impl<A> MemoryDecodeError<A, Infallible> {
37+
pub fn into_access_error(self) -> A {
38+
match self {
39+
Self::MemoryAccess(inner) => inner,
40+
Self::ValueDecode(_) => unreachable!(),
41+
}
42+
}
43+
}
44+
45+
impl<V> MemoryDecodeError<Infallible, V> {
46+
pub fn into_decode_error(self) -> V {
47+
match self {
48+
Self::MemoryAccess(_) => unreachable!(),
49+
Self::ValueDecode(inner) => inner,
50+
}
51+
}
52+
}
53+
3354
impl<A: Display, V: Display> fmt::Display for MemoryDecodeError<A, V> {
3455
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
3556
match self {

raw_struct/src/lib.rs

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
#![cfg_attr(not(feature = "std"), no_std)]
2+
#![cfg_attr(rustfmt, rustfmt_skip)]
23

34
#[cfg(feature = "alloc")]
45
extern crate alloc;
56

6-
pub mod builtins;
7-
87
mod error;
98
pub use error::{
109
MemoryDecodeError,
@@ -18,23 +17,24 @@ pub use memory::{
1817
MemoryView,
1918
};
2019

21-
mod view;
22-
pub use view::{
23-
SizedViewable,
24-
Viewable,
25-
ViewableImplementation,
26-
};
27-
2820
mod reference;
29-
pub use reference::{
30-
Reference,
31-
ReferenceMemory,
32-
};
21+
pub use reference::Reference;
3322

3423
mod copy;
35-
3624
pub use copy::{
3725
Copy,
3826
CopyMemory,
3927
};
40-
pub use raw_struct_derive::raw_struct;
28+
29+
mod view;
30+
pub use view::{
31+
Viewable,
32+
ViewableExtends,
33+
ViewableField,
34+
ViewableSized,
35+
};
36+
37+
pub mod builtins;
38+
39+
// Re-exports
40+
pub use raw_struct_derive::raw_struct;

0 commit comments

Comments
 (0)