we now validate Copy structs

This commit is contained in:
Pat Hickey
2020-01-28 16:34:34 -08:00
parent 62e00434b0
commit 35d9373976
3 changed files with 20 additions and 5 deletions

View File

@@ -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 {
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 name = names.struct_member(&m.name);
let type_ = names.type_ref(&m.tref);
quote!(pub #name: #type_)
});
let size = s.mem_size_align().size as u32;
let align = s.mem_size_align().align as u32;
let member_valids = s.member_layout().into_iter().map(|ml| {
let type_ = names.type_ref(&ml.member.tref);
let offset = ml.offset as u32;
quote!( #type_::validate(&ptr.cast(#offset)?)?; )
});
quote! {
#[repr(C)]
@@ -178,8 +184,9 @@ fn define_copy_struct(names: &Names, name: &witx::Id, s: &witx::StructDatatype)
fn name() -> String {
stringify!(#ident).to_owned()
}
fn validate(_ptr: &::memory::GuestPtr<#ident>) -> Result<(), ::memory::GuestError> {
Ok(()) // FIXME
fn validate(ptr: &::memory::GuestPtr<#ident>) -> Result<(), ::memory::GuestError> {
#(#member_valids)*
Ok(())
}
}
impl ::memory::GuestTypeCopy for #ident {}

View File

@@ -67,6 +67,15 @@ impl<'a, T: GuestType> GuestPtr<'a, T> {
pub fn as_raw(&self) -> *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> {

View File

@@ -34,7 +34,6 @@
(param $an_int u32)
(result $error $errno)
(result $doubled_it f32))
(@interface func (export "sum_of_pair")
(param $an_pair $pair_ints)
(result $error $errno)