we now validate Copy structs
This commit is contained in:
@@ -153,13 +153,19 @@ pub fn struct_is_copy(s: &witx::StructDatatype) -> bool {
|
|||||||
|
|
||||||
fn define_copy_struct(names: &Names, name: &witx::Id, s: &witx::StructDatatype) -> TokenStream {
|
fn define_copy_struct(names: &Names, name: &witx::Id, s: &witx::StructDatatype) -> TokenStream {
|
||||||
let ident = names.type_(name);
|
let ident = names.type_(name);
|
||||||
|
let size = s.mem_size_align().size as u32;
|
||||||
|
let align = s.mem_size_align().align as u32;
|
||||||
|
|
||||||
let member_decls = s.members.iter().map(|m| {
|
let member_decls = s.members.iter().map(|m| {
|
||||||
let name = names.struct_member(&m.name);
|
let name = names.struct_member(&m.name);
|
||||||
let type_ = names.type_ref(&m.tref);
|
let type_ = names.type_ref(&m.tref);
|
||||||
quote!(pub #name: #type_)
|
quote!(pub #name: #type_)
|
||||||
});
|
});
|
||||||
let size = s.mem_size_align().size as u32;
|
let member_valids = s.member_layout().into_iter().map(|ml| {
|
||||||
let align = s.mem_size_align().align as u32;
|
let type_ = names.type_ref(&ml.member.tref);
|
||||||
|
let offset = ml.offset as u32;
|
||||||
|
quote!( #type_::validate(&ptr.cast(#offset)?)?; )
|
||||||
|
});
|
||||||
|
|
||||||
quote! {
|
quote! {
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
@@ -178,8 +184,9 @@ fn define_copy_struct(names: &Names, name: &witx::Id, s: &witx::StructDatatype)
|
|||||||
fn name() -> String {
|
fn name() -> String {
|
||||||
stringify!(#ident).to_owned()
|
stringify!(#ident).to_owned()
|
||||||
}
|
}
|
||||||
fn validate(_ptr: &::memory::GuestPtr<#ident>) -> Result<(), ::memory::GuestError> {
|
fn validate(ptr: &::memory::GuestPtr<#ident>) -> Result<(), ::memory::GuestError> {
|
||||||
Ok(()) // FIXME
|
#(#member_valids)*
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl ::memory::GuestTypeCopy for #ident {}
|
impl ::memory::GuestTypeCopy for #ident {}
|
||||||
|
|||||||
@@ -67,6 +67,15 @@ impl<'a, T: GuestType> GuestPtr<'a, T> {
|
|||||||
pub fn as_raw(&self) -> *const u8 {
|
pub fn as_raw(&self) -> *const u8 {
|
||||||
(self.mem.ptr as usize + self.region.start as usize) as *const u8
|
(self.mem.ptr as usize + self.region.start as usize) as *const u8
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn elem(&self, elements: i32) -> Result<GuestPtr<'a, T>, GuestError> {
|
||||||
|
self.mem
|
||||||
|
.ptr(self.region.start + (elements * self.region.len as i32) as u32)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn cast<TT: GuestType>(&self, offset: u32) -> Result<GuestPtr<'a, TT>, GuestError> {
|
||||||
|
self.mem.ptr(self.region.start + offset)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, T: GuestTypeCopy> GuestPtr<'a, T> {
|
impl<'a, T: GuestTypeCopy> GuestPtr<'a, T> {
|
||||||
|
|||||||
@@ -34,7 +34,6 @@
|
|||||||
(param $an_int u32)
|
(param $an_int u32)
|
||||||
(result $error $errno)
|
(result $error $errno)
|
||||||
(result $doubled_it f32))
|
(result $doubled_it f32))
|
||||||
|
|
||||||
(@interface func (export "sum_of_pair")
|
(@interface func (export "sum_of_pair")
|
||||||
(param $an_pair $pair_ints)
|
(param $an_pair $pair_ints)
|
||||||
(result $error $errno)
|
(result $error $errno)
|
||||||
|
|||||||
Reference in New Issue
Block a user