diff --git a/crates/generate/src/types.rs b/crates/generate/src/types.rs index c5185a51a8..13338769e8 100644 --- a/crates/generate/src/types.rs +++ b/crates/generate/src/types.rs @@ -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 {} diff --git a/crates/memory/src/memory.rs b/crates/memory/src/memory.rs index c24a272d6c..d33f4d707c 100644 --- a/crates/memory/src/memory.rs +++ b/crates/memory/src/memory.rs @@ -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, GuestError> { + self.mem + .ptr(self.region.start + (elements * self.region.len as i32) as u32) + } + + pub fn cast(&self, offset: u32) -> Result, GuestError> { + self.mem.ptr(self.region.start + offset) + } } impl<'a, T: GuestTypeCopy> GuestPtr<'a, T> { diff --git a/test.witx b/test.witx index af5af5441f..87e11396d7 100644 --- a/test.witx +++ b/test.witx @@ -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)